目前能够将所有服务解析为 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
或者直接使用 > 将其导出到文件。