我正在CentOS 7上安装一个三节点kubernetes集群,但CoreDNS无法连接到API服务器,并且不断重启。
我所遵循的参考HowTo文档是here。
到目前为止,我做了些什么?
- 已禁用SELinux,
- 禁用
firewalld
、 - 已启用
br_netfilter
、bridge-nf-call-iptables
、 - 在三个节点上安装了kubernetes,设置master的pod网络与flannel默认网络(
10.244.0.0/16
)、 - 安装了其他两个节点,并加入了master。
- 展开法兰绒,
- 已将Docker的BIP配置为使用flannel默认的每节点子网和网络。
当前状态
- kubelet正常工作,群集报告节点已就绪。
- 集群可以调度和迁移单元,因此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文档中的解决方法不起作用。
1.11-3
和1.12-0
CentOS7软件包存在相同的问题。
到目前为止的进展
- 已将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服务器似乎已按其应有的方式部署
$ 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: {}
型
- 然后,我将法兰绒网络吊舱与
kubectl 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
文件中更改了它。但是结果仍然是一样的。
4条答案
按热度按时间ykejflvf1#
这基本上是说你的coredns pod不能和kube-apiserver对话。kube-apiserver通过这些环境变量暴露在pod中:
KUBERNETES_SERVICE_HOST=10.96.0.1
和KUBERNETES_SERVICE_PORT_HTTPS=443
我相信你发布的路由是主机上的路由,因为这是你在pod container中运行
ip routes
时得到的:字符串
在任何情况下,你都不会看到
10.96.0.1
,因为它是在集群中使用iptables公开的。那么这个地址是什么呢?在默认命名空间中有一个service
,名为kubernetes
。该服务的ClusterIP
是10.96.0.1
,它正在监听端口443
,它还Map到targetPort
6443
,这是kube-apiserver运行的位置。因为你可以部署pod等。看起来kube-apiserver没有关闭,这不是你的问题。所以很可能你错过了那个服务(或者有一些iptable规则不允许你连接到它)。你可以在这里看到它,例如:
型
完整的输出是这样的:
型
如果你错过了它,你可以像这样创建它:
型
wqsoz72f2#
我已经解决了这个问题。原因是缺乏经验,缺乏文档和一些旧的,不再正确的信息。
使用安装的人告诉我,Docker的网桥需要与Flanel网络在同一个子网中,因此我编辑了Docker的网桥网络。
然而,当Kubernetes开始使用CNI时,这个要求不仅变得不必要,而且是完全错误的。将
cni0
和docker0
放在同一个网络上,使用相同的IP地址总是感觉不对,但由于我是Kubernetes的完全初学者,我忽略了我的直觉。因此,我将Docker的网络重置为默认值,拆除集群并重建它。现在一切都正常工作。
**TL; DR:**如果您正在设置最新的Kubernetes版本,请不要触摸Docker的网络参数。只需安装Docker,初始化Kubernetes并部署Flanel。Kubernetes和CNI将负责容器到Flanel的传输。
sd2nnvve3#
这个步骤解决了我的问题:
字符串
vsnjm48y4#
我以前遇到过这种情况。Firewalld已经打开了端口6443到我的真实的LAN IP,但它仍然禁用其他IP,所以我试图通过CMD关闭防火墙:
字符串
它工作正常,所有来自kubectl日志的异常都消失了,所以根本原因是Linux服务器的防火墙规则。