国内环境部署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

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

2.1 关闭防火墙、AppArmor(可选)、Swap

“`bash
# 关闭并禁用 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
“`bash
# 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) ```bash # 确保时间同步服务 sudo systemctl start systemd-timesyncd && sudo systemctl enable systemd-timesyncd # 验证时间同步状态 timedatectl status ``` 2.4 调整内核参数 ```bash # 添加内核模块 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 性能) ```bash # 安装 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 ``` 3. 代理配置(所有节点执行) ```bash # 创建 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 ``` 4. 安装容器时(containerd)(所有节点执行) Ubuntu 24.04 推荐通过官方源安装 containerd,比二进制方式更简便: ```bash # 安装 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 ``` 5. 安装 kubeadm、kubelet、kubectl(所有节点执行) 5.1 配置 K8s 官方 APT 源 ```bash # 安装依赖包 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 安装指定版本 ```bash # 安装 kubeadm、kubelet、kubectl 1.34.0(锁定版本防止自动更新) sudo apt install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl ``` 6. 初始化 Master 节点(仅 Master 执行) 6.1 预拉取镜像(验证代理是否生效) ```bash sudo kubeadm config images pull \ --kubernetes-version=v1.34.0 \ --image-repository=k8s.gcr.io ``` 6.2 初始化集群 ```bash 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 节点) ```bash # 普通用户配置(推荐) 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 ``` 7. 安装网络插件(Flannel)(仅 Master 执行) ```bash # 下载并应用 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 ``` 8. Node 节点加入集群(仅 Node 执行) 8.1 执行 Master 初始化后的 join 命令 ```bash # 替换为实际的 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 ``` 9. 集群验证(仅 Master 执行) 9.1 检查节点状态 ```bash kubectl get nodes # 正常输出:两个节点 STATUS 为 Ready,ROLES 分别为 control-plane,master 和 node ``` 9.2 检查系统组件状态 ```bash kubectl get pods -n kube-system # 所有 Pod 应处于 Running 状态(coredns、kube-proxy、flannel、etcd、apiserver 等) ``` 9.3 验证集群功能 ```bash # 创建测试 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. 常见问题排查 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 附录:常用命令 ```bash # 查看集群信息 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?

发表回复