이 글은 1주차에서 공부한 headless서비스를 정리했습니다.
1. 쿠버네티스 서비스 동작
headless서비스를 이해하기 전에 쿠버네티스 서비스 동작을 이해해야 합니다. 이전 글(https://malwareanalysis.tistory.com/265?category=1070989)에서 설명했듯이, 쿠버네티스 서비스는 1개 이상 파드에게 네트워크를 랜덤으로 분산시키는 역할을 합니다. 외부 또는 서비스에 속한 파드 모두 무작위로 파드에 접근하게 됩니다. 정리하면 서비스를 이용하여 파드에 접근할 경우, 클라이언트가 A파드로 가기를 원해도 A파드로 못갈 수 있습니다.
2. Headless 서비스 동작
반면, headless서비스는 클라이언트가 원하는 파드로 접근하게 합니다. A파드로 가고 싶으면 A파드로, B파드로 가고 싶으면 B파드로 접근할 수 있습니다.
단! 조건이 있는데요. 변하지 않는 파드접근 주소가 필요하고 파드별로 달라야 합니다. 이 조건은 statefulset에 적격입니다. 이전 글(https://malwareanalysis.tistory.com/338)에서 살펴봤듯이 staetefulset은 각 파드마다 고유한 네트워크 신원을 갖습니다.
3. headless서비스와 statefulset연동
클라이언트는 headless서비스를 이용하여 statefulset 파드를 선택해서 접근할 수 있습니다.
- 파드접근주소: <pod이름>.<headless클러스터 도메인주소>
headless서비스는 파드의 srv레코드를 이용하여 파드를 구별합니다.
4. 실습
4.1 statefulset, headless서비스 배포
nginx statefulset과 headless서비스를 배포합니다. headless의 특징은 clusterIP가 없습니다.
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
pod 3개, pvc 3개, headless서비스가 배포됩니다.
k get po,sts,svc,pvc
4.2 샘플 index.html파일 생성
각 nginx파드에 샘플 index.html파일을 생성합니다. index.html파일에는 파드의 hostname이 입력됩니다.
for i in 0 2; do kubectl exec "web-$i" -- sh -c 'echo "$(hostname)-pv-test" > /usr/share/nginx/html/index.html'; done
4.3 dns질의 및 파드 접근
headless서비스에 접근할 client를 파드로 생성했습니다.
kubectl run -it --rm netdebug --image=nicolaka/netshoot --restart=Never -- zsh
일반 dns질의와 srv타입 dns질의를 비교해보세요.
# srv타입 dns질의
nslookup -type=srv nginx.default.svc
# 일반 dns질의
nslookup nginx.default.svc
nginx-0, nginx-1, nginx-2파드를 선택해서 접근해보세요. 각 파드의 hostname이 화면에 출력됩니다.
curl web-0.nginx.default.svc
curl web-1.nginx.default.svc
curl web-2.nginx.default.svc
'연재 시리즈' 카테고리의 다른 글
쿠버네티스 오퍼레이터 스터디 2주차 - mysql operator router설정 확인 (0) | 2022.06.04 |
---|---|
쿠버네티스 오퍼레이터 스터디 2주차 - mysql operator설치 (0) | 2022.06.04 |
쿠버네티스 오퍼레이터 스터디 1주차 - 실습 (0) | 2022.05.24 |
쿠버네티스 오퍼레이터 스터디 1주차 - statefulset이란 (0) | 2022.05.23 |
쿠버네티스 네트워크 스터디 7주차 - 7주차 과제 (2) | 2022.03.02 |