饮墨

子安饮墨馀三斗,留与卿儿作赋来

Talos Linux 实战:不可变操作系统让 Kubernetes 节点管理告别 SSH

1 views

痛点

运维 Kubernetes 集群,节点层面最头疼的三件事:

  1. 配置漂移 — 某个节点被人手动装了包、改了内核参数,排查问题时才发现和其他节点不一致
  2. 安全攻击面大 — 每个节点跑着 SSH、systemd 服务、包管理器,一旦容器逃逸就能拿到完整 shell
  3. 升级维护成本高 — 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 的安全感"。