为什么选这个网络插件,启用附加组件后要确认什么
一句话总结
kubespray 的附加组件和网络插件是 group_vars 中的开关;开关打开了,与它是否真的在工作,要分别确认;唯独网络插件事后很难更换,所以要在安装前带着理由去选。
为什么需要它
kubeadm 既不选择 CNI,也不选择 metrics-server 和存储。需要由人去找清单、对齐版本并应用,这个版本是否与集群版本匹配,也要人来看。kubespray 把这些都变成了变量。kube_network_plugin: calico 这一行会创建 calico 的 CRD、DaemonSet 和 IP 池,metrics_server_enabled: true 这一行会创建 metrics-server 和 APIService。版本和镜像地址由 kubespray 发布版固定,所以同一个 inventory 无论什么时候运行,安装的都是同样的附加组件。代价是,留下的只有“已经打开”这个事实,确认它是否在工作仍然是人的任务。
工作原理
网络插件。 由 group_vars/k8s_cluster/k8s-cluster.yml 中的 kube_network_plugin 来选择。示例注释中给出的选项有 cilium、calico、kube-ovn、flannel,以及自行安装时使用的 cni(只解压插件二进制文件,配置留空)和 none。默认是 calico,v2.32.0 中 calico 的默认值是 calico_vxlan_mode: Always、calico_ipip_mode: Never。也就是说,节点之间的 Pod 流量用 VXLAN(UDP 4789)封装起来。
选择的理由通常有三个。第一是 NetworkPolicy——flannel 只提供 Pod 网络,不执行策略,所以需要策略时要用 calico 或 cilium。第二是网络条件——IPIP 要求节点之间放行 IP 协议 4,VXLAN 要求放行 UDP 4789,BGP 模式要求放行 TCP 179。这就是 kubespray 的端口文档按 CNI 分别列出这张表的原因。第三是运维负担——cilium 用 eBPF 取代 kube-proxy,还提供可观测性(Hubble),但内核版本和配置项也随之增加。不管选哪个,安装之后再更换,实际上就是重新安装。因为 Pod IP 网段和节点路由都与插件绑定在一起。
附加组件。 集中在 group_vars/k8s_cluster/addons.yml 中,示例里全部是 false。本模块中要打开的三个如下。
metrics_server_enabled kubectl top · HPA 의 자원 지표. aggregation layer 로 API 서버에 붙는다
local_path_provisioner_enabled 노드 디스크(/opt/local-path-provisioner/)를 PV 로 주는 동적 프로비저너
helm_enabled helm 바이너리를 체크섬으로 고정한 판으로 /usr/local/bin 에 둔다
该代码块中的韩文说明依次为:metrics_server_enabled 提供 kubectl top 和 HPA 所用的资源指标,通过 aggregation layer 接入 API 服务器;local_path_provisioner_enabled 是把节点磁盘(/opt/local-path-provisioner/)作为 PV 提供的动态供应器;helm_enabled 会把以校验和固定了版本的 helm 二进制文件放在 /usr/local/bin。
附加组件是在 cluster.yml 的最后一个 play “Install Kubernetes apps” 中安装的,每个 role 都有标签(metrics_server 等),所以也可以在已经搭建好的集群上只重新运行那一部分。
布尔值陷阱。 从 ansible-core 2.19(Ansible 12)开始,条件表达式必须是布尔值。然而 -e helm_enabled=true 传递的是字符串 "true"。kubespray 通过 validate_inventory 的 “Stop if known booleans are set as strings” 拦下几个众所周知的开关,但实测发现,这个检查只看 download_run_once、download_always_pull、helm_enabled、openstack_lbaas_enabled 这四个。其余开关如果以字符串形式给出,不会被这个检查拦住,而是在使用条件表达式的地方另外出问题。答案是按照发布说明的建议,用 -e '{"helm_enabled": true}' 这样的 JSON 形式传入,或者在 inventory 中写成不带引号的 YAML 布尔值。
在现场相遇的样子
打开了 metrics-server 之后,收到“HPA 不扩容”的咨询是很常见的。确认的顺序是 APIService 的 Available 条件 → metrics-server 日志 → kubelet 连接。kubespray 的默认值 metrics_server_kubelet_insecure_tls: true 意味着 metrics-server 不验证 kubelet 的服务证书。在单节点实验中这很方便,但在生产中,应该正确签发 kubelet 服务证书(kubelet_rotate_server_certificates),并考虑关闭这个值。容易打开的默认值背后,往往隐藏着这样的交换。
local-path-provisioner 会在使用 PVC 的 Pod 被调度时,在该节点的磁盘上创建目录。它很方便,但数据与节点绑定,所以节点消失时数据也会消失。它适合用于实验和缓存,不适合需要复制的数据。
下一项实验要做什么
在 addons.yml 中打开三个附加组件,并确认 -e key=value 和 JSON 格式在 boilerplate 检查中如何被不同地解析。安装之后,依次确认 kubectl top 和 APIService、PVC 绑定到节点磁盘的情形,以及用 kubespray 安装的 Helm 创建的 release,并从 calico 的 IP 池中读取封装方式。