三主节点K8s集群离线部署指南
为构建一个包含三个主节点(高可用控制平面)和若干工作节点的 Kubernetes 集群,您的离线部署方案需要进行针对性调整。核心在于高可用组件的部署以及证书的同步。以下是详细的离线安装部署步骤及需要补充下载的资源清单。
一、 三主节点集群架构与核心组件
在标准单主节点集群中,kubeadm init 初始化第一个主节点。在三主节点高可用(HA)集群中,我们需要:
- 负载均衡器:为所有主节点的 API Server 提供一个单一的访问端点(VIP)。
- 高可用控制平面:在三个主节点上运行
etcd、kube-apiserver、kube-controller-manager、kube-scheduler的多个实例。 - 证书共享:第一个主节点生成的集群证书需要安全地分发给其他主节点。
常见的 HA 部署方案是使用 Keepalived + HAProxy 或一个外部的负载均衡器。这里以 Keepalived + HAProxy 方案为例,因为它可以在完全离线的环境中部署 。
二、 需补充下载的离线资源(在联网下载机上操作)
在您之前准备的 k8s-offline-packages 基础上,需要增加以下高可用组件和相关配置。
# 在您的下载机上,进入资源目录
cd ~/k8s-offline-packages
# 1. 创建高可用组件目录
mkdir -p ha/{debs, configs, binaries}
# 2. 下载 Keepalived 和 HAProxy 的安装包
cd ha/debs
apt-get download keepalived haproxy
# 3. 下载 etcd 的 Docker 镜像(如果 kubeadm 未包含)
cd ../..
cd images
# 通常 kubeadm 会拉取 etcd 镜像。为确保离线环境有,可以显式拉取并保存
sudo docker pull registry.aliyuncs.com/google_containers/etcd:3.5.14-0
sudo docker save -o etcd-image.tar registry.aliyuncs.com/google_containers/etcd:3.5.14-0
# 4. 准备高可用配置文件模板
cd ../ha/configs
# 4.1 HAProxy 配置文件模板 (haproxy.cfg)
cat > haproxy.cfg << 'EOF'
global
log /dev/log local0
log /dev/log local1 notice
daemon
defaults
log global
mode tcp
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend k8s-api
bind *:16443
option tcplog
default_backend k8s-api-servers
backend k8s-api-servers
balance roundrobin
server k8s-master-1 <MASTER_1_IP>:6443 check
server k8s-master-2 <MASTER_2_IP>:6443 check
server k8s-master-3 <MASTER_3_IP>:6443 check
EOF
# 4.2 Keepalived 配置文件模板 (keepalived.conf)
cat > keepalived.conf << 'EOF'
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface <NETWORK_INTERFACE> # 例如:ens33
virtual_router_id 51
priority <PRIORITY> # 三个节点不同,如 100, 90, 80
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
<VIRTUAL_IP>/24 # 例如:192.168.1.100
}
track_script {
chk_haproxy
}
}
EOF
# 5. 准备 kubeadm 高可用初始化配置文件
cd ~/k8s-offline-packages/configs
cat > kubeadm-config-ha.yaml << 'EOF'
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.30.0
controlPlaneEndpoint: "<VIRTUAL_IP>:16443" # 使用 VIP 和 HAProxy 端口
imageRepository: registry.aliyuncs.com/google_containers
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
apiServer:
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
scheduler: {}
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: <CURRENT_MASTER_IP> # 每个主节点初始化时替换为自己的IP
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/cri-dockerd.sock
kubeletExtraArgs:
cgroup-driver: systemd
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
controlPlane:
localAPIEndpoint:
advertiseAddress: <CURRENT_MASTER_IP> # 后续加入的主节点替换为自己的IP
bindPort: 6443
certificateKey: "<CERTIFICATE_KEY>" # 从第一个主节点初始化输出中获取
discovery:
bootstrapToken:
apiServerEndpoint: <VIRTUAL_IP>:16443
token: abcdef.0123456789abcdef
caCertHashes:
- sha256:<HASH_VALUE>
nodeRegistration:
criSocket: unix:///var/run/cri-dockerd.sock
kubeletExtraArgs:
cgroup-driver: systemd
EOF
三、 离线部署详细步骤(三主多从)
假设您已将补充后的 k8s-offline-packages 目录传输到所有目标服务器(3个Master,N个Worker)的 /opt/ 目录下。
步骤 0: 所有节点公共前置操作
在所有 Master 和 Worker 节点上执行以下操作,与单主节点方案基本一致 。
# 1. 系统初始化(禁用Swap,加载内核模块,配置内核参数)
sudo swapoff -a && sudo sed -i '/swap/s/^/#/' /etc/fstab
sudo cp /opt/k8s-offline-packages/configs/modules-k8s.conf /etc/modules-load.d/
sudo modprobe overlay && sudo modprobe br_netfilter
sudo cp /opt/k8s-offline-packages/configs/k8s.conf /etc/sysctl.d/ && sudo sysctl --system
# 2. 离线安装 Docker
cd /opt/k8s-offline-packages/debs
sudo dpkg -i docker-ce*.deb containerd.io*.deb docker-ce-cli*.deb docker-buildx-plugin*.deb docker-compose-plugin*.deb
sudo cp /opt/k8s-offline-packages/configs/daemon.json /etc/docker/
sudo systemctl daemon-reload && sudo systemctl restart docker && sudo systemctl enable docker
# 3. 加载所有必需的 Docker 镜像
cd /opt/k8s-offline-packages/images
for img in $(ls *.tar); do sudo docker load -i $img; done
# 4. 离线安装 cri-dockerd (使用预编译二进制)
cd /opt/k8s-offline-packages/binaries
tar zxf cri-dockerd-0.3.21.amd64.tgz
sudo install -o root -g root -m 0755 ./cri-dockerd/cri-dockerd /usr/local/bin/cri-dockerd
sudo cp /opt/k8s-offline-packages/configs/cri-docker.service /etc/systemd/system/
sudo cp /opt/k8s-offline-packages/configs/cri-docker.socket /etc/systemd/system/
# 修改 pause 镜像源为本地已有镜像
sudo sed -i 's|--pod-infra-container-image=.*|--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10.1|' /etc/systemd/system/cri-docker.service
sudo systemctl daemon-reload && sudo systemctl enable --now cri-docker
# 5. 离线安装 kubelet, kubeadm, kubectl
cd /opt/k8s-offline-packages/debs
sudo dpkg -i kubelet_1.30.0-00_amd64.deb kubeadm_1.30.0-00_amd64.deb kubectl_1.30.0-00_amd64.deb
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable kubelet
步骤 1: 在所有 Master 节点上部署 Keepalived + HAProxy
在每个 Master 节点(例如:master-1, master-2, master-3)上执行。
# 1. 安装 Keepalived 和 HAProxy
cd /opt/k8s-offline-packages/ha/debs
sudo dpkg -i keepalived*.deb haproxy*.deb
# 2. 配置 HAProxy
# 编辑配置文件,将 <MASTER_X_IP> 替换为三个 Master 节点的实际 IP
sudo cp /opt/k8s-offline-packages/ha/configs/haproxy.cfg /etc/haproxy/
# 使用 sed 或 vi 修改配置文件
sudo sed -i 's/<MASTER_1_IP>/192.168.1.101/g; s/<MASTER_2_IP>/192.168.1.102/g; s/<MASTER_3_IP>/192.168.1.103/g' /etc/haproxy/haproxy.cfg
sudo systemctl restart haproxy && sudo systemctl enable haproxy
# 3. 配置 Keepalived
# 编辑配置文件,替换网络接口、优先级和虚拟IP
sudo cp /opt/k8s-offline-packages/ha/configs/keepalived.conf /etc/keepalived/
# 在 master-1 上设置 priority 100, master-2 上 90, master-3 上 80
# 假设虚拟IP为 192.168.1.100, 网络接口为 ens33
sudo sed -i 's/<NETWORK_INTERFACE>/ens33/g; s/<PRIORITY>/100/g; s/<VIRTUAL_IP>/192.168.1.100/g' /etc/keepalived/keepalived.conf
sudo systemctl restart keepalived && sudo systemctl enable keepalived
步骤 2: 在第一个 Master 节点(master-1)上初始化集群
# 1. 准备 kubeadm 配置文件
cd /opt/k8s-offline-packages/configs
cp kubeadm-config-ha.yaml kubeadm-config-master1.yaml
# 使用实际IP和VIP替换配置文件中的占位符
sudo sed -i 's/<VIRTUAL_IP>/192.168.1.100/g; s/<CURRENT_MASTER_IP>/192.168.1.101/g' kubeadm-config-master1.yaml
# 2. 使用配置文件初始化集群 (关键步骤)
sudo kubeadm init --config=kubeadm-config-master1.yaml --upload-certs
# 3. 初始化成功后会输出几行重要信息,请务必保存:
# - 用于其他控制平面节点加入的 `kubeadm join` 命令(包含 `--control-plane` 和 `--certificate-key`)
# - 用于工作节点加入的 `kubeadm join` 命令
# - `certificate-key` 用于加密证书,在后续主节点加入时使用
# 4. 配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 5. 部署网络插件 (例如 Flannel)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 离线环境下,需要提前下载此 yaml 文件并修改其中的镜像地址为本地镜像名
# 或者,如果您已导入 flannel 镜像,可以创建一个本地的 flannel.yaml 文件进行部署
步骤 3: 在第二、三个 Master 节点上加入集群作为控制平面
在 master-2 和 master-3 上执行。
使用步骤2中保存的、包含 --control-plane 和 --certificate-key 的完整 kubeadm join 命令。命令格式如下:
# 在 master-2 (IP: 192.168.1.102) 上执行
sudo kubeadm join 192.168.1.100:16443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane \
--certificate-key <certificate-key> \
--apiserver-advertise-address=192.168.1.102 \
--cri-socket unix:///var/run/cri-dockerd.sock
# 加入后,同样配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
注意:<token>, <hash>, <certificate-key> 需替换为 master-1 初始化时的实际输出。--apiserver-advertise-address 需设置为当前节点的 IP 。
步骤 4: 在所有 Worker 节点上加入集群
在所有 Worker 节点上执行。
使用步骤2中保存的、不包含 --control-plane 的 kubeadm join 命令。
# 在 worker 节点上执行
sudo kubeadm join 192.168.1.100:16443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--cri-socket unix:///var/run/cri-dockerd.sock
步骤 5: 验证集群状态
在任意一个 Master 节点上执行:
# 查看节点状态,应看到所有 Master 和 Worker 节点 Ready
kubectl get nodes -o wide
# 查看所有命名空间的 Pod 状态
kubectl get pods --all-namespaces -o wide
如果所有组件都正常运行,您将看到一个包含三个 Ready,SchedulingDisabled 状态的主节点和若干个 Ready 状态的工作节点的集群 。
四、 离线部署三主节点集群的关键要点总结
| 关键任务 | 操作要点 | 参考来源 |
|---|---|---|
| 负载均衡 | 在所有 Master 节点部署 Keepalived+HAProxy,提供 VIP (` | |
| 192.168.1.100:16443`) 作为统一入口。 | ||
| 初始化 | 仅在第一个 Master 节点执行 kubeadm init,并使用 --upload-certs 参数上传证书。 | |
| 控制平面扩展 | 在其他 Master 节点使用包含 --control-plane 和 --certificate-key 的 kubeadm join 命令加入。 | |
| 工作节点加入 | Worker 节点使用普通的 kubeadm join 命令,指向 VIP 地址。 | |
| 离线核心 | 所有 .deb 包、二进制文件、Docker 镜像(包括 etcd)必须在联网环境预下载并导入。 | |
| 网络插件 | Flannel 的 YAML 文件需要预先下载,并修改其中的 image: 字段为已导入的本地镜像名。 |
此方案通过预下载所有依赖、配置本地负载均衡,实现了完全离线的、高可用的三主节点 Kubernetes 集群部署。请确保在操作前,根据您的实际网络环境(IP地址、网卡名称)仔细修改所有配置文件中的占位符。
参考来源
更多推荐
所有评论(0)