Kubernetes Flannel k8s_install-cni_kube-flannel-ds 在工作节点上退出
Kubernetes Flannel k8s_install-cni_kube-flannel-ds exited on worker node
我正在设置我的第一个 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 and also one on Kubernetes site: https://kubernetes.cn/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes/。我知道 Microsoft 网站上的文章已有 2 年多了,但这只是我找到的混合模式操作指南。
到目前为止,我已经在 Master 和 worker RHEL 节点上完成了以下操作:
- 停止并禁用 firewalld
- 禁用 selinux
- 更新&&升级
- 禁用交换分区
- 为我的 Kubernetes 集群中涉及的所有节点添加了 /etc/hosts 条目
- 已安装 Docker CE 19.03.11
- 安装 kubectl、kubeadm 和 kubelet 1.18.3(构建日期 2020-05-20)
- 为 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 作为 non-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 中为 pods 得到的结果
添加 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
加入Worker节点
我现在正在尝试通过执行 IU 初始化集群时生成的 kubeadm join 命令来加入 RHEL 7.7 工作节点。
工作节点初始化正常,如下所示:
当我转到我的 RHEL 工作节点时,我看到 k8s_install-cni_kube-flannel-ds-amd64-f4mtp_kube-system 容器是退出如下所示:
- 你能告诉我我是否遵循了正确的程序吗?我相信 Flannel CNI 需要在 kubernetes 集群
中与 pods 交谈
- 如果 Flannel 很难设置为混合模式,我们可以使用其他可以工作的网络吗?
- 如果我们决定只使用 RHEL 节点,我可以安装最好、最简单的网络插件而不遇到很多问题?
谢谢,我很感激。
官方网站上有很多关于 Kubernetes 的资料,我鼓励你去看看:
我把这个答案分为几部分:
- CNI
- 疑难解答
CNI
什么是 CNI?
CNI (Container Network Interface), a Cloud Native Computing Foundation project, consists of a specification and libraries for writing plugins to configure network interfaces in Linux containers, along with a number of supported plugins. CNI concerns itself only with network connectivity of containers and removing allocated resources when the container is deleted. Because of this focus, CNI has a wide range of support and the specification is simple to implement.
简单来说,您的 CNI 插件 负责集群内 pod 的网络连接。
有多个 CNI 插件,例如:
- 法兰绒
- 印花布
- 多图斯
- Weavenet
我的意思是,您不需要使用 Flannel
。您可以使用其他插件,例如 Calico
。主要考虑因素是它们彼此 different,您应该选择最适合您的用例的选项(例如支持某些功能)。
关于这个话题有很多 materials/resources。请看看其中的一些:
- Youtube.com:Kubernetes 和 CNI:我们现在的位置和下一步是什么 - Casey Callendrello,CoreOS
- Youtube.com:7 分钟解释容器网络接口 (CNI)
- Kubernetes.io: Docs: Concepts: Cluster administration: Networking
至于:
If Flannel is difficult to setup for mixed mode, can we use other network which can work?
如果您指的是使用 Windows 和 Linux 机器节点的混合模式,我会坚持使用已经编写好的指南,就像您提到的那样:Kubernetes.io: Adding Windows nodes
至于:
If we decide to go only and only RHEL nodes, what is the best and easiest network plugin I can install without going through lot of issues?
选择 CNI 插件的最佳方式是寻找最适合您需求的解决方案。您可以关注此 link 以了解概览:
你也可以看这里(请记住这篇文章是 2018 年的,可能已经过时了):
疑难解答
when I go to my RHEL worker node, I see that k8s_install-cni_kube-flannel-ds-amd64-f4mtp_kube-system container is exited as seen below:
您的 k8s_install-cni_kube-flannel-ds-amd64-f4mtp_kube-system
容器已退出,状态为 0
,这应该表明配置正确。
您可以通过调用以下命令查看 flannel pods 的日志:
kubectl logs POD_NAME
也可以参考Flannel官方文档:Github.com: Flannel: Troubleshooting
正如我在评论中所说:
To check if your CNI is working you can spawn 2 pods on 2 different nodes and try make a connection between them (like ping them).
步数:
- 生成 pods
- 检查他们的 IP 地址
- 执行到 pods
- 平
重生pods
下面是将产生 ubuntu pods 的 示例 部署定义。它们将用于检查 pods 节点之间是否有通信:
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 地址
在 pods 生成后你应该可以 运行 命令:
$ 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 && 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 集群。我们希望混合使用 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 and also one on Kubernetes site: https://kubernetes.cn/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes/。我知道 Microsoft 网站上的文章已有 2 年多了,但这只是我找到的混合模式操作指南。
到目前为止,我已经在 Master 和 worker RHEL 节点上完成了以下操作:
- 停止并禁用 firewalld
- 禁用 selinux
- 更新&&升级
- 禁用交换分区
- 为我的 Kubernetes 集群中涉及的所有节点添加了 /etc/hosts 条目
- 已安装 Docker CE 19.03.11
- 安装 kubectl、kubeadm 和 kubelet 1.18.3(构建日期 2020-05-20)
- 为 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 作为 non-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 中为 pods 得到的结果
添加 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
加入Worker节点
我现在正在尝试通过执行 IU 初始化集群时生成的 kubeadm join 命令来加入 RHEL 7.7 工作节点。
工作节点初始化正常,如下所示:
当我转到我的 RHEL 工作节点时,我看到 k8s_install-cni_kube-flannel-ds-amd64-f4mtp_kube-system 容器是退出如下所示:
- 你能告诉我我是否遵循了正确的程序吗?我相信 Flannel CNI 需要在 kubernetes 集群 中与 pods 交谈
- 如果 Flannel 很难设置为混合模式,我们可以使用其他可以工作的网络吗?
- 如果我们决定只使用 RHEL 节点,我可以安装最好、最简单的网络插件而不遇到很多问题?
谢谢,我很感激。
官方网站上有很多关于 Kubernetes 的资料,我鼓励你去看看:
我把这个答案分为几部分:
- CNI
- 疑难解答
CNI
什么是 CNI?
CNI (Container Network Interface), a Cloud Native Computing Foundation project, consists of a specification and libraries for writing plugins to configure network interfaces in Linux containers, along with a number of supported plugins. CNI concerns itself only with network connectivity of containers and removing allocated resources when the container is deleted. Because of this focus, CNI has a wide range of support and the specification is simple to implement.
简单来说,您的 CNI 插件 负责集群内 pod 的网络连接。
有多个 CNI 插件,例如:
- 法兰绒
- 印花布
- 多图斯
- Weavenet
我的意思是,您不需要使用 Flannel
。您可以使用其他插件,例如 Calico
。主要考虑因素是它们彼此 different,您应该选择最适合您的用例的选项(例如支持某些功能)。
关于这个话题有很多 materials/resources。请看看其中的一些:
- Youtube.com:Kubernetes 和 CNI:我们现在的位置和下一步是什么 - Casey Callendrello,CoreOS
- Youtube.com:7 分钟解释容器网络接口 (CNI)
- Kubernetes.io: Docs: Concepts: Cluster administration: Networking
至于:
If Flannel is difficult to setup for mixed mode, can we use other network which can work?
如果您指的是使用 Windows 和 Linux 机器节点的混合模式,我会坚持使用已经编写好的指南,就像您提到的那样:Kubernetes.io: Adding Windows nodes
至于:
If we decide to go only and only RHEL nodes, what is the best and easiest network plugin I can install without going through lot of issues?
选择 CNI 插件的最佳方式是寻找最适合您需求的解决方案。您可以关注此 link 以了解概览:
你也可以看这里(请记住这篇文章是 2018 年的,可能已经过时了):
疑难解答
when I go to my RHEL worker node, I see that k8s_install-cni_kube-flannel-ds-amd64-f4mtp_kube-system container is exited as seen below:
您的 k8s_install-cni_kube-flannel-ds-amd64-f4mtp_kube-system
容器已退出,状态为 0
,这应该表明配置正确。
您可以通过调用以下命令查看 flannel pods 的日志:
kubectl logs POD_NAME
也可以参考Flannel官方文档:Github.com: Flannel: Troubleshooting
正如我在评论中所说:
To check if your CNI is working you can spawn 2 pods on 2 different nodes and try make a connection between them (like ping them).
步数:
- 生成 pods
- 检查他们的 IP 地址
- 执行到 pods
- 平
重生pods
下面是将产生 ubuntu pods 的 示例 部署定义。它们将用于检查 pods 节点之间是否有通信:
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 地址
在 pods 生成后你应该可以 运行 命令:
$ 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 地址为 ubuntu-557dc88445-p8v86
(第三个)在 NODE-2 上的 IP 地址为
10.20.0.4
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 && 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