痛点
运维 Kubernetes 集群,节点层面最头疼的三件事:
- 配置漂移 — 某个节点被人手动装了包、改了内核参数,排查问题时才发现和其他节点不一致
- 安全攻击面大 — 每个节点跑着 SSH、systemd 服务、包管理器,一旦容器逃逸就能拿到完整 shell
- 升级维护成本高 — OS 补丁、内核升级要逐台操作,滚动更新流程复杂且容易出错
传统方案是用 Ansible/Cloud-Init 做配置收敛,但本质上还是"可变基础设施"。节点跑久了,谁也不敢保证状态一致。
Talos Linux 的解法很彻底:去掉 SSH、去掉 shell、去掉包管理器,整个 OS 只通过 API 管理,根文件系统只读不可变。
方案
Talos Linux 是 Sidero Labs 开源的 Kubernetes 专用操作系统,核心设计:
| 特性 | 说明 |
|---|---|
| 不可变根文件系统 | SquashFS 只读挂载,运行时无法修改系统文件 |
| 无 SSH / 无 Shell | 节点没有登录入口,彻底消除人为操作风险 |
| API 驱动管理 | 所有操作通过 talosctl 或 gRPC API 完成 |
| 声明式配置 | 一份 YAML machine config 定义节点完整状态 |
| A/B 分区升级 | 系统升级写入备用分区,失败自动回滚 |
| 最小攻击面 | 无多余进程,内核参数锁定,seccomp 默认启用 |
适用场景:生产 K8s 集群(裸金属 / 云 VM / Edge),对安全合规和一致性要求高的环境。
实操步骤
第 1 步:安装 talosctl 并生成集群配置
# 安装 talosctl(Linux amd64)
curl -sL https://talos.dev/install | sh
# 验证版本
talosctl version --client
# 生成集群配置(含 CA 证书、machine config)
talosctl gen config my-cluster https://10.0.0.10:6443 \
--output-dir _out \
--with-docs=false \
--with-examples=false
生成产物:
- _out/controlplane.yaml — 控制平面节点配置
- _out/worker.yaml — 工作节点配置
- _out/talosconfig — talosctl 客户端认证文件
第 2 步:自定义 Machine Config 并应用
编辑 controlplane.yaml,按需调整关键参数:
machine:
type: controlplane
network:
hostname: cp-01
interfaces:
- interface: eth0
dhcp: true
install:
disk: /dev/sda
image: ghcr.io/siderolabs/installer:v1.9.0
kubelet:
extraArgs:
rotate-server-certificates: "true"
kernel:
modules:
- name: br_netfilter
- name: nf_conntrack
cluster:
controlPlane:
endpoint: https://10.0.0.10:6443
network:
cni:
name: custom
urls:
- https://raw.githubusercontent.com/cilium/cilium/main/install/kubernetes/quick-install.yaml
proxy:
disabled: true # 使用 Cilium 替代 kube-proxy
将配置应用到已启动的 Talos 节点:
# 应用控制平面配置
talosctl apply-config --insecure \
--nodes 10.0.0.11 \
--file _out/controlplane.yaml
# 应用 Worker 配置
talosctl apply-config --insecure \
--nodes 10.0.0.12 \
--file _out/worker.yaml
第 3 步:引导集群并获取 kubeconfig
# 设置 talosctl 端点
export TALOSCONFIG="_out/talosconfig"
talosctl config endpoint 10.0.0.11
talosctl config node 10.0.0.11
# 引导 etcd(仅第一个控制平面节点执行一次)
talosctl bootstrap
# 等待集群就绪,获取 kubeconfig
talosctl kubeconfig -n 10.0.0.11 --force
kubectl get nodes
第 4 步:滚动升级 OS(A/B 分区无缝切换)
# 升级所有节点到新版本(自动 A/B 切换,失败回滚)
talosctl upgrade --nodes 10.0.0.11,10.0.0.12 \
--image ghcr.io/siderolabs/installer:v1.9.1 \
--preserve
# 查看升级状态
talosctl -n 10.0.0.11 get machinestatus
日常运维命令速查
# 查看节点系统日志(替代 SSH + journalctl)
talosctl -n 10.0.0.11 logs kubelet
# 查看内核日志(替代 dmesg)
talosctl -n 10.0.0.11 dmesg
# 查看节点资源使用
talosctl -n 10.0.0.11 stats
# 查看当前 machine config
talosctl -n 10.0.0.11 get machineconfig -o yaml
# 重启节点
talosctl -n 10.0.0.11 reboot
# 紧急恢复:进入维护模式(唯一允许的临时 shell)
talosctl -n 10.0.0.11 reset --graceful=false
避坑指南
坑 1:初次部署忘记配置 talosconfig endpoint 导致连不上节点
talosctl gen config 后必须设置 endpoint,否则所有命令超时。确认:
talosctl config info # 检查 endpoint 和 node 是否正确
坑 2:CNI 选择不当导致集群网络不通
Talos 默认不带 CNI,需要在 machine config 中声明。如果用 Cilium 且禁用了 kube-proxy,务必确保 Cilium 配置了 kubeProxyReplacement: true,否则 Service 不通。
坑 3:磁盘选择错误导致数据盘被格式化
machine.install.disk 务必确认是系统盘。生产环境建议用 /dev/disk/by-id/ 路径指定,避免盘符漂移:
machine:
install:
disk: /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0
总结
Talos Linux 从根本上解决了 K8s 节点管理的三大痛点:
- 一致性:声明式配置 + 不可变文件系统,杜绝配置漂移
- 安全性:无 SSH、无 Shell、最小攻击面,容器逃逸也拿不到有效 shell
- 运维效率:API 驱动 + A/B 分区升级,节点升级从"运维事故高发区"变成一条命令
适合场景:生产 K8s 集群(尤其安全合规要求高的金融、政务场景)、边缘计算节点、大规模集群(100+ 节点统一管理)。
不适合场景:需要在节点上跑非容器化传统应用、团队还没习惯"基础设施即代码"理念的过渡期。
如果你的集群还在用 Ubuntu/CentOS 当节点 OS,建议先在测试环境体验 Talos,感受"没有 SSH 的安全感"。