現在、すべてのサービスを 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
busybox
DNS 解決機能をチェックし、問題をデバッグするために、テスト 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.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
これを解決する最善の方法は、ジャンプ ポッドを作成することです。
ステップ 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
または、> を使用してファイルにエクスポートします。