【发布时间】:2018-10-24 10:19:49
【问题描述】:
我正在使用 flannel 在 CentOS 7 上安装三节点 kubernetes 集群一段时间,但是 CoreDNS pod 无法连接到 API 服务器并不断重启。
我遵循的参考 HowTo 文档是 here。
到目前为止我做了什么?
- 已禁用 SELinux,
- 已禁用
firewalld, - 启用
br_netfilter,bridge-nf-call-iptables, - 在三个节点上安装kubernetes,用flannel默认网络(
10.244.0.0/16)设置master的pod网络, - 安装了另外两个节点,加入了master。
- 展开的法兰绒,
- 将 Docker 的 BIP 配置为使用 flannel 默认的每节点子网和网络。
当前状态
- kubelet 工作,集群报告节点准备就绪。
- 集群可以调度和迁移 pod,因此 CoreDNS 在节点上生成。
- Flannel 网络已连接。容器中没有日志,我可以从一个节点到另一个节点 ping
10.244.0.0/24网络。 - Kubernetes 可以部署和运行任意 Pod(尝试过shell demo,即使容器在不同的节点上,也可以通过
kubectl访问其 shell。- 但是,由于 DNS 不工作,它们无法解析任何 IP 地址。
有什么问题?
-
CoreDNS pod 报告它们无法连接到 API 服务器并出现错误:
Failed to list *v1.Namespace: Get https://10.96.0.1:443/api/v1/namespaces?limit=500&resourceVersion=0: dial tcp 10.96.0.1:443: connect: no route to host -
我在路由表中看不到
10.96.0.0路由:default via 172.16.0.1 dev eth0 proto static metric 100 10.1.0.0/24 dev eth1 proto kernel scope link src 10.1.0.202 metric 101 10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlink 10.244.1.0/24 dev docker0 proto kernel scope link src 10.244.1.1 10.244.1.0/24 dev cni0 proto kernel scope link src 10.244.1.1 10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink 172.16.0.0/16 dev eth0 proto kernel scope link src 172.16.0.202 metric 100
附加信息
- 集群初始化通过命令
kubeadm init --apiserver-advertise-address=172.16.0.201 --pod-network-cidr=10.244.0.0/16完成。 - 我已经拆了集群,用1.12.0重建了,问题依旧。
- Kubernetes documentation 中的解决方法不起作用。
-
1.11-3和1.12-0CentOS7 软件包都存在问题。
目前的进展
- 将 Kubernetes 降级为
1.11.3-0。 - 用
kubeadm init --apiserver-advertise-address=172.16.0.201 --pod-network-cidr=10.244.0.0/16重新初始化Kubernetes,因为服务器有另一个无法通过其他主机访问的外部IP,并且Kubernetes倾向于选择该IP作为API服务器IP。--pod-network-cidr由 flannel 授权。 -
初始化后的
iptables -L输出没有连接节点Chain INPUT (policy ACCEPT) target prot opt source destination KUBE-EXTERNAL-SERVICES all -- anywhere anywhere ctstate NEW /* kubernetes externally-visible service portals */ KUBE-FIREWALL all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination KUBE-FORWARD all -- anywhere anywhere /* kubernetes forwarding rules */ DOCKER-USER all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination KUBE-SERVICES all -- anywhere anywhere ctstate NEW /* kubernetes service portals */ KUBE-FIREWALL all -- anywhere anywhere Chain DOCKER-USER (1 references) target prot opt source destination RETURN all -- anywhere anywhere Chain KUBE-EXTERNAL-SERVICES (1 references) target prot opt source destination Chain KUBE-FIREWALL (2 references) target prot opt source destination DROP all -- anywhere anywhere /* kubernetes firewall for dropping marked packets */ mark match 0x8000/0x8000 Chain KUBE-FORWARD (1 references) target prot opt source destination ACCEPT all -- anywhere anywhere /* kubernetes forwarding rules */ mark match 0x4000/0x4000 Chain KUBE-SERVICES (1 references) target prot opt source destination REJECT udp -- anywhere 10.96.0.10 /* kube-system/kube-dns:dns has no endpoints */ udp dpt:domain reject-with icmp-port-unreachable REJECT tcp -- anywhere 10.96.0.10 /* kube-system/kube-dns:dns-tcp has no endpoints */ tcp dpt:domain reject-with icmp-port-unreachable -
看起来 API Server 已按应有的方式部署
$ kubectl get svc kubernetes -o=yaml apiVersion: v1 kind: Service metadata: creationTimestamp: 2018-10-25T06:58:46Z labels: component: apiserver provider: kubernetes name: kubernetes namespace: default resourceVersion: "6" selfLink: /api/v1/namespaces/default/services/kubernetes uid: 6b3e4099-d823-11e8-8264-a6f3f1f622f3 spec: clusterIP: 10.96.0.1 ports: - name: https port: 443 protocol: TCP targetPort: 6443 sessionAffinity: None type: ClusterIP status: loadBalancer: {} -
然后我用
应用了 flannel network podkubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml -
一旦我应用了 flannel 网络,CoreDNS pod 就会启动并开始给出相同的错误:
Failed to list *v1.Endpoints: Get https://10.96.0.1:443/api/v1/endpoints?limit=500\u0026resourceVersion=0: dial tcp 10.96.0.1:443: connect: no route to host 我发现
flanneld使用了错误的网络接口,并在部署前在kube-flannel.yml文件中更改了它。但是结果还是一样。
非常感谢任何帮助。
【问题讨论】:
-
如果你运行 kubeadm 并让它自己决定网络会怎样
-
AFAIK Flannel 的网络地址是硬编码的。然后你必须配置 flannel 以适应 kubernetes。我下次试试。目前其他人也在处理它,所以我无法重建集群。
-
我怀疑有些网络重叠问题
-
尝试在测试集群/测试环境中测试它
-
不知道你的问题是不是和这个有关但是k8s 1.12版本和flannel有问题。您可以阅读以下内容:github.com/coreos/flannel/issues/1044
标签: kubernetes centos7