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가 제대로 된 포트의 접근을 받고 있는지 확인