Kubernetes 포드 DNS 확인

Kubernetes 포드 DNS 확인

현재 모든 서비스를 IP 주소 및 텔넷으로 확인하고 핑할 수 있습니다. 포드를 IP 주소로 확인할 수 없습니다. kubectl 및 telnet을 사용하여 포드 IP 주소를 조회하고 핑할 수 있습니다. Kubernetes 1.9.6, dns-controller:1.9.1에서 포드를 확인하려면 DNS를 어떻게 구성해야 합니까?

답변1

@mk_sta의 답변은 작업하기가 좀 더 쉽습니다. 다음 라이너를 실행하여 DNS를 테스트할 수 있습니다.

kubectl run busybox --image=busybox --rm --attach --command -- sh -c "cat /etc/resolv.conf; nslookup $POD.$NAMESPACE.pod.cluster.local"

예제 출력:

If you don't see a command prompt, try pressing enter.

Server:         100.64.0.10
Address:        100.64.0.10:53


*** Can't find $POD.$NAMESPACE.pod.cluster.local: No answer

deployment.apps "busybox" deleted

보너스는 실행 후 배포/포드를 삭제한다는 것입니다.


나에게 문제는 내 포드가 상태 저장 세트에 있으므로 포드 DNS 확인이 약간 다르다는 것입니다. 예를 들어 다음을 사용해야 합니다.

web-{0..N-1}.nginx.default.svc.cluster.local

pod-N.$GOVERNING_STATEFULSET.$NAMESPACE.svc.cluster.local

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

그것은 잘못될 수 있는 한 가지입니다. 귀하의 특정 사례에 대해 더 많은 정보를 제공하고 싶을 수도 있습니다.

답변2

busyboxDNS 확인 기능을 확인하고 문제를 디버그하기 위해 테스트 포드를 생성할 수 있습니다 .

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always

/etc/resolv.confPod 에서 파일을 확인합니다 busybox.

kubectl exec busybox cat /etc/resolv.conf

내용은 다음과 같아야 합니다.

search default.svc.cluster.local svc.cluster.local cluster.local .....
nameserver 10.0.0.10
options ndots:5

클러스터의 대상 Pod에 대한 조회 요청을 수행합니다.

kubectl exec -ti busybox -- nslookup XXX-XX-XX-XX.default.pod.cluster.local

Pod DNS 이름이 확인되지 않은 경우 kubectl logs다음 명령을 사용하여 DNS 구성 요소 로그를 확인할 수 있습니다.

kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c kubedns
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c dnsmasq
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c healthz

답변3

이 문제를 해결하기 위해 제가 본 가장 좋은 방법은 Jump Pod를 만드는 것입니다.

1단계. 사양 파일을 사용하여 Pod를 생성합니다.

cat << ENDL >> jumpod.yml
apiVersion: v1
kind: Pod
metadata:
  name: jumpod
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
ENDL

2단계. 클러스터와 노드에 포드를 적용하거나 생성합니다. 기본 네임스페이스에 위치하게 됩니다.

kubectl apply -f jumpod.yml

이제 이 포드를 사용하여 포드 또는 서비스의 DNS를 가져올 수 있습니다.

예를 들어:

포드 nslookup 3단계. 찾고 있는 포드의 IP 주소를 가져옵니다.

kubectl get pods -o wide

4단계. Jump Pod를 사용하여 nslookup 수행

kubectl exec -it jumpod ping 10.244.0.149

서비스 nslookup 5단계. 사용하려는 서비스 IP 주소를 검색하세요.

kubectl get services --all-namespaces

6단계. 이제 점프 포드를 사용하여 서비스 IP 주소에 대해 nslookup을 수행합니다.

kubectl exec -it jumpod nslookup 10.245.150.103

다음은 nslookup을 사용하는 기본 클러스터가 작동하지 않는 방식과 비지박스(점프 포드라고도 함)가 작동하는 방식에 대한 예입니다.

$ kubectl exec -it jumpod nslookup 10.245.150.103
Server:    10.245.0.10
Address 1: 10.245.0.10 kube-dns.kube-system.svc.cluster.local
Name:      10.245.150.103
Address 1: 10.245.150.103 hello.develop.svc.cluster.local
$ nslookup 10.245.150.103
Server:     8.8.8.8
Address:    8.8.8.8#53
** server can't find 103.150.245.10.in-addr.arpa: NXDOMAIN

도움이 되었기를 바랍니다!

PS 우연히 포드 내에서 생성한 DNS 파일을 내보내야 하는 경우 이를 사용할 수 있습니다.

kubectl cp default/POD_NAME:bin/FILE_NAME /Users/username/FILE_NAME

또는 >를 사용하여 파일로 내보낼 수도 있습니다.

관련 정보