backend/kubernetes in action

[kubernetes in action] 5.6. Using a headless service for discovering individual pods

seul chan 2020. 6. 10. 21:06

5.6. Using a headless service for discovering individual pods

지금까지는 service가 stable IP 주소를 제공하고, client가 endpoint를 통해서 랜덤으로 선택된 pod에 접근할 수 있는 것을 보았다.

하지만 만약 클라이언트가 모든 pod에 접근하고 싶다면? kubernetes는 이런 상황에 DNS lookup을 통해 pod IP들을 모두 알 수 있다. (clusterIP 필드를 None으로)

Creating a headless service

service의 spec에서 clusterIp 필드를 None으로 만들면 서비스를 headless로 만들고, kubernetes는 클라이언트가 pod에 붙을 수 없도록 cluster IP를 부여하지 않는다.

kubia-svc-headless.yaml

apiVersion: v1
kind: Service
metadata:
  name: kubia-headless
spec:
  clusterIP: None
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: kubia
$ kubectl create -f kubia-svc-headless.yaml
service/kubia-headless created

# make pod avaliable
$ kubectl exec <pod name> -- touch /var/ready

Discovering pods through DNS

pod가 준비되었으면 이제 DNS lookup을 사용하여 실제 pod의 IP를 확인할 수 있다.

하지만 pod 안의 컨테이너 이미지는 nslookup이나 dig 명령어를 포함하고 있지 않기 때문에 이를 포함하는 컨테이너 이미지 (tutum/dnsutils)를 사용하려면 다시 YAML manifest를 작성하고 kubectl create를 해야 한다.

다행히 더 쉬운 길이 있다. YAML manifest 없이 kubectl run을 사용하여 pod를 생성할 수 있다.

$ kubectl run dnsutils --image=tutum/dnsutils --generator=run-pod/v1 --command -- sleep infinity
pod/dnsutils created

$ kubectl get po -l run=dnsutils
NAME       READY   STATUS    RESTARTS   AGE
dnsutils   1/1     Running   0          34s

$ kubectl exec dnsutils nslookup kubia-headless
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   kubia-headless.default.svc.cluster.local
Address: 172.17.0.13
Name:   kubia-headless.default.svc.cluster.local
Address: 172.17.0.12

5.7. Troubleshooting services

pod에 접속이 되지 않으면 다음 리스트를 확인

  • 먼저, 외부가 아니라 cluster 안에서 service의 클러스터 IP로 접근이 가능한지 확인
  • service가 접속 가능한지 확인하기 위해 service IP에 ping을 날리지 말것 (virtual IP이기 때문에 pinging은 작동하지 않음)
  • readiness probe를 정의했다면 작동하는지 확인
  • kubectl get endpoints를 사용하여 pod가 service의 부분인지 확인
  • service의 target port가 아니라 노출된 port로 연결을 시도하고 있는지 확인
  • pod IP에 직접 접근하여 pod가 제대로 된 포트의 접근을 받고 있는지 확인