【问题标题】:Kubernetes CoreDNS pods are endlessly restartingKubernetes CoreDNS pod 不断重启
【发布时间】:2018-10-24 10:19:49
【问题描述】:

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

我遵循的参考 HowTo 文档是 here

到目前为止我做了什么?

  • 已禁用 SELinux,
  • 已禁用firewalld
  • 启用br_netfilterbridge-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-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: {}
    
  • 然后我用

    应用了 flannel network pod
    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 文件中更改了它。但是结果还是一样。

非常感谢任何帮助。

【问题讨论】:

  • 如果你运行 kubeadm 并让它自己决定网络会怎样
  • AFAIK Flannel 的网络地址是硬编码的。然后你必须配置 flannel 以适应 kubernetes。我下次试试。目前其他人也在处理它,所以我无法重建集群。
  • 我怀疑有些网络重叠问题
  • 尝试在测试集群/测试环境中测试它
  • 不知道你的问题是不是和这个有关但是k8s 1.12版本和flannel有问题。您可以阅读以下内容:github.com/coreos/flannel/issues/1044

标签: kubernetes centos7


【解决方案1】:

这基本上是说您的 coredns pod 无法与 kube-apiserver 通信。 kube-apiserver 通过这些环境变量暴露在 pod 中:KUBERNETES_SERVICE_HOST=10.96.0.1KUBERNETES_SERVICE_PORT_HTTPS=443

我相信您发布的路由是主机上的路由,因为这是您在 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 在集群中公开的。那么那个地址是什么?碰巧这是默认命名空间kubernetes 中的service。该服务的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 -

【讨论】:

    【解决方案2】:

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

    将要使用安装的人告诉我 Docker 的网桥需要与 Flannel 网络在同一子网中,因此我编辑了 Docker 的网桥网络。

    然而,当 Kubernetes 开始使用 CNI 时,这个要求不仅变得不必要,而且完全是错误的。让cni0docker0 在同一个网络上使用相同的 IP 地址总是感觉不对,但由于我是 Kubernetes 的初学者,所以我忽略了我的预感。

    因此,我将 Docker 的网络重置为默认值,拆除了集群并重建了它。现在一切正常。

    TL;DR:如果您要设置最近的 Kubernetes 版本,千万不要碰触 Docker 的网络参数。只需安装 Docker,初始化 Kubernetes 并部署 Flannel。 Kubernetes 和 CNI 将负责容器到 Flannel 的传输。

    【讨论】:

      【解决方案3】:

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

      systemctl stop firewalld
      

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-11
          • 1970-01-01
          • 1970-01-01
          • 2016-08-22
          • 2020-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多