Nur*_*rza 5 migration external internals etcd kubernetes
一年前,我使用外部 etcd 集群(3 个成员)创建了一个 Kubernetes 集群。
当时,我不知道可以在内部创建一个 etcd,所以我创建了一个外部集群并将 Kubernetes 连接到它。
现在我发现内部集群是一个东西,它是一个更干净的解决方案,因为当您更新 Kubernetes 集群时,etcd 节点也会更新。
我找不到一个干净的解决方案来将外部 etcd 集群迁移到内部集群。我希望有一个零停机的解决方案。请问您知道是否可能吗?
感谢您的回复,祝您有美好的一天!
据我了解,您有 3 个 etcd 集群成员,从 Kubernetes 集群的角度来看,它们是外部的。预期结果是所有三个成员都在 Kubernetes 主节点上运行。有一些信息未公开,因此我尝试解释几种可能的选择。
首先,有几种合理的方法来运行 etcd 进程以用作 Kubernetes 控制平面键值存储:
/etc/kubernetes/manifests/etcd.yamletcd 作为静态 pod 运行,在文件中具有启动配置/etc/systemd/system/etcd.serviceetcd 作为定义在或类似文件中的系统服务运行出于实验目的,您还可以运行 etcd:
我个人的建议是拥有 5 个成员的 etcd 集群:3 个成员作为静态 Pod 在 3 个主 kubernetes 节点上运行,另外两个成员作为静态 Pod 在外部(独立于 Kubernetes 集群的)主机上运行。在这种情况下,如果您至少有一个主节点正在运行,或者由于任何原因失去了两个外部节点,您仍然拥有法定人数。
至少有两种方法可以将 etcd 集群从外部实例迁移到 Kubernetes 集群主节点。它也以相反的方式起作用。
这是迁移集群的非常简单的方法。在此过程中,成员将被关闭(一次一个),移动到另一台主机并再次启动。当 etcd 集群中仍有仲裁时,您的集群不应该出现任何问题。我的建议是至少有 3 个或更好的 5 个节点的 etcd 集群,以使迁移更安全。对于更大的集群,使用我的第二个答案中的其他解决方案可能更方便。
官方文档描述了将 etcd 成员移动到另一个 IP 地址的过程:
迁移成员:
- 停止成员进程。
- 将当前空闲成员的数据目录复制到新机器。
- 根据运行时重新配置指令更新被替换成员的对等 URL 以反映新计算机。
- 在新机器上启动 etcd,使用相同的配置和数据目录的副本。
现在让我们仔细看看每一步:
0.1 确保你的etcd集群是健康的并且所有成员都处于良好状态。我建议还检查所有 etcd 成员的日志,以防万一。
(要成功运行以下命令,请参阅步骤 3 了解身份验证变量和别名)
# last two commands only show you members specified by using --endpoints command line option
# the following commands is suppose to run with root privileges because certificates are not accessible by regular user
e2 cluster-health
e3 endpoint health
e3 endpoint status
Run Code Online (Sandbox Code Playgroud)
0.2 检查每个etcd成员配置并找出etcd data-dir所在的位置,然后确保在etcd进程终止后仍可访问。在大多数情况下,它位于主机上的 /var/lib/etcd 下,直接使用或作为卷安装到 etcd pod 或 docker 容器。
0.3为每个etcd集群成员创建一个快照,最好不要使用,也不要没有。
1. 停止etcd成员进程。
如果您使用kubelet启动 etcd,按照此处的建议,将 etcd.yaml文件移出/etc/kubernetes/manifests/. 之后,etcd Pod 将被终止kubelet:
sudo mv /etc/kubernetes/manifests/etcd.yaml ~/
sudo chmod 644 ~/etcd.yaml
Run Code Online (Sandbox Code Playgroud)
如果您将 etcd 进程作为 systemd 服务启动,您可以使用以下命令停止它:
sudo systemctl stop etcd-service-name.service
Run Code Online (Sandbox Code Playgroud)
如果是 docker 容器,您可以使用以下命令停止它:
docker ps -a
docker stop <etcd_container_id>
docker rm <etcd_container_id>
Run Code Online (Sandbox Code Playgroud)
如果从命令行运行 etcd 进程,则可以使用以下命令终止它:
kill `pgrep etcd`
Run Code Online (Sandbox Code Playgroud)
2. 将当前空闲成员的数据目录复制到新机器。
这里没有太多复杂性。将 etcd data-dir 压缩到文件并将其复制到目标实例。如果您计划以相同的方式在新实例上运行 etcd,我还建议复制 etcd 清单或 systemd 服务配置。
tar -C /var/lib -czf etcd-member-name-data.tar.gz etcd
tar -czf etcd-member-name-conf.tar.gz [etcd.yaml] [/etc/systemd/system/etcd.service] [/etc/kubernetes/manifests/etcd.conf ...]
scp etcd-member-name-data.tar.gz destination_host:~/
scp etcd-member-name-conf.tar.gz destination_host:~/
Run Code Online (Sandbox Code Playgroud)
3.根据运行时重新配置指令更新被替换成员的对等 URL以反映新成员 IP 地址。
有两种方法可以做到这一点:使用etcd API或运行etcdctl实用程序。
这就是方式etcdctl的样子:(
用正确的 etcd 集群成员 IP 地址替换 etcd 端点变量)
# all etcd cluster members should be specified
export ETCDSRV="--endpoints https://etcd.ip.addr.one:2379,https://etcd.ip.addr.two:2379,https://etcd.ip.addr.three:2379"
#authentication parameters for v2 and v3 etcdctl APIs
export ETCDAUTH2="--ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/peer.crt --key-file /etc/kubernetes/pki/etcd/peer.key"
export ETCDAUTH3="--cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key"
# etcdctl API v3 alias
alias e3="ETCDCTL_API=3 etcdctl $ETCDAUTH3 $ETCDSRV"
# etcdctl API v2 alias
alias e2="ETCDCTL_API=2 etcdctl $ETCDAUTH2 $ETCDSRV"
# list all etcd cluster members and their IDs
e2 member list
e2 member update member_id http://new.etcd.member.ip:2380
#or
e3 member update member_id --peer-urls="https://new.etcd.member.ip:2380"
Run Code Online (Sandbox Code Playgroud)
这就是方式etcd API的样子:
export CURL_ETCD_AUTH="--cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt"
curl https://health.etcd.istance.ip:2379/v2/members/member_id -XPUT -H "Content-Type: application/json" -d '{"peerURLs":["http://new.etcd.member.ip:2380"]}' ${CURL_ETCD_AUTH}
Run Code Online (Sandbox Code Playgroud)
4. 在新机器上启动etcd,使用调整后的配置和数据目录的副本。
在新主机上解压 etcd data-dir:
tar -xzf etcd-member-name-data.tar.gz -C /var/lib/
Run Code Online (Sandbox Code Playgroud)
根据您的需要调整etcd启动配置。此时很容易选择另一种方式来运行 etcd。根据您的选择,准备清单或服务定义文件,并将旧 IP 地址替换为新 IP 地址。例如:
sed -i 's/\/10.128.0.12:/\/10.128.0.99:/g' etcd.yaml
Run Code Online (Sandbox Code Playgroud)
现在是时候通过移动etcd.yaml到/etc/kubernetes/manifests/或运行以下命令来启动 etcd(如果您etcd作为systemd服务运行)
sudo systemctl start etcd-service-name.service
Run Code Online (Sandbox Code Playgroud)
5. 检查更新的 etcd 进程日志和 etcd 集群运行状况,以确保成员运行状况良好。
为此,您可以使用以下命令:
$ e2 cluster-health
$ kubectl logs etct_pod_name -n kube-system
$ docker logs etcd_container_id 2>&1 | less
$ journalctl -e -u etcd_service_name
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2774 次 |
| 最近记录: |