文档说明 本文档适用于国内环境下基于 Ubuntu 24.04 LTS 部署 Kubernetes 1.34 集群,采用 1 台 Master 节点 + 1 台 Node 节点架构,通过本地代理服务器直接从 k8s.io 官方源拉取镜像,规避国内镜像源同步延迟问题。
目录
环境准备 前置基础配置(所有节点) 代理配置(所有节点) 安装容器时(containerd) 安装 kubeadm、kubelet、kubectl 初始化 Master 节点 安装网络插件(Flannel) Node 节点加入集群 集群验证 常见问题排查
- 环境准备
1.1 服务器规划
| 节点角色 | 主机名 | IP 地址 | 操作系统 | 硬件配置 |
|---|---|---|---|---|
| Master | k8s-master | 192.168.1.100 | Ubuntu 24.04 LTS x86_64 | 2 核 4G 及以上 |
| Node | k8s-node | 192.168.1.101 | Ubuntu 24.04 LTS x86_64 | 2 核 2G 及以上 |
| 代理服务器 | proxy-server | 192.168.1.200 | 任意 Linux 系统 | 能访问外网即可 |
1.2 网络要求
所有节点互通(Master/Node/ 代理服务器) 代理服务器能访问外网(k8s.io、gcr.io、github.com 等) 节点防火墙放行 K8s 核心端口:6443(apiserver)、2379-2380(etcd)、10250(kubelet)、10251/10252(kube-scheduler/kube-controller-manager)、8472(Flannel VXLAN)
1.3 软件版本
Kubernetes:1.34.0 容器时:containerd 1.7.11(Ubuntu 24.04 官方源兼容版本) 网络插件:Flannel v0.25.0
- 前置基础配置(所有节点执行)
2.1 关闭防火墙、AppArmor(可选)、Swap
# 关闭并禁用 UFW 防火墙(Ubuntu 默认防火墙)
sudo systemctl stop ufw && sudo systemctl disable ufw
# 关闭 Swap(K8s 要求)
sudo swapoff -a
# 永久禁用 Swap(注释 fstab 中的 swap 行)
sudo sed -i '/swap/s/^/#/' /etc/fstab
# 验证 Swap 已关闭
sudo swapon --show # 无输出则生效
2.2 配置主机名和 Hosts
# Master 节点设置主机名
sudo hostnamectl set-hostname k8s-master
# Node 节点设置主机名
sudo hostnamectl set-hostname k8s-node
# 配置 Hosts(所有节点)
sudo tee -a /etc/hosts << EOF
192.168.1.100 k8s-master
192.168.1.101 k8s-node
192.168.1.200 proxy-server
EOF
2.3 时间同步(Ubuntu 24.04 默认用 systemd-timesyncd)
# 确保时间同步服务
sudo systemctl start systemd-timesyncd && sudo systemctl enable systemd-timesyncd
# 验证时间同步状态
timedatectl status
2.4 调整内核参数
# 添加内核模块
sudo tee /etc/modules-load.d/k8s.conf << EOF
overlay
br_netfilter
EOF
# 加载模块
sudo modprobe overlay && sudo modprobe br_netfilter
# 配置内核参数(开启 IP 转发、桥接网络)
sudo tee /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 生效内核参数
sudo sysctl --system
2.5 配置 IPVS(可选,提升 kube-proxy 性能)
# 安装 IPVS 工具
sudo apt update && sudo apt install -y ipset ipvsadm
# 添加 IPVS 内核模块
sudo tee /etc/modules-load.d/ipvs.conf << EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
# 加载模块
sudo modprobe ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack
# 验证模块加载
lsmod | grep -e ip_vs -e nf_conntrack
- 代理配置(所有节点执行)
# 创建 containerd.service.d 配置目录 sudo mkdir -p /etc/systemd/system/containerd.service.d/ sudo tee /etc/systemd/system/containerd.service.d/http-proxy.conf << EOF [Service] Environment="HTTP_PROXY=socks5://192.168.1.200:10808" Environment="HTTPS_PROXY=socks5://192.168.1.200:10808" Environment="NO_PROXY=localhost,127.0.0.1 EOF systemctl daemon-reload systemctl restart containerd - 安装容器时(containerd)(所有节点执行)
Ubuntu 24.04 推荐通过官方源安装 containerd,比二进制方式更简便:
# 安装 containerd 及依赖 sudo apt install -y containerd # 创建 containerd 配置目录 sudo mkdir -p /etc/containerd # 生成 containerd 默认配置 sudo containerd config default | sudo tee /etc/containerd/config.toml # 修改配置:启用 SystemdCgroup、替换 sandbox 镜像、引入代理配置 # 1. 启用 Systemd 控制组(K8s 推荐) sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml # 2. 替换 pause 镜像为1.34支持的版本,可使用kubeadm config images list 查看 sudo sed -i 's/registry.k8s.io\/pause:3.8/k8s.gcr.io\/pause:3.10.1/g' /etc/containerd/config.toml # 重启 containerd 并设置开机自启 sudo systemctl restart containerd && sudo systemctl enable containerd # 验证安装 containerd --version - 安装 kubeadm、kubelet、kubectl(所有节点执行)
5.1 配置 K8s 官方 APT 源
# 安装依赖包
sudo apt install -y apt-transport-https ca-certificates curl gpg
# 添加 K8s GPG 密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-1.34.gpg
# 添加 K8s 源(通过代理访问官方源)
echo "deb [signed-by=/etc/apt/trusted.gpg.d/kubernetes-1.34.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 更新 APT 缓存
sudo apt update
5.2 安装指定版本
# 安装 kubeadm、kubelet、kubectl 1.34.0(锁定版本防止自动更新)
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
- 初始化 Master 节点(仅 Master 执行)
6.1 预拉取镜像(验证代理是否生效)
sudo kubeadm config images pull \
--kubernetes-version=v1.34.0 \
--image-repository=k8s.gcr.io
6.2 初始化集群
sudo kubeadm init \
--kubernetes-version=v1.34.0 \
--image-repository=k8s.gcr.io \
--apiserver-advertise-address=192.168.1.100 \
--pod-network-cidr=10.244.0.0/16 \ # Flannel 适配的网段
--service-cidr=10.96.0.0/12 \
--ignore-preflight-errors=Swap # 如未重启关闭 Swap,添加此参数
# 初始化成功后,会输出 Node 节点加入集群的命令,务必保存!
# 示例:kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx
6.3 配置 kubectl 环境(Master 节点)
# 普通用户配置(推荐)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 根用户配置(可选)
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" | sudo tee -a /etc/profile
source /etc/profile
- 安装网络插件(Flannel)(仅 Master 执行)
# 下载并应用 Flannel 配置(通过代理) kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.25.0/Documentation/kube-flannel.yml # 验证网络插件状态(Running 则正常) kubectl get pods -n kube-flannel - Node 节点加入集群(仅 Node 执行)
8.1 执行 Master 初始化后的 join 命令
# 替换为实际的 join 命令(从 Master 初始化输出中复制)
sudo kubeadm join 192.168.1.100:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
# 如 token 过期,在 Master 节点重新生成:
# sudo kubeadm token create --print-join-command
- 集群验证(仅 Master 执行)
9.1 检查节点状态
kubectl get nodes
# 正常输出:两个节点 STATUS 为 Ready,ROLES 分别为 control-plane,master 和 node
9.2 检查系统组件状态
kubectl get pods -n kube-system
# 所有 Pod 应处于 Running 状态(coredns、kube-proxy、flannel、etcd、apiserver 等)
9.3 验证集群功能
# 创建测试 Pod
kubectl run nginx --image=nginx:alpine --port=80
# 暴露 Service(NodePort 类型)
kubectl expose pod nginx --type=NodePort --port=80
# 查看 Service 端口(NODE_PORT 列)
kubectl get svc nginx
# 访问测试(替换为 Node IP 和实际 NodePort)
curl http://192.168.1.101:30xxx
- 常见问题排查
10.1 镜像拉取失败
检查代理连通性:curl -x http://192.168.1.200:18080 https://k8s.gcr.io
验证 no_proxy 配置:确保包含内网网段(192.168.1.0/24、10.0.0.0/8 等)
查看 containerd 日志:sudo journalctl -u containerd -f
10.2 Node 节点状态 NotReady
检查 Flannel 插件:kubectl get pods -n kube-flannel(需 Running)
检查节点间网络:ping 192.168.1.100(Node 能通 Master)
查看 kubelet 日志:sudo journalctl -u kubelet -f
10.3 APT 安装 k8s 包失败
检查 GPG 密钥是否正确:sudo apt-key list | grep kubernetes
确认代理能访问 pkgs.k8s.io:curl -x http://192.168.1.200:18080 https://pkgs.k8s.io/core:/stable:/v1.34/deb/
10.4 Swap 未完全关闭
强制关闭:sudo swapoff -a && sudo sysctl vm.swappiness=0
重启节点后再次验证:swapon –show
附录:常用命令
# 查看集群信息
kubectl cluster-info
# 查看节点详细信息
kubectl describe node k8s-node
# 重启 kubelet
sudo systemctl restart kubelet
# 重置集群(如需重新部署)
sudo kubeadm reset -f
sudo rm -rf /etc/cni/net.d ~/.kube/config