Kubernetes Pod DNS 解析

Kubernetes Pod DNS 解析

目前能够将所有服务解析为 IP 地址,然后远程登录并 ping 它们。无法将 Pod 解析为 IP 地址。但可以使用 kubectl 和 telnet 查找 Pod IP 地址并 ping 它们。我需要如何配置 DNS 来解析 Kubernetes 1.9.6、dns-controller:1.9.1 中的 Pod。

答案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

额外的好处是,它在运行后会删除部署/pod。


对我来说,问题在于我的 Pod 处于有状态集 (statefulset) 中,因此 Pod 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

您可以创建测试 Pod 来busybox检查 DNS 解析功能并调试问题:

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

检查Pod/etc/resolv.conf上的文件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

如果您尚未解析 Pods 的 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.使用spec文件创建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. 将 pod 应用或创建到集群中并放到节点上。请注意,它将位于默认命名空间中。

kubectl apply -f jumpod.yml

现在您可以使用这个 pod 来获取 Pod 或 Service 的 DNS。

例如:

Pod nslookup 步骤3.获取您正在寻找的pod的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.现在使用 jump pod 对服务 ip 地址进行 nslookup

kubectl exec -it jumpod nslookup 10.245.150.103

下面是一个示例,说明使用 nslookup 的主集群如何不起作用以及 busybox(又名 jump pod)如何工作。

$ 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 如果您碰巧需要导出在 pod 内创建的 DNS 文件,则可以使用它。

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

或者直接使用 > 将其导出到文件。

相关内容