避坑指南:在 Ubuntu 24.04 完美运行 Kubernetes 1.33.3
本文讲述如何在 Ubuntu 24.04 上安装 Kubernetes v1.33.3
一、什么是k8s?
Kubernetes 简称 k8s 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统,其服务、支持和工具的使用范围广泛。
官网:Kubernetes
核心功能:
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节点)需要 2 个 CPU 核心或更多
集群中的所有机器的网络彼此均能相互连接
节点之中不可以有重复的主机名、MAC 地址或 product_uuid
一、安装前检查
1.检查操作系统版本
kubeadm 项目支持 LTS 内核。参阅 LTS 内核列表,可以使用命令uname -r
获取内核版本。
2.检查Mac地址
你可以使用命令 ip link
或 ifconfig -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节点:
Worker节点:
二、关闭交换分区
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 插件,你只需要在 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集群创建成功了!!!