我使用 部署了一个 Kubernetes 集群kubeadm
。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-172-31-33-9.us-east-2.compute.internal NotReady <none> 48m v1.22.2
ip-172-31-46-53.us-east-2.compute.internal NotReady control-plane,master 49m v1.22.2
ip-172-31-47-245.us-east-2.compute.internal NotReady <none> 6s v1.22.2
节点是NotReady
因为我还没有安装网络插件。我想使用保持简单并使用kubenet
。指示说:
Kubelet 必须使用 --network-plugin=kubenet 参数运行才能启用该插件
但我不知道该怎么做。我尝试将其添加到各种配置文件中,例如/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
和/etc/sysconfig/kubelet
,并重新启动 kubelet,但都不起作用。
我如何kubenet
使用kubeadm
?
答案1
您可以使用该/etc/default/kubelet
文件来覆盖 kubelet 参数。如文件所示10-kubeadm.conf
:
...
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
...
我将向你展示它是如何工作的。
首先,我设置了 Kubernetes 控制平面:
# kubeadm init
[init] Using Kubernetes version: v1.22.2
...
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
初始化成功后,我们可以检查kubelet当前使用的参数值--network-plugin
和Pod的状态coredns
:
# ps aux | grep "kubelet" | grep "network-plugin"
root 27488 5.1 3.6 1816612 145808 ? Ssl 10:42 0:01 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.5
# kubectl get pod -n kube-system | grep "coredns"
coredns-78fcd69978-bbc52 0/1 Pending 0 2m26s
coredns-78fcd69978-fdcv9 0/1 Pending 0 2m26s
从上面的输出中我们可以看到--network-plugin=cni
和coredns
Pods处于Pending
状态。
让我们创建/etc/default/kubelet
文件并在其中写入 kubelet 参数:
笔记:您可能需要定制--pod-cidr
和--pod-infra-container-image
以满足您的需求。
# touch /etc/default/kubelet
# echo 'KUBELET_KUBEADM_ARGS="--network-plugin=kubenet --pod-cidr=10.20.0.0/24 --pod-infra-container-image=k8s.gcr.io/pause:3.5"' > /etc/default/kubelet
# cat /etc/default/kubelet
KUBELET_KUBEADM_ARGS="--network-plugin=kubenet --pod-cidr=10.20.0.0/24 --pod-infra-container-image=k8s.gcr.io/pause:3.5"
然后我们需要重新加载 systemd 管理器配置并重新启动kubelet
:
# systemctl daemon-reload
# systemctl restart kubelet
最后,我们可以检查它是否按预期工作:
# ps aux | grep "kubelet" | grep "network-plugin"
root 27841 6.9 3.5 1890600 143760 ? Ssl 10:47 0:01 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-plugin=kubenet --pod-cidr=10.20.0.0/24 --pod-infra-container-image=k8s.gcr.io/pause:3.5
# kubectl get pod -n kube-system | grep "coredns"
coredns-78fcd69978-bbc52 1/1 Running 0 6m51s
coredns-78fcd69978-fdcv9 1/1 Running 0 6m51s
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster Ready control-plane,master 15m v1.22.2
您可以对所有节点执行以下步骤。
此外,请记住(更多信息可以在kubenet 文档):
Kubenet 是一款非常基础、简单的网络插件,仅适用于 Linux。它本身并不实现更高级的功能,如跨节点网络或网络策略。它通常与云提供商一起使用,以设置节点间通信的路由规则,或在单节点环境中使用。
答案2
kubeadm
可以使用--config
已记录的 yaml 文件这里。在此文件中,您可以使用来自 kubelet 的 cli 参数作为额外参数,--network-plugin=kubelet
例如network-plugin: kubelet
:
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
bootstrapTokens:
...
nodeRegistration:
...
kubeletExtraArgs:
...
network-plugin: kubenet
pod-cidr: 10.20.0.0/24