Kubernetes CoreDNS Pod不断重启

时间:2018-10-24 10:19:49

标签: kubernetes centos7

一段时间以来,我正在使用绒布在CentOS 7上安装三节点kubernetes集群,但是CoreDNS pod不能连接到API服务器并不断重启。

我遵循的参考文档HowTo文档为here

到目前为止我做了什么?

  • 已禁用SELinux,
  • 已禁用firewalld
  • 启用了br_netfilterbridge-nf-call-iptables
  • 在三个节点上安装kubernetes,使用法兰绒默认网络(10.244.0.0/16)设置主节点的pod网络,
  • 安装了另外两个节点,并加入了主节点。
  • 已部署的法兰绒,
  • 将Docker的BIP配置为使用法兰绒默认的每个节点的子网和网络。

当前状态

  • kubelet正常运行,集群报告节点准备就绪。
  • 集群可以调度和迁移pod,因此在节点上生成CoreDNS。
  • 法兰网络已连接。没有容器中的日志,我可以在节点之间ping 10.244.0.0/24网络。
  • Kubernetes可以部署和运行任意Pod(尝试shell demo,并且即使容器在另一个节点上,也可以通过kubectl访问其shell。
    • 但是,由于DNS无法正常工作,因此它们无法解析任何IP地址。

出了什么问题?

  • CoreDNS吊舱报告说它们无法连接到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-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 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: {}
    
  • 然后我将

    应用于法兰绒网络吊舱
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
  • 一旦我应用了法兰绒网络,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 个答案:

答案 0 :(得分:3)

这基本上是说您的coredns pod无法与kube-apiserver对话。通过以下环境变量KUBERNETES_SERVICE_HOST=10.96.0.1KUBERNETES_SERVICE_PORT_HTTPS=443

将kube-apiserver暴露在pod中。

我相信您发布的路由是主机上的路由,因为这是在pod容器中运行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,它还映射到targetPort 6443,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 -

答案 1 :(得分:3)

我已经解决了问题。原因是缺乏经验,缺乏文档以及一些陈旧,不再正确的信息。

将要使用该安装程序的人告诉我Docker的网桥必须与Flannel网络位于同一子网中,因此我编辑了Docker的网桥网络。

但是,当Kubernetes开始使用CNI时,此要求不仅变得不必要,而且是完全错误的。将cni0docker0都放在具有相同IP地址的同一网络上总是感到不对劲,但是由于我是Kubernetes的一个完整的初学者,所以我不理会我的直觉。

结果,我将Docker的网络重置为其默认设置,拆除了群集并重建了它。现在一切正常。

TL; DR:永远不要触摸Docker的网络参数(如果要设置最新的Kubernetes版本)。只需安装Docker,初始化Kubernetes并部署Flannel。 Kubernetes和CNI将负责集装箱到法兰绒的运输。

答案 2 :(得分:0)

我以前见过这个。 Firewalld为我的真实LAN IP打开了端口6443,但是它仍然禁用了其他IP,因此我尝试通过CMD关闭防火墙:

implicitWidth

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

答案 3 :(得分:0)

此步骤解决了我的问题:

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