Kubernetes CoreDNS pod正在不断重启

8cdiaqws  于 12个月前  发布在  Kubernetes
关注(0)|答案(4)|浏览(145)

我正在CentOS 7上安装一个三节点kubernetes集群,但CoreDNS无法连接到API服务器,并且不断重启。
我所遵循的参考HowTo文档是here
到目前为止,我做了些什么?

  • 已禁用SELinux,
  • 禁用firewalld
  • 已启用br_netfilterbridge-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-31.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-cidrflannel强制执行。
  • 初始化 * 后产生的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文件中更改了它。但是结果仍然是一样的。
ykejflvf

ykejflvf1#

这基本上是说你的coredns pod不能和kube-apiserver对话。kube-apiserver通过这些环境变量暴露在pod中:KUBERNETES_SERVICE_HOST=10.96.0.1KUBERNETES_SERVICE_PORT_HTTPS=443
我相信你发布的路由是主机上的路由,因为这是你在pod container中运行ip routes时得到的:

root@xxxx-xxxxxxxxxx-xxxxx:/# ip route
default via 169.254.1.1 dev eth0
169.254.1.1 dev eth0  scope link
root@xxxx-xxxxxxxxxx-xxxxx:/#

字符串
在任何情况下,你都不会看到10.96.0.1,因为它是在集群中使用iptables公开的。那么这个地址是什么呢?在默认命名空间中有一个service,名为kubernetes。该服务的ClusterIP10.96.0.1,它正在监听端口443,它还Map到targetPort6443,这是kube-apiserver运行的位置。
因为你可以部署pod等。看起来kube-apiserver没有关闭,这不是你的问题。所以很可能你错过了那个服务(或者有一些iptable规则不允许你连接到它)。你可以在这里看到它,例如:

$ kubectl get svc kubernetes
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   92d


完整的输出是这样的:

$ kubectl get svc kubernetes -o=yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: 2018-07-23T21:10:22Z
  labels:
    component: apiserver
    provider: kubernetes
  name: kubernetes
  namespace: default
  resourceVersion: "24"
  selfLink: /api/v1/namespaces/default/services/kubernetes
  uid: xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
spec:
  clusterIP: 10.96.0.1
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: 6443
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}


如果你错过了它,你可以像这样创建它:

cat <<EOF
apiVersion: v1
kind: Service
metadata:
  labels:
    component: apiserver
    provider: kubernetes
  name: kubernetes
  namespace: default
spec:
  clusterIP: 10.96.0.1
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: 6443
  sessionAffinity: None
  type: ClusterIP
EOF | kubectl apply -f -

wqsoz72f

wqsoz72f2#

我已经解决了这个问题。原因是缺乏经验,缺乏文档和一些旧的,不再正确的信息。
使用安装的人告诉我,Docker的网桥需要与Flanel网络在同一个子网中,因此我编辑了Docker的网桥网络。
然而,当Kubernetes开始使用CNI时,这个要求不仅变得不必要,而且是完全错误的。将cni0docker0放在同一个网络上,使用相同的IP地址总是感觉不对,但由于我是Kubernetes的完全初学者,我忽略了我的直觉。
因此,我将Docker的网络重置为默认值,拆除集群并重建它。现在一切都正常工作。

**TL; DR:**如果您正在设置最新的Kubernetes版本,请不要触摸Docker的网络参数。只需安装Docker,初始化Kubernetes并部署Flanel。Kubernetes和CNI将负责容器到Flanel的传输。

sd2nnvve

sd2nnvve3#

这个步骤解决了我的问题:

systemctl stop kubelet
systemctl stop docker
iptables --flush
iptables -tnat --flush
systemctl start kubelet
systemctl start docker

字符串

vsnjm48y

vsnjm48y4#

我以前遇到过这种情况。Firewalld已经打开了端口6443到我的真实的LAN IP,但它仍然禁用其他IP,所以我试图通过CMD关闭防火墙:

systemctl stop firewalld

字符串
它工作正常,所有来自kubectl日志的异常都消失了,所以根本原因是Linux服务器的防火墙规则。

相关问题