我已经在服务器上启动了一个 k8s 集群,配置如下:
操作系统: Ubuntu 2022 LTS
容器运行时: containerd
CNI:绝对没有安装任何东西!
集群发起者: Kubeadm
初始化设置:
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-apiserver
、等 podkube-proxy
以及etcd
这些 init pod 运行时没有 CNI。这怎么可能?
PS 如果提供有用的文档链接,我将非常感激。
提前致谢 :)
在 Kubernetes 节点上使用 yaml 文件定义的静态 Pod
/ect/kubernetes/manifests
由特定节点上的 kubelet 守护进程直接管理。etcd
和kube-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/