gpt4 book ai didi

kubernetes - 在 Kubernetes 集群中,有没有办法将 etcd 从外部迁移到内部?

转载 作者:行者123 更新时间:2023-12-03 22:37:18 46 4
gpt4 key购买 nike

一年前我用外部 etcd 集群(3 个成员)创建了一个 Kubernetes 集群。

有一次,我不知道可以在内部创建一个 etcd,所以我创建了一个外部集群并将 Kubernetes 连接到它。

现在我看到内部集群是一个东西,它是一个更清晰的解决方案,因为当您更新 Kubernetes 集群时,etcd 节点也会更新。

我找不到将外部 etcd 集群迁移到内部集群的干净解决方案。我希望有一个零停机时间的解决方案。请问你知道有没有可能?

感谢您的回复,祝您有美好的一天!

最佳答案

据我所知,从 Kubernetes 集群的角度来看,您有 3 个 etcd 集群成员。预期的结果是让所有三个成员都在 Kubernetes 主节点上运行。
有一些信息未公开,所以我尝试解释几种可能的选择。
首先,有几种合理的方法可以运行 etcd 进程以用作 Kubernetes 控制平面键值存储:

  • etcd 作为静态 pod 运行,在 /etc/kubernetes/manifests/etcd.yaml 中有启动配置文件
  • etcd 作为 /etc/systemd/system/etcd.service 中定义的系统服务运行或类似文件
  • etcd 作为使用命令行选项配置的 docker 容器运行。 (这个解决方案不是很安全,除非你可以在失败或主机重启后重新启动容器)

  • 出于实验目的,您还可以运行 etcd:
  • 作为 linux 用户空间中的一个简单进程
  • 作为 kubernetes 集群中的有状态集
  • 作为由 etcd-operator 管理的 etcd 集群.

  • 我个人的建议是拥有 5 个成员的 etcd 集群:3 个成员在 3 个主 kubernetes 节点上作为静态 pod 运行,另外两个成员在外部(Kubernetes 集群独立)主机上作为静态 pod 运行。在这种情况下,如果您至少有一个主节点在运行,或者由于任何原因丢失了两个外部节点,那么您仍将拥有法定人数。
    至少有两种方法可以将 etcd 集群从外部实例迁移到 Kubernetes 集群主节点。它也以相反的方式工作。
    移民
    这是迁移集群的非常直接的方式。在此过程中,成员被关闭(一次一个),移动到另一台主机并再次启动。当您在 etcd 集群中仍然有仲裁时,您的集群应该没有任何问题。我的建议是至少有 3 个或更好的 5 个节点 etcd 集群,以使迁移更安全。对于更大的集群,使用我的第二个答案中的其他解决方案可能更方便。
    将 etcd 成员移动到另一个 IP 地址的过程在 official documentation 中有所描述。 :

    To migrate a member:

    1. Stop the member process.
    2. Copy the data directory of the now-idle member to the new machine.
    3. Update the peer URLs for the replaced member to reflect the new machine according to the runtime reconfiguration instructions.
    4. Start etcd on the new machine, using the same configuration and the copy of the data directory.

    现在让我们仔细看看每一步:
    0.1 确保您的 etcd 集群健康 并且所有成员都处于良好状态。我还建议检查所有 etcd 成员的日志,以防万一。
    (要成功运行以下命令,请参阅第 3 步中的 auth 变量和别名)
    # 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
    0.2 检查每个etcd成员配置并找出 etcd data-dir 所在的位置,然后确保它在 etcd 进程终止后仍然可以访问。在大多数情况下,它位于主机上的/var/lib/etcd 下,直接使用或作为卷安装到 etcd pod 或 docker 容器。
    0.3 Create a snapshot每个 etcd 集群成员 ,总比没有好,不要用。
    1.停止etcd成员进程。
    如果您使用 kubelet按照建议启动 etcd here , 搬家 etcd.yaml文件超出 /etc/kubernetes/manifests/ .紧接着,etcd Pod 将被 kubelet 终止:
    sudo mv /etc/kubernetes/manifests/etcd.yaml ~/
    sudo chmod 644 ~/etcd.yaml
    如果您启动 etcd 进程 as a systemd service您可以使用以下命令停止它:
    sudo systemctl stop etcd-service-name.service
    如果是 docker 容器,您可以使用以下命令停止它:
    docker ps -a 
    docker stop <etcd_container_id>
    docker rm <etcd_container_id>
    如果从命令行运行 etcd 进程,则可以使用以下命令终止它:
    kill `pgrep etcd`
    2. 将 now-idle 成员的数据目录复制到新机器上。
    这里没有太多复杂性。将 etcd 数据目录压缩到文件并将其复制到目标实例。如果您计划以相同的方式在新实例上运行 etcd,我还建议复制 etcd list 或 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:~/
    3. 更新被替换成员的对等 URL 根据运行时重新配置说明反射(reflect)新成员 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"
    就是这样 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}
    4.在新机器上启动etcd ,使用调整后的配置和数据目录的副本。
    在新主机上解压 etcd 数据目录:
    tar -xzf etcd-member-name-data.tar.gz -C /var/lib/
    根据需要调整 etcd 启动配置。此时很容易选择另一种运行 etcd 的方式。根据您的选择,准备 list 或服务定义文件,并将旧 IP 地址替换为新 IP 地址。例如。:
    sed -i  's/\/10.128.0.12:/\/10.128.0.99:/g' etcd.yaml
    现在是时候通过移动 etcd.yaml 来启动 etcd至 /etc/kubernetes/manifests/ ,或通过运行以下命令(如果您将 etcd 作为 systemd 服务运行)
    sudo systemctl start etcd-service-name.service
    5. 检查更新的 etcd 进程日志和 etcd 集群健康 以确保成员(member) body 健康。
    为此,您可以使用以下命令:
    $ 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

    关于kubernetes - 在 Kubernetes 集群中,有没有办法将 etcd 从外部迁移到内部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54342705/

    46 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com