如何配置 Kubernetes 以将 kubenet 与 kubeadm 一起使用?

如何配置 Kubernetes 以将 kubenet 与 kubeadm 一起使用?

我使用 部署了一个 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=cnicorednsPods处于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

相关内容