ETCD迁移到集群:
在kubeadm部署的Kubernetes集群中停用单节点ETCD并重新搭建高可用三节点ETCD集群,需遵循以下步骤:
一、停用旧ETCD节点
1. 确认ETCD部署方式 • 内置ETCD(kubeadm默认):ETCD以静态Pod形式运行,配置文件位于/etc/kubernetes/manifests/etcd.yaml。
2. 停止旧ETCD节点 • 删除静态Pod配置文件,kubelet自动终止进程: bash 复制 rm /etc/kubernetes/manifests/etcd.yaml • 等待ETCD容器终止后,备份数据目录(可选): bash 复制 cp -r /var/lib/etcd /var/lib/etcd.bak
3. 备份ETCD数据(可选) 使用etcdctl工具备份数据(需旧集群仍可访问): bash 复制 ETCDCTL_API=3 etcdctl --endpoints=https://<旧ETCD节点IP:2379>
--cacert=/etc/kubernetes/pki/etcd/ca.crt
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key
snapshot save /path/to/backup.db
二、部署新ETCD集群
1. 环境准备 • 节点要求:3台新ETCD节点(如etcd-node1、etcd-node2、etcd-node3),关闭防火墙/SELinux,配置时间同步。 • 安装依赖:Docker、kubelet、etcd二进制包或容器镜像。 2. 生成证书 使用cfssl工具生成CA及节点证书(示例): bash 复制 # 生成CA证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
生成ETCD服务器证书
for node in etcd-node1 etcd-node2 etcd-node3; do
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json
-profile=kubernetes server- $ node-csr.json | cfssljson -bare server- $ node
done
3. 配置ETCD节点 在每个ETCD节点创建配置文件etcd.conf.yaml: yaml 复制 name: "etcd-node1"
data-dir: "/var/lib/etcd"
listen-peer-urls: "https://:2380"
listen-client-urls: "https://:2379,http://127.0.0.1:2379"
initial-advertise-peer-urls: "https://:2380"
initial-cluster: "etcd-node1=https://:2380,etcd-node2=https://:2380,etcd-node3=https://:2380"
initial-cluster-state: "new"
cert-file: "/etc/etcd/ssl/server.crt"
key-file: "/etc/etcd/ssl/server.key"
trusted-ca-file: "/etc/etcd/ssl/ca.crt"
peer-cert-file: "/etc/etcd/ssl/peer.crt"
peer-key-file: "/etc/etcd/ssl/peer.key"
peer-trusted-ca-file: "/etc/etcd/ssl/ca.crt"
client-cert-auth: true
peer-client-cert-auth: true
4. 启动ETCD集群 • 将证书和配置文件分发到各节点。 • 启动ETCD服务: bash 复制 systemctl enable --now etcd • 验证集群状态: bash 复制 ETCDCTL_API=3 etcdctl --endpoints=https://<新节点IP:2379>
--cacert=/etc/etcd/ssl/ca.pem
--cert=/etc/etcd/ssl/server.pem
--key=/etc/etcd/ssl/server-key.pem member list
三、更新kubeadm配置并重启控制平面
1. 修改kubeadm配置 编辑kube-system命名空间下的kubeadm-config ConfigMap,更新ClusterConfiguration中的etcd.endpoints: bash 复制 kubectl edit cm kubeadm-config -n kube-system 修改为新ETCD集群地址(如https://etcd-node1:2379,https://etcd-node2:2379,https://etcd-node3:2379)。
2. 重新生成API Server证书 • 若新ETCD使用新证书,需重新生成API Server证书: bash 复制 kubeadm init phase etcd local --config=kubeadm-config.yaml • 更新kube-apiserver.yaml中的证书路径(位于/etc/kubernetes/manifests/)。
3. 重启控制平面组件 删除旧组件的静态Pod配置文件,触发kubelet重新拉取新配置: bash 复制 rm /etc/kubernetes/manifests/kube-apiserver.yaml
rm /etc/kubernetes/manifests/kube-controller-manager.yaml
rm /etc/kubernetes/manifests/kube-scheduler.yaml
四、验证集群状态
1. 检查ETCD健康状态: bash 复制 ETCDCTL_API=3 etcdctl --endpoints=https://<新节点IP:2379>
--cacert=/etc/etcd/ssl/ca.pem
--cert=/etc/etcd/ssl/server.pem
--key=/etc/etcd/ssl/server-key.pem endpoint health
2. 验证Kubernetes组件:
bash 复制 kubectl get pods -A 注意事项 • 证书一致性:确保新ETCD证书与API Server的--etcd-cafile等参数匹配。 • 网络连通性:新ETCD节点需开放2379(客户端)和2380(集群通信)端口。 • 数据恢复:若需恢复旧数据,使用etcdctl snapshot restore命令加载备份文件。 • 高可用性:三节点ETCD集群具备容错能力,但建议定期备份数据。 通过以上步骤,可安全停用旧ETCD节点并启用高可用三节点集群,确保Kubernetes服务的稳定性与可靠性。