本文讲述如何在 Ubuntu 24.04 上安装 Kubernetes v1.33.3

一、什么是k8s?

Kubernetes 简称 k8s 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统,其服务、支持和工具的使用范围广泛。

官网:Kubernetes

核心功能:

功能

描述

容器调度

自动选择合适的节点运行容器(Pod)

服务发现和负载均衡

自动为 Pod 分配虚拟 IP 和 DNS 名称

滚动更新与回滚

平滑升级新版本,出问题可自动回滚

自愈能力

容器崩溃自动重启,节点异常自动转移

自动扩缩容

根据资源或流量自动调整副本数量

配置与密钥管理

使用 ConfigMap 和 Secret 管理配置

Kubernetes 适合什么场景?

  • 微服务架构

  • DevOps 持续交付(CI/CD)

  • 云原生应用部署

  • 多租户大规模容器管理

  • 快速弹性扩容

一句话总结:

K8s 就是帮你“自动管理容器”的操作系统。它可以控制容器的运行、健康、自愈、扩容、升级、调度等等,让你不用手动一个个管容器。

二、如何安装?

可以参考k8s官方安装文档:Kubernetes 文档 | Kubernetes

本次案例中,我们使用两台安装有Ubuntu 24.04 系统的物理机中做演示

  • 实例1:Master 节点(k8s-master 192.168.11.120)

  • 实例2:Worker 节点(k8s-worker01 192.168.11.121)

当然你也可以使用虚拟机来进行安装,需要满足以下要求:

  • 保证每台机器 2 GB 或更多的 RAM

  • 控制平面机器(Master节点)需要 2CPU 核心或更多

  • 集群中的所有机器的网络彼此均能相互连接

  • 节点之中不可以有重复的主机名MAC 地址或 product_uuid

一、安装前检查

1.检查操作系统版本

kubeadm 项目支持 LTS 内核。参阅 LTS 内核列表,可以使用命令uname -r获取内核版本。

2.检查Mac地址

你可以使用命令 ip linkifconfig -a 来获取网络接口的 MAC 地址

可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验

一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败

3.检查网络适配器

如果你有一个以上的网络适配器,同时你的 Kubernetes 组件通过默认路由不可达,我们建议你预先添加 IP 路由规则, 这样 Kubernetes 集群就可以通过对应的适配器完成连接。

4.检查所需端口

启用以下端口后才能使 Kubernetes 的各组件相互通信。 可以使用 netcat 之类的工具来检查端口是否开放,例如:nc 127.0.0.1 6443 -zv -w 2

Master节点:

协议

方向

端口范围

目的

使用者

TCP

入站

6443

Kubernetes API 服务器

所有

TCP

入站

2379-2380

etcd 服务器客户端 API

kube-apiserver、etcd

TCP

入站

10250

kubelet API

自身、控制面

TCP

入站

10259

kube-scheduler

自身

TCP

入站

10257

kube-controller-manager

自身

Worker节点:

协议

方向

端口范围

目的

使用者

TCP

入站

10250

kubelet API

自身、控制面

TCP

入站

10256

kube-proxy

自身、负载均衡器

TCP

入站

30000-32767

NodePort Services†

所有

UDP

入站

30000-32767

NodePort Services†

所有

二、关闭交换分区

kubelet 的默认行为是在节点上检测到交换内存时无法启动。 这意味着要么禁用交换(swap)功能,要么让 kubelet 容忍交换

在每个实例上运行以下命令来禁用交换空间。

$ sudo swapoff -a
$ sudo sed -i.bak '/swap/s/^/#/' /etc/fstab

三、加载内核模块

使用modprobe命令加载以下内核模块。为 Kubernetes 网络和容器运行时(如Docker、CRI-O、containerd)准备内核支持。

$ sudo modprobe overlay
$ sudo modprobe br_netfilter

要永久加载这些模块,请创建包含以下内容的文件。

$ sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF

验证加载:

lsmod | grep overlay
lsmod | grep br_netfilter

如果能看到有输出,说明模块已加载。

四、配置 Linux 系统的网络内核参数

Kubernetes 使用 CNI(容器网络接口)插件 连接 Pod,Pod 之间通信时通常走 桥接网络 + 路由转发

  • 如果这些参数没设置,Pod 之间可能无法通信

  • 网络插件(如 Flannel、Calico)也会因为这些参数未启用而安装失败或行为异常

  • kube-proxy 的 NAT 转发、iptables 规则也会不生效

# 写入配置
sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 立即应用这些内核参数
sudo sysctl --system

检查是否生效

sudo sysctl net.bridge.bridge-nf-call-iptables
sudo sysctl net.ipv4.ip_forward

你应该看到值为 1

五、设置 Host Name 更新 hosts 文件

登录到各个主机,并使用hostnamectl命令设置它们各自的主机名。

sudo hostnamectl set-hostname "k8s-master"      // Master Node
sudo hostnamectl set-hostname "k8s-worker01"    // Worker Node 1

登录到各个主机,修改/etc/hosts文件设置 127.0.0.1 为它们各自的 hostname

#Master Node
127.0.1.1 k8s-master
#Worker Node 1
127.0.1.1 k8s-worker01

并将以下行添加到每个实例上的/etc/hosts文件中。

192.168.11.120  k8s-master
192.168.11.121  k8s-worker01

六、更改主机IP地址,改为静态IP获取

登录到各个主机,修改/etc/netplan/50-cloud-init.yaml文件来使服务器获取固定IP,修改完成后使用命令sudo netplan apply来应用配置。示例配置如下:

network:
  version: 2
  ethernets:
    enp3s0:                                 # enp3s0 网卡名称,注意改为你自己的网卡名称
      dhcp4: false                          # 关闭DHCP
      addresses: [192.168.11.120/24]        # 静态 IP 和子网掩码
      routes:
        - to: default
          via: 192.168.11.1                 # 网关
      nameservers:
        addresses: [192.168.11.1,8.8.8.8]   # DNS 服务器
      optional: true

七、安装容器运行时和软件包

为了在 Pod 中运行容器,Kubernetes 使用容器运行时,官网介绍了几个常见的容器运行时的用法,可参考:容器运行时(Container Runtime),这里我们选用CRI-O容器运行时

首先我们需要用su root命令来切换至root用户,在root用户下执行以下操作:

1.定义 Kubernetes 版本和使用的 CRI-O 版本

KUBERNETES_VERSION=v1.33
CRIO_VERSION=v1.33

2.安装用于添加存储库的依赖项

sudo apt-get update
sudo apt-get install -y software-properties-common curl

3.添加 Kubernetes 存储库

curl -fsSL https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/deb/Release.key |
    gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/deb/ /" |
    tee /etc/apt/sources.list.d/kubernetes.list

4.添加 CRI-O 存储库

curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/deb/Release.key |
    gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg

echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/deb/ /" |
    tee /etc/apt/sources.list.d/cri-o.list

5.安装软件包

apt-get update
apt-get install -y cri-o kubelet kubeadm kubectl

6.启动 CRI-O

systemctl start crio.service

八、使用 kubeadm 引导集群

官方推荐使kubeadm 来创建集群,可参考:使用 kubeadm 引导集群

1.初始划Kubernetes 控制平面

使用 kubeadm 初始化 Kubernetes 控制平面(即 master 节点),指定 API Server 访问地址为 k8s-master,并设置 Pod 网络的地址范围为 10.244.0.0/16有关 kubeadm init 参数的更多信息,请参见 kubeadm 参考指南

因为 Flannel 默认使用的 Pod 网络是 10.244.0.0/16,如果你初始化集群时没设置这个,Flannel 就无法工作。

kubeadm init \
  --control-plane-endpoint=k8s-master \
  --pod-network-cidr=10.244.0.0/16

kubeadm init 首先运行一系列预检查以确保机器为运行 Kubernetes 准备就绪。 这些预检查会显示警告并在错误时退出。然后 kubeadm init 下载并安装集群控制平面组件。这可能会需要几分钟。完成之后你应该看到:

记录 kubeadm init 输出的 kubeadm join 命令。 你需要此命令将工作节点加入集群。如果你没复制kubeadm join 命令,可以在 master 节点上执行kubeadm token create --print-join-command来重新生成。

要使非 root 用户可以运行 kubectl, 它们也是 kubeadm init 输出的一部分,使用exit命令退出root用户,然后执行以下命令:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

2.Worker 节点加入集群

进入worker节点命令行,粘贴 kubeadm init 输出的 kubeadm join 命令,看到以下输则代表加入成功。

回到 master 节点,运行 kubectl get nodes 命令来验证 worker 节点的状态。

现在看到 worker 节点已经加入集群,但是 status 是 NotReady ,是因为还没安装 pod 网络附加组件

3.安装 Pod 网络附加组件

安装 Pod 网络附加组件(CNI 插件)是 Kubernetes 集群能否正常通信的关键步骤之一。没有网络插件,Pod 虽然能创建,但它们之间无法通信,Service 也不能访问。

常见的网络插件对比:

插件

特点

Flannel

最简单、最易用,适合小型集群

Calico

支持网络策略、安全控制,性能好

Cilium

使用 eBPF,性能优秀,支持 L7 策略

Weave Net

自动加密,支持多种网络拓扑

Canal

Flannel + Calico 的组合方案

这里我们选用 Flannel 插件,你只需要在 master 节点上执行以下安装命令:

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

安装完成后需等待两分钟,然后再运行 kubectl get nodes 命令来验证 Worker 节点的状态,此时你会看到两个节点的状态都变成了 Ready

运行kubectl get pods -n kube-system查看 kube-system 命名空间中的所有 Pod ,如果你看到所有核心组件的状态都为 Running ,那么恭喜你:你的k8s集群创建成功了!!!