현재 모든 서비스를 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
busybox
DNS 확인 기능을 확인하고 문제를 디버그하기 위해 테스트 포드를 생성할 수 있습니다 .
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
/etc/resolv.conf
Pod 에서 파일을 확인합니다 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
또는 >를 사용하여 파일로 내보낼 수도 있습니다.