我已经在服务器上启动了一个 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-apiserver
、kube-proxy
和etcd
这些 init pod 这样的 pod 可以在没有 CNI 的情况下运行。这怎么可能呢?
PS 如果能提供有用的文档链接我将非常感激。
提前致谢 :)
答案1
在 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/