0-先决条件
在开始安装之前,请确保您的环境满足以下先决条件:
- Ubuntu 24.04 LTS 系统。
- 至少 4GB RAM 或更多。
- 至少 2 个 CPU 内核。
- 有 40 GB 可用磁盘空间。
1- 环境准备
集群规划
- k8s-node-1(Master):10.15.0.132
- k8s-node-2(Worker):10.15.0.133
- k8s-node-3(Worker):10.15.0.134
设置主机名,同步 host 文件:
1、设置主机名:
sudo hostnamectl set-hostname k8s-n1
sudo hostnamectl set-hostname k8s-n2
sudo hostnamectl set-hostname k8s-n3
2、同步 host 文件
在每台机器的 /etc/hosts 文件中添加主机名和 IP 的对应关系:
sudo sh -c 'cat >> /etc/hosts <<EOF
10.15.0.132 k8s-n1
10.15.0.133 k8s-n2
10.15.0.134 k8s-n3
EOF'
查看 /etc/hosts 文件,预期结果如下:
在每台机器上,将 DNS 服务器修改成稳定可靠的公共DNS。
编辑 /etc/resolv.conf
文件:
sudo nano /etc/resolv.conf
将其内容修改或确保包含如下内容(可以使用谷歌或国内公共DNS):
nameserver 8.8.8.8 # 谷歌主DNS
nameserver 114.114.114.114 # 国内114DNS
nameserver 223.5.5.5 # 阿里DNS (可作为备选)
在某些系统(如Ubuntu)上,/etc/resolv.conf
可能被网络服务自动覆盖。你需要修改网络配置文件使其永久生效。
如果你使用 Netplan
(常见于Ubuntu 18.04及以后):
找到你的 Netplan 配置文件(通常在 /etc/netplan/
目录下),编辑它:
sudo nano /etc/netplan/50-cloud-init.yaml
在配置中添加 nameservers
部分:
network:version: 2ethernets:ens33: # 你的网卡名称,可能不是ens33,请用 `ip a` 命令确认dhcp4: truenameservers:addresses: [8.8.8.8, 114.114.114.114, 255.5.5.5]
应用配置:
sudo netplan apply
/etc/resolv.conf 文件内容结果如下:
2 - 禁用 Swap 分区,加载内核模块
在每个实例上运行以下命令来禁用交换空间,这样 Kubernetes 集群才能顺利工作。
sudo swapoff -a
sudo sed -i '/swap/ s/^/#/' /etc/fstab
验证禁用 Swap 分区是否成功。如果没任何输出,则说明成功
swapon --show
使用 modprobe 命令加载以下内核模块。
sudo modprobe overlay
sudo modprobe br_netfilter
要永久加载这些模块,请创建包含以下内容的文件。
sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
接下来,添加像 IP 转发这样的内核参数。创建一个文件,并使用 sysctl 命令加载参数。
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
3 - 安装配置 Containerd
Containerd 为 Kubernetes 提供了容器运行时,在所有三个实例上安装 containerd
首先,安装容器依赖项。
sudo apt update
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
添加阿里云 Docker 镜像源
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
现在,使用以下 apt 命令安装 containerd
sudo apt update
sudo apt install containerd.io -y
验证安装:
containerd --version
可能会出现这个异常:
注意:这个时候解决的方法是重新设置一下 DNS 的配置。
接下来,配置 containerd,使其开始使用 SystemdCgroup 运行下面的命令。
- 生成默认配置
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
- 启用 SystemdCgroup
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
为 contained 配置镜像加速源:
- 编辑 containerd 的主配置文件
/etc/containerd/config.toml
,确保其启用了目录模式的配置。 - 执行下面的指令,明确指定镜像加速器配置目录。
sudo sed -i 's|config_path = ""|config_path = "/etc/containerd/certs.d"|g' /etc/containerd/config.toml
- 创建配置目录与文件:
1、为 Docker Hub (docker.io
) 创建对应的配置目录和文件:
sudo mkdir -p /etc/containerd/certs.d/docker.io
sudo nano /etc/containerd/certs.d/docker.io/hosts.toml
将下面的内容粘贴到 hosts.toml 文件中。
server = "https://docker.io" # 原始仓库地址# 镜像加速器列表
[host."https://docker.1panel.live"]capabilities = ["pull", "resolve"]
[host."https://dc.j8.work"]capabilities = ["pull", "resolve"]
[host."https://docker.m.daocloud.io"]capabilities = ["pull", "resolve"]
[host."https://dockerproxy.com"]capabilities = ["pull", "resolve"]
[host."https://docker.mirrors.ustc.edu.cn"]capabilities = ["pull", "resolve"]
[host."https://docker.nju.edu.cn"]capabilities = ["pull", "resolve"]
# 可以保留一个到官方仓库的链接作为后备,但通常加速器已包含
# [host."https://registry-1.docker.io"]
# capabilities = ["pull", "resolve", "push"]
2、为 registry.k8s.io 这个地址也配置加速镜像源。
sudo mkdir -p /etc/containerd/certs.d/registry.k8s.io
sudo nano /etc/containerd/certs.d/registry.k8s.io/hosts.toml
将下面的内容粘贴到 hosts.toml 文件中。
server = "https://registry.k8s.io"[host."https://registry.cn-hangzhou.aliyuncs.com/google_containers"]capabilities = ["pull", "resolve", "push"]
重新启动 containerd 服务,使上述更改生效。
sudo systemctl restart containerd
sudo systemctl enable containerd
查看 /etc/containerd/config.toml 文件,路径已经配置上了。
查看 /etc/containerd/certs.d 目录,也成功生成对应的配置目录。
修改 Containerd 配置,统一 Sandbox 镜像。
sudo sed -i 's|sandbox_image = ".*"|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"|g' /etc/containerd/config.toml
重新启动 containerd 服务,使上述更改生效。
sudo systemctl restart containerd
查看 /etc/containerd/config.toml 文件,sandbox_image 已经被修改。
安装 和 配置 crictl(可选)
crictl
是 Kubernetes 节点上调试容器运行时(CRI)的标准工具,比 ctr
更贴近 Kubelet 的行为。
安装 K8s 时,默认就会安装 crictl 的,这里选择提前安装是为了测试 Containerd 是否可以成功拉取到镜像。
这里使用离线下载,将 crictl 压缩包下载然后上传到所有节点上。
官网地址:https://github.com/kubernetes-sigs/cri-tools
因为我们要安装的 K8s 的版本为 1.30,所以这里选择的 crictl 的版本为 1.34。
sudo tar zxvf crictl-v1.34.0-linux-amd64.tar.gz -C /usr/local/bin
创建配置文件,指定 containerd 的 socket 路径。
- 注意:如果现在不安装 crictl,后面完成 k8s 集群初始化,下面的命令还是要执行的。
cat << EOF | sudo tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
测试拉取 Nginx 镜像,看看配置的镜像源能不能使用。
sudo crictl pull nginx
sudo crictl images
4 - 安装 Kubernetes
4.1. 添加 Kubernetes Package Repository
Kubernetes 软件包在 Ubuntu 24.04 的默认包存储库中不可用,所以要先添加它的存储库。在每个实例上运行这些步骤。
使用 curl 命令下载 Kubernetes 包存储库的公共签名密钥。安装的 kubernetes 版本为 1.30。
- 添加阿里云 Kubernetes 源
sudo curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
- 接下来,通过运行以下命令添加 Kubernetes 存储库。
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
4.2. 安装 Kubernetes 部件 (Kubeadm, kubelet & kubectl)
安装 Kubernetes 组件,在所有实例上运行以下 apt 命令。
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
# 锁定版本,防止意外升级
sudo apt-mark hold kubelet kubeadm kubectl
# 确保 kubelet 已启用(尽管 init 后才会完全正常)
sudo systemctl enable kubelet
4.3. 安装 Kubernetes
所有的先决条件都满足了,我们可以开始安装 Kubernetes 了。
在 master 节点上执行 Kubeadm 命令,仅用于初始化 Kubernetes 集群。
- 预先拉取 Kubernetes 需要的镜像,防止初始化的时候超时错误。
sudo kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
- 执行初始化指令
sudo kubeadm init \--apiserver-advertise-address=10.15.0.132 \--control-plane-endpoint=10.15.0.132 \--image-repository=registry.aliyuncs.com/google_containers \--pod-network-cidr=10.244.0.0/16 \--kubernetes-version=v1.30.0
- apiserver-advertise-address:Master 节点的 IP 地址。
- control-plane-endpoint:Master 节点的 IP 地址。
- image-repository:指定镜像的地址。
- pod-network-cider:强烈建议使用 Kubernetes 社区更常用的网段,如
10.244.0.0/16
(Flannel 默认) 或10.192.0.0/12
(Calico 常用),并确保其与你的物理网络、Service CIDR (10.96.0.0/12
) 都不重叠。 - kubernetes-version:明确指定 Kubernetes 版本,避免歧义。
- 如果初始化错误,则需要重装。重装前需要删除之前安装的资源,执行下面的命令。
sudo kubeadm reset -f
sudo rm -rf /etc/kubernetes/manifests/*
sudo systemctl restart kubelet
成功执行此命令后,我们将得到如下所示的输出。
在上面的输出中,我们将获得一系列命令。例如:如何与 kubernetes 群集互动,如何添加 worker 节点到此群集。
在 master 节点上运行以下命令。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
接下来,从输出中复制命令以连接 woker 节点,在两个 woker 节点上运行它。比如:
kubeadm join 10.15.0.132:6443 --token 11z2ot.9040p3ygy872219i \--discovery-token-ca-cert-hash sha256:8ea22dfe79f85ddbdcec81a139262142da206ea08e360f78aaa712ddb8afb35f
第一个 worker 节点的输出:
第二个 worker 节点的输出:
回到 master 节点,运行 kubectl get nodes 命令来验证 worker 节点的状态。
kubectl get nodes
- 输出确认 worker 节点已加入集群,但状态为 NotReady。我们需要在这个集群上安装 Network Add-on Plugin,例如:Flannel CNI。
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
注意:让 Flannel 的网络配置 与 kubeadm init 指定的 pod-network-cidr 保持一致。因为 Flannel 默认的网段是 10.244.0.0/16,和我们初始化配置时一样,所以不需要更改。
检查状态:
kubectl -n kube-flannel get pods
- 目前网络插件的容器都处于初始化状态。
等待几分钟,等到容器都创建并运行后,我们执行下面命令:
kubectl get pod -A
- 我们可以看到所有的容器都正常运行。K8s 集群就搭建完成了。