努力
加油

运行Docker和Kubernetes时建议使用哪个Ubuntu服务器版本?

直接给结论:首选 Ubuntu 22.04 LTS (Jammy Jellyfish),次选 Ubuntu 24.04 LTS (Noble Numbat)。

别去碰 20.04 了,除非你有极其特殊的遗留系统兼容性包袱。也别在生产环境随意尝试非 LTS 版本(如 23.10),那是给尝鲜玩家准备的,不是给运维背锅侠准备的。

下面从几个核心维度拆解为什么这么选,以及你在实际落地时需要注意的“坑”。

1. 内核与硬件支持:LTS 是底线

Docker 和 Kubernetes 对 Linux 内核的特性依赖很重,尤其是 cgroups v2、eBPF 和网络命名空间的管理。

  • Ubuntu 22.04 LTS:搭载 Linux Kernel 5.15。这个版本非常成熟,社区验证充分,对绝大多数云厂商(阿里云、腾讯云、AWS、Azure)的实例类型支持完美。它的稳定性经过了多年生产环境的考验,Bug 率极低。
  • Ubuntu 24.04 LTS:搭载 Linux Kernel 6.5+。如果你跑的是最新一代的云服务器(比如基于 ARM Graviton 3 或者最新的 x86 Genoa/Strix 架构 CPU),24.04 的内核能更好地利用新硬件特性(如更好的 NUMA 感知、更高效的调度)。但要注意,部分较旧的第三方容器网络插件或存储驱动可能在 6.x 内核上需要重新编译或更新版本。

避坑指南:千万不要为了追求“最新”而去用 23.10 或 24.10。Kubernetes 官方对非 LTS 发行版的支持周期很短,一旦中间版本停止维护,你的集群升级路径会断掉,到时候排查问题能把你逼疯。

2. 包管理与依赖冲突:Debian 系的优势

Ubuntu 基于 Debian,这意味着 apt 包管理器是你最好的朋友。相比 CentOS/RHEL 系列,Ubuntu 的软件源更新更快,且默认开启了 unattended-upgrades 的安全补丁自动更新机制。

  • Docker CE:在 Ubuntu 上安装 Docker 官方仓库是最稳妥的方式。docker-ce 包与 Ubuntu 的系统库兼容性最好,很少出现因为 glibc 版本差异导致的二进制文件报错。
  • Kubernetes:虽然 K8s 本身不绑定 OS,但其组件(kubelet, kubeadm, kubectl)在 Ubuntu 上的初始化脚本(init scripts)和社区提供的 Ansible/Terraform 模板覆盖率最高。你遇到的 90% 的问题,网上都有现成的 StackOverflow 答案是基于 Ubuntu 的。

3. 云厂商的“潜规则”与镜像优化

在国内主流云厂商(阿里云、腾讯云、华为云等)中,Ubuntu 镜像通常经过深度定制:

  • 云助手与元数据服务:Ubuntu 官方镜像默认可能没有预装某些云厂商特有的 Agent,但社区版的 Cloud-Init 配置非常完善。相比之下,CentOS Stream 在某些云上已经不再提供最新镜像,或者更新滞后。
  • 安全组与防火墙:Ubuntu 默认使用 ufw(Uncomplicated Firewall),配置简单直观。对于新手来说,比理解 iptables/nftables 的复杂规则要友好得多。但在高并发场景下,建议直接使用云厂商的安全组(Security Group)来管理端口,而不是在 OS 内部层做太多限制,减少性能损耗。

4. 实际部署建议:如何避免“翻车”

既然决定了用 Ubuntu,以下几个实操细节决定了你是“优雅运维”还是“半夜报警”:

A. 禁用 Swap(交换分区)

这是 Kubernetes 的硬性要求。Kubelet 默认会拒绝在启用 Swap 的节点上启动。

# 临时禁用
sudo swapoff -a

# 永久禁用(修改 /etc/fstab,注释掉 swap 行)
sudo sed -i '/swap/s/^/#/' /etc/fstab

注意:如果内存确实不够,不要靠 Swap 续命,而是加机器或扩容内存。Swap 会导致严重的 IO 延迟,直接影响 Pod 的响应时间。

B. 调整 sysctl 参数

为了让 CNI(容器网络接口)和 kube-proxy 工作得更顺畅,建议在 /etc/sysctl.d/99-kubernetes.conf 中添加:

net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

然后执行 sudo sysctl --system 生效。这一步经常被忽略,导致 Pod 之间无法通信。

C. 选择合适的 CRI(容器运行时)

现在默认推荐 containerd 作为底层运行时,而不是老牌的 docker shim(后者已在 K8s 1.24+ 移除)。
Ubuntu 22.04/24.04 默认已集成 containerd。确保你安装的 Docker 版本是最新的,并且配置了正确的 systemd socket。

D. 日志轮转(Log Rotation)

Docker 和 K8s 会产生大量日志。如果不配置 logrotate,磁盘很快会被写满,导致节点宕机。

# 示例:在 /etc/docker/daemon.json 中限制单个容器日志大小
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

总结

维度 推荐选择 理由
操作系统版本 Ubuntu 22.04 LTS 生态最成熟,文档最全,云厂商支持最好,风险最低。
备选版本 Ubuntu 24.04 LTS 适合新项目,硬件支持更好,但需确认所有第三方插件兼容性。
内核版本 5.15+ (22.04) / 6.5+ (24.04) 必须大于 5.0,以支持现代容器特性。
绝对避免 CentOS 7/Stream, Ubuntu 非LTS CentOS 已死,非LTS 版本无长期支持,出事没人管。

最后一句忠告:不管选哪个版本,保持内核和基础软件的定期更新是关键。Ubuntu 的 apt upgrade 比 RHEL 系的 yum update 更流畅,善用这个优势,定期打补丁,能省去 80% 的安全漏洞排查时间。