【问题标题】:Kubernetes Flannel k8s_install-cni_kube-flannel-ds exited on worker nodeKubernetes Flannel k8s_install-cni_kube-flannel-ds 在工作节点上退出
【发布时间】:2020-10-06 06:47:58
【问题描述】:

我正在设置我的第一个 Kubernetes 集群。我们期望混合使用 Windows 和 Linux 节点,所以我选择 flannel 作为我的 cni。我使用 RHEL 7.7 作为我的主节点,我有另外两台 RHEL 7.7 机器作为工作节点,然后剩下的是 Windows Server 2019。在大多数情况下,我遵循 Microsoft 网站上提供的文档:https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/getting-started-kubernetes-windows 和一个Kubernetes 站点:https://kubernetes.cn/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes/。我知道 Microsoft 网站上的文章已有 2 年多的历史了,但这只是我找到的混合模式操作指南。

到目前为止,我已经在 Master 和 worker RHEL 节点上完成了以下工作:

  1. 已停止并禁用了防火墙
  2. 禁用 selinux
  3. 更新 && 升级
  4. 已禁用交换分区
  5. 为我的 Kubernetes 集群中涉及的所有节点添加了 /etc/hosts 条目
  6. 已安装 Docker CE 19.03.11
  7. 安装 kubectl、kubeadm 和 kubelet 1.18.3(构建日期 2020-05-20)
  8. 为 Flannel 准备 Kubernetes 控制平面:sudo sysctl net.bridge.bridge-nf-call-iptables=1

我现在已经在 RHEL 主节点上完成了跟踪

初始化集群

kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

kubectl 作为非 root 用户

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

为节点选择器打补丁

wget https://raw.githubusercontent.com/Microsoft/SDN/master/Kubernetes/flannel/l2bridge/manifests/node-selector-patch.yml
kubectl patch ds/kube-proxy --patch "$(cat node-selector-patch.yml)" -n=kube-system

补丁后,kube-proxy 长这样:

添加法兰绒

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

修改 flannel 清单的 net-conf.json 部分,以便将 VNI 设置为 4096,将端口设置为 4789。它应该如下所示:

net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan",
        "VNI" : 4096,
        "Port": 4789
      }
    }

应用修改后的 kube-flannel

kubectl apply -f kube-flannel.yml

添加网络后,这是我在 kube-system 中获得的 pod

添加 Windows Flannel 和 kube-proxy DaemonSets

curl -L https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/kube-proxy.yml | sed 's/VERSION/v1.18.0/g' | kubectl apply -f -
kubectl apply -f https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/flannel-overlay.yml

加入工作节点 我现在尝试通过执行 IU 初始化集群时生成的 kubeadm join 命令来加入 RHEL 7.7 工作节点。 工作节点初始化良好,如下所示:

当我转到我的 RHEL 工作节点时,我看到 k8s_install-cni_kube-flannel-ds-amd64-f4mtp_kube-system 容器已退出,如下所示:

  1. 如果我遵循正确的程序,请告诉我?我相信 Flannel CNI 需要与 Kubernetes 集群中的 pod 通信
  2. 如果 Flannel 难以设置为混合模式,我们可以使用其他可以工作的网络吗?
  3. 如果我们决定只使用 RHEL 节点,我可以安装最好、最简单的网络插件,而不会遇到很多问题?

谢谢,我很感激。

【问题讨论】:

  • 您的容器 (install-cni...) 以代码 0 退出的事实应该表明 flannel 的配置是正确的。是的,你是正确的,CNI 是 Pod 通信所必需的。要检查您的 CNI 是否正常工作,您可以在 2 个不同的节点上生成 2 个 pod 并尝试在它们之间建立连接(例如 ping 它们)。请让我知道结果。至于最后一个问题,这实际上取决于您的 CNI 需要哪些功能。以here 为例。
  • 大卫,感谢您的评论。我目前正在试验 nginx 部署,它附带了最低限度的 Linux 内核安装。我可以使用 exec 命令进入容器,但是在容器中时,我不能使用 ping,因为它说命令不是 fount。我尝试了apt install,它说无法找到包“iputils-ping”。有什么方法可以从这个最小的 linux 容器测试 ping 吗?如果我问的问题可能没有意义,我很抱歉,但我对所有这些都很陌生,并且正在努力学习。

标签: kubernetes flannel


【解决方案1】:

官网有很多关于 Kubernetes 的资料,建议大家去看看:

我把这个答案分成几部分:

  • CNI
  • 疑难解答

CNI

什么是 CNI?

CNI(容器网络接口)是一个云原生计算基金会项目,由规范和库组成,用于编写插件以在 Linux 容器中配置网络接口,以及许多受支持的插件。 CNI 只关心容器的网络连接以及在容器被删除时移除分配的资源。由于这个重点,CNI 得到了广泛的支持,并且规范易于实现。

-- Github.com: Containernetworking: CNI

简单来说,您的 CNI 插件负责集群内的 pod 网络。

有多个 CNI 插件,例如:

  • 法兰绒
  • 印花布
  • Multus
  • 织网

我的意思是,你不需要使用Flannel。您可以使用其他插件,例如Calico。主要考虑因素是它们彼此是different,您应该选择最适合您的用例的选项(例如支持某些功能)。

有很多关于这个主题的材料/资源。请看一下其中的一些:

至于:

如果 Flannel 难以设置为混合模式,我们可以使用其他可以工作的网络吗?

如果您是指使用 Windows 和 Linux 机器节点的混合模式,我会坚持使用您提到的那些已经编写好的指南:Kubernetes.io: Adding Windows nodes

至于:

如果我们决定只使用 RHEL 节点,我可以安装最好和最简单的网络插件,而不会遇到很多问题?

选择 CNI 插件的最佳方式是寻找最适合您需求的解决方案。您可以点击此链接查看概览:

你也可以看这里(请记住,这篇文章是 2018 年的,可能已经过时了):


疑难解答

当我转到我的 RHEL 工作节点时,我看到 k8s_install-cni_kube-flannel-ds-amd64-f4mtp_kube-system 容器已退出,如下所示:

您的k8s_install-cni_kube-flannel-ds-amd64-f4mtp_kube-system 容器以0 状态退出,这表明配置正确。

您可以通过调用以下命令来查看 flannel pod 的日志:

  • kubectl logs POD_NAME

也可以参考Flannel官方文档:Github.com: Flannel: Troubleshooting

正如我在评论中所说:

要检查您的 CNI 是否正常工作,您可以在 2 个不同的节点上生成 2 个 pod 并尝试在它们之间建立连接(例如 ping 它们)。

步骤:

  • 产卵荚
  • 检查他们的 IP 地址
  • 执行到 pod 中

产卵荚

以下是将生成 ubuntu pod 的示例部署定义。它们将用于检查 pod 是否在节点之间进行通信:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ubuntu
spec:
  selector:
    matchLabels:
      app: ubuntu
  replicas: 5 
  template: 
    metadata:
      labels:
        app: ubuntu
    spec:
      containers:
      - name: ubuntu
        image: ubuntu:latest
        command:
        - sleep
        - infinity

请记住,此示例仅用于测试目的。应用上述定义:

  • kubectl apply -f FILE_NAME.yaml

检查他们的 IP 地址

Pod 生成后,您应该可以运行命令:

  • $ kubectl get pods -o wide

并看到类似这样的输出:

NAME                      READY   STATUS    RESTARTS   AGE   IP          NODE                                         NOMINATED NODE   READINESS GATES
ubuntu-557dc88445-lngt7   1/1     Running   0          8s    10.20.0.4   NODE-1   <none>           <none>
ubuntu-557dc88445-nhvbw   1/1     Running   0          8s    10.20.0.5   NODE-1   <none>           <none>
ubuntu-557dc88445-p8v86   1/1     Running   0          8s    10.20.2.4   NODE-2   <none>           <none>
ubuntu-557dc88445-vm2kg   1/1     Running   0          8s    10.20.1.9   NODE-3   <none>           <none>
ubuntu-557dc88445-xwt86   1/1     Running   0          8s    10.20.0.3   NODE-1   <none>           <none>

你可以从上面的输出中看到:

  • 每个 pod 的 IP 地址是什么
  • 为每个 pod 分配了哪些节点。

通过上面的例子,我们将尝试在以下之间建立连接:

  • ubuntu-557dc88445-lngt7(第一个)在 NODE-1 上的 IP 地址为 10.20.0.4
  • ubuntu-557dc88445-p8v86(第三个)在NODE-2上的IP地址为10.20.2.4

执行到 pods

你可以exec进入pod运行命令:

  • $ kubectl exec -it ubuntu-557dc88445-lngt7 -- /bin/bash

请在此处查看官方文档:Kubernetes.io: Get shell running container

Ping 未内置到 ubuntu 映像中,但您可以通过以下方式安装它:

  • $ apt update &amp;&amp; apt install iputils-ping

之后你可以ping第二个pod并检查你是否可以连接到另一个pod:

root@ubuntu-557dc88445-lngt7:/# ping 10.20.2.4 -c 4
PING 10.20.2.4 (10.20.2.4) 56(84) bytes of data.
64 bytes from 10.20.2.4: icmp_seq=1 ttl=62 time=0.168 ms
64 bytes from 10.20.2.4: icmp_seq=2 ttl=62 time=0.169 ms
64 bytes from 10.20.2.4: icmp_seq=3 ttl=62 time=0.174 ms
64 bytes from 10.20.2.4: icmp_seq=4 ttl=62 time=0.206 ms

--- 10.20.2.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3104ms
rtt min/avg/max/mdev = 0.168/0.179/0.206/0.015 ms

【讨论】:

  • 大卫,感谢您的精彩小文章并回答了我所有的问题。这对我帮助很大。我已经启动并运行了我的第一个 Kubernetes 集群,现在正在学习更多。
猜你喜欢
  • 2019-06-22
  • 1970-01-01
  • 2017-09-25
  • 2017-07-11
  • 2018-02-26
  • 2017-10-14
  • 1970-01-01
  • 2017-02-05
  • 2016-03-25
相关资源
最近更新 更多