Coredns 无法连接到主机名称服务器
Coredns couldn't reach to Host Nameserver
按照 Kelsey Hightower 的指示,我从头开始创建了一个 kubernetes 集群。正如我检查的那样,一切正常,没有任何错误,但是在我部署了我的第一个应用程序之后,我发现我的应用程序无法解析 DNS。
我检查了我的 coredns 日志并看到了以下条目:
.:53
2018/10/16 12:31:45 [INFO] CoreDNS-1.2.2
2018/10/16 12:31:45 [INFO] linux/amd64, go1.11, eb51e8b
CoreDNS-1.2.2
linux/amd64, go1.11, eb51e8b
2018/10/16 12:31:45 [INFO] plugin/reload: Running configuration MD5 = 06122de1a2d6c43092ab48d05478dc82
2018/10/16 12:44:27 [ERROR] 2 google.com. A: unreachable backend: read udp 192.168.65.142:51219->172.10.0.2:53: i/o timeout
2018/10/16 12:44:29 [ERROR] 2 google.com. A: unreachable backend: read udp 192.168.65.142:39967->172.10.0.2:53: i/o timeout
2018/10/16 12:44:31 [ERROR] 2 google.com. A: unreachable backend: read udp 192.168.65.142:40187->172.10.0.2:53: i/o timeout
除了 Kelsey 的文档之外,我还在 Docker 之上安装了 calico。
我的嫌疑人:
我已经在 Docker 之上安装了 Calico,但我的 kubelet 运行time 已配置为与 Containerd 一起工作。我正在进入 calico pod,它似乎有网络。但是 containerd none pods。但是我找不到 运行 calico over Containerd 的方法。
我的 Kubelet 服务配置:
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=containerd.service
Requires=containerd.service
[Service]
ExecStart=/usr/bin/kubelet \
--container-runtime=remote \
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
--image-pull-progress-deadline=2m \
--config=/var/lib/kubelet/kubelet-config.yaml \
--kubeconfig=/var/lib/kubelet/kubeconfig-kubelet \
--network-plugin=cni \
--cni-conf-dir=/etc/cni/net.d \
--cni-bin-dir=/opt/cni/bin \
--register-node=true \
--cloud-provider=aws \
--v=2
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
还有我的 kubelet 配置 yaml 文件:
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
anonymous:
enabled: false
webhook:
enabled: true
x509:
clientCAFile: "/etc/kubernetes/pki/ca.pem"
authorization:
mode: Webhook
clusterDomain: "${cluster_domain}"
clusterDNS:
- "172.10.0.10"
podCIDR: "172.10.0.0/16"
resolvConf: "/run/systemd/resolve/resolv.conf"
runtimeRequestTimeout: "15m"
tlsCertFile: "/etc/kubernetes/pki/worker.pem"
tlsPrivateKeyFile: "/etc/kubernetes/pki/worker-key.pem"
节点机器上我的 resolv.conf 文件:
nameserver 172.10.0.2
我可以看到 pods 可以连接到 coredns pod 但 coredns 无法通过端口 53 连接到 172.10.0.2。在主机上,我可以远程登录到这个端口并得到答案。
最佳,
这是一个棘手的问题。我遇到了同样的问题并通过以下方式解决了,它应该也适用于你。要将 Calico 安装到您的集群,您需要修补 Calico YAML。靠documentation, how to install Calico:
要实现您的目标,您需要:
为 Calico 创建 RBAC:
kubectl apply -f \
https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
下载带有 Calico 配置的 YAML:
curl \
https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml -o
编辑文件 calico.yaml
:
- name: CALICO_IPV4POOL_CIDR
value: "10.200.0.0/16"
粘贴到 value
部分,然后 10.200.0.0/16
保存。
并应用它:
kubectl apply -f calico.yaml
按照 Kelsey Hightower 的指示,我从头开始创建了一个 kubernetes 集群。正如我检查的那样,一切正常,没有任何错误,但是在我部署了我的第一个应用程序之后,我发现我的应用程序无法解析 DNS。
我检查了我的 coredns 日志并看到了以下条目:
.:53
2018/10/16 12:31:45 [INFO] CoreDNS-1.2.2
2018/10/16 12:31:45 [INFO] linux/amd64, go1.11, eb51e8b
CoreDNS-1.2.2
linux/amd64, go1.11, eb51e8b
2018/10/16 12:31:45 [INFO] plugin/reload: Running configuration MD5 = 06122de1a2d6c43092ab48d05478dc82
2018/10/16 12:44:27 [ERROR] 2 google.com. A: unreachable backend: read udp 192.168.65.142:51219->172.10.0.2:53: i/o timeout
2018/10/16 12:44:29 [ERROR] 2 google.com. A: unreachable backend: read udp 192.168.65.142:39967->172.10.0.2:53: i/o timeout
2018/10/16 12:44:31 [ERROR] 2 google.com. A: unreachable backend: read udp 192.168.65.142:40187->172.10.0.2:53: i/o timeout
除了 Kelsey 的文档之外,我还在 Docker 之上安装了 calico。
我的嫌疑人:
我已经在 Docker 之上安装了 Calico,但我的 kubelet 运行time 已配置为与 Containerd 一起工作。我正在进入 calico pod,它似乎有网络。但是 containerd none pods。但是我找不到 运行 calico over Containerd 的方法。
我的 Kubelet 服务配置:
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=containerd.service
Requires=containerd.service
[Service]
ExecStart=/usr/bin/kubelet \
--container-runtime=remote \
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
--image-pull-progress-deadline=2m \
--config=/var/lib/kubelet/kubelet-config.yaml \
--kubeconfig=/var/lib/kubelet/kubeconfig-kubelet \
--network-plugin=cni \
--cni-conf-dir=/etc/cni/net.d \
--cni-bin-dir=/opt/cni/bin \
--register-node=true \
--cloud-provider=aws \
--v=2
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
还有我的 kubelet 配置 yaml 文件:
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
anonymous:
enabled: false
webhook:
enabled: true
x509:
clientCAFile: "/etc/kubernetes/pki/ca.pem"
authorization:
mode: Webhook
clusterDomain: "${cluster_domain}"
clusterDNS:
- "172.10.0.10"
podCIDR: "172.10.0.0/16"
resolvConf: "/run/systemd/resolve/resolv.conf"
runtimeRequestTimeout: "15m"
tlsCertFile: "/etc/kubernetes/pki/worker.pem"
tlsPrivateKeyFile: "/etc/kubernetes/pki/worker-key.pem"
节点机器上我的 resolv.conf 文件:
nameserver 172.10.0.2
我可以看到 pods 可以连接到 coredns pod 但 coredns 无法通过端口 53 连接到 172.10.0.2。在主机上,我可以远程登录到这个端口并得到答案。
最佳,
这是一个棘手的问题。我遇到了同样的问题并通过以下方式解决了,它应该也适用于你。要将 Calico 安装到您的集群,您需要修补 Calico YAML。靠documentation, how to install Calico:
要实现您的目标,您需要: 为 Calico 创建 RBAC:
kubectl apply -f \
https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
下载带有 Calico 配置的 YAML:
curl \
https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml -o
编辑文件 calico.yaml
:
- name: CALICO_IPV4POOL_CIDR
value: "10.200.0.0/16"
粘贴到 value
部分,然后 10.200.0.0/16
保存。
并应用它:
kubectl apply -f calico.yaml