为什么kubeproxy、apiserver和etcd不需要CNI插件即可启动?

为什么kubeproxy、apiserver和etcd不需要CNI插件即可启动?

我已经在服务器上启动了一个 k8s 集群,配置如下:

  • 操作系统:Ubuntu 2022 LTS

  • 容器运行时:容器

  • 全国工业联合会(CNI):绝对没有安装任何东西!

  • 集群发起者:库贝德

  • 初始设置:

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
kind: ClusterConfiguration
kubernetesVersion: 1.29.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

我的问题如下。我在许多文章(以及 k8s 文档)中都看到,CNI 负责为容器(或 pod)分配网络接口。我的集群还没有 CNI,但像kube-apiserverkube-proxyetcd这些 init pod 这样的 pod 可以在没有 CNI 的情况下运行。这怎么可能呢?

PS 如果能提供有用的文档链接我将非常感激。

提前致谢 :)

答案1

在 Kubernetes 节点上使用 yaml 文件定义的静态 pod/ect/kubernetes/manifests由特定节点上的 kubelet 守护程序直接管理。etcdkube-apiserver是静态 pod 的示例。

kube-proxy是一个 DaemonSet,在使用时安装kubeadm

静态 Pod 以及作为 DaemonSet 的一部分运行的 Pod 将具有其运行节点的 IP 地址,因此从这个意义上讲,它们不依赖 CNI。想想看:如果 CNI 安装需要使用kubectl,那么在没有启动和运行 API 服务器的情况下,这是不可能的。

https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/

https://kubernetes.io/docs/reference/setup-tools/kubeadm/implementation-details/

相关内容