연재 시리즈

쿠버네티스 오퍼레이터 스터디 1주차 - Headless서비스

악분 2022. 5. 26. 20:48
반응형

이 글은 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

 

반응형