国内环境部署kubernetes

国内环境部署kubernetes

文档说明 本文档适用于国内环境下基于 Ubuntu 24.04 LTS 部署 Kubernetes 1.34 集群,采用 1 台 Master 节点 + 1 台 Node 节点架构,通过本地代理服务器直接从 k8s.io 官方源拉取镜像,规避国内镜像源同步延迟问题。

目录

环境准备 前置基础配置(所有节点) 代理配置(所有节点) 安装容器时(containerd) 安装 kubeadm、kubelet、kubectl 初始化 Master 节点 安装网络插件(Flannel) Node 节点加入集群 集群验证 常见问题排查

  1. 环境准备

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

  1. 前置基础配置(所有节点执行)

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
  1. 代理配置(所有节点执行)
    # 创建 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
  2. 安装容器时(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
  3. 安装 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
  1. 初始化 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
  1. 安装网络插件(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
  2. 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
  1. 集群验证(仅 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
  1. 常见问题排查

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

Comments

No comments yet. Why don’t you start the discussion?

发表回复