Kubernetes CoreDNS pods 不断重启

Kubernetes CoreDNS pods are endlessly restarting

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

我遵循的参考 HowTo 文档是 here

到目前为止我做了什么?

当前状态

问题是什么?

附加信息

到目前为止的进展

非常感谢任何帮助。

这基本上是说您的 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 在集群中公开的。那么那个地址是什么?碰巧是默认命名空间中的一个 service,名为 kubernetes。该服务的 ClusterIP10.96.0.1,它正在侦听端口 443,它还映射到 targetPort 6443,这是您的 kube-apiserver 运行宁.

因为你可以部署 pods,等等。看起来 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 -

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

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

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

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

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

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

systemctl stop firewalld

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

此步骤解决了我的问题:

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