Kubernetes ポッド DNS 解決

Kubernetes ポッド DNS 解決

現在、すべてのサービスを IP アドレスに解決し、telnet して ping を実行できます。ポッドを IP アドレスに解決できません。ただし、kubectl と telnet を使用してポッドの IP アドレスを検索し、ping を実行することはできます。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/

それは問題になる可能性がある 1 つの点です。特定のケースについて、さらに詳しい情報を提供する必要があるかもしれません。

答え2

busyboxDNS 解決機能をチェックし、問題をデバッグするために、テスト Pod を作成できます。

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

これを解決する最善の方法は、ジャンプ ポッドを作成することです。

ステップ 1. 仕様ファイルを使用してポッドを作成します。

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 を使用するメイン クラスターが機能しない方法と、busybox (別名ジャンプ ポッド) が機能する例です。

$ 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

または、> を使用してファイルにエクスポートします。

関連情報