Study_note
[kubernetes] Headless service 본문
Headless service를 설명하기 전에 우선 Stateless와 Stateful의 차이를 알아야한다.
다양한 쿠버네티스 책에서 Stateful을 애완동물에 비교하고 Stateless을 가축으로 비교한다.
애완동물에는 특별한 이름을 붙여주기 때문에 다른 가축과는 명확히 구분된다.
사람의 입장에서 애완동물은 항상 고유한 식별자로서 대체 불가능한 개체로 여겨진다.
상태를 갖는 각 포드는 모두 고유하며, 쉽게 대체될 수 없기 때문에 상태를 갖는 애플리케이션인 스테이트풀셋을 애완동물과 비교한다
아래 이미지 처럼 Statefulset과 Replocaset의 차이는
Statefulset : 순차가있는 이름으로 파드 및 볼륨이 생성되며 순차적으로 생성된다
Replicaset : 랜덤의 이름으로 파드 및 볼륨이 생성되며 동시 생성된다
Headless service
아래처럼 statefulset, service를 생성할때
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: echo-headless
labels:
app: echo-headless
spec:
serviceName: "echo-headless"
replicas: 2
selector:
matchLabels:
app: echo-headless
template:
metadata:
labels:
app: echo-headless
spec:
containers:
- name: nginx
image: ealen/echo-server
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
cpu: 50m
memory: 100Mi
ports:
- containerPort: 80
name: web
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: gp2
resources:
requests:
storage: 1Gi
(service와 echo-normal yaml은 생략)
echo-headless는 clusterIP가 할당되지 않고 echo-normal은 할당되는것을 확인
clusterIP가 할당되지 않으면 kube-proxy가 이러한 서비스들을 처리하지 않는다. 즉 서비스를 거치지 않고 pod에 직접 접근한다.
statefulset으로 배포된 파드는 이름 뒤에 순차적인 숫자로 유일하게 구별 가능하며 파드 별로 PV(PVC)가 생성 및 연동됨persistvolumeclaim을 보면 일반적으로 생성 되는 pvc와는 다른게 뒤에 숫자가 새겨져있다.
nicolaka/netshoot 이미지를 사용하는 파드를 생성하여 접속 후 네트워크를 점검해보면 다음과 같다.
(nicolaka/netshoot는 도커 및 쿠버네티스 네트워크 문제를 해결할때 자주 사용된다.)
접속해서 nslookup하여 ip를 호출하면 일반 servcie를 사용하는 echo-normal service의 ip를 호출
headless servcie를 사용하는 statefulset은 파드의 ip를 보내주는것이 확인 가능하다.
headless servcie를 사용하는 statefulset에 부하를 날려보면 service를 거치지 않아도 부하분산 되는것을 확인 가능하다.
for i in $(seq 1 10);do curl -s echo-headless.default.svc | jq ".environment.HOSTNAME";done | sort -n | uniq -c
---
추가적으로
headless servcie는 statefulset에만 사용하는줄 알았는데 pod를 그룹으로 관리하고 POD IP목록을 직접 조회가 필요한 아키텍처에서 사용한다고 한다. (애초에 statefulset 자체가 상태 저장이여서 db에서 많이 사용된다.)
master/slave, 클러스터 구조 같이 데이터베이스 같은 곳 예를들어 Elsaticsearch helm chart에서 headless서비스를 사용하여 master목록을 관리 한다고 한다.
또한 statefulset 생성하는데 오류가 생겼는데 확인해니깐 테스트여서 작은 노드 생성했는데 파드 갯수가 문제였다
그래서 노드 추가 후 다시 확인해보니 ebs를 마운트해서 다른 더 이상 노드에 파드를 못올려 볼륨이 마운트 되지 않았다
근데 자세히 보면 statefulset에 taint를 주지 않았는데 taint 문제로 스케줄링 되지 않았다라는 이벤트가있었다 자동되로 taint가 되는거 같다.(이건 뇌피셜)
참조
https://malwareanalysis.tistory.com/493
https://kubetm.github.io/k8s/08-intermediate-controller/statefulset/
'Terraform' 카테고리의 다른 글
Github Actions의 Self-hosted Runner (0) | 2023.04.04 |
---|---|
[CICD] ArgoCD Project, Application, App of apps (0) | 2023.03.16 |
EKS Upgrade 1.22 -> 1.23 version (0) | 2023.03.13 |
[etc] systemd 및 service 등록 (0) | 2023.03.09 |
[Terraform] 반복문, if문 (for, for_each, count, if) (0) | 2022.10.11 |