社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
etcd是具有一致性和高可用性的键值数据库,可以作为保存Kubernetes所有集群数据的后台数据库,你需要对Kubernetes集群的etcd做备份。
你必须拥有一个 Kubernetes 的集群,同时你的Kubernetes集群必须带有 kubectl 命令行工具。如果你还没有集群,你可以通过如下文档创建一个集群:
k8s1.18多master节点高可用集群安装-超详细中文官方文档
安装kubernetes1.17.3多master节点的高可用集群
获取k8s版本信息,可以输入 kubectl version
运行的 etcd 集群个数成员为奇数。
etcd 是一个 leader-based 分布式系统。确保主节点定期向所有从节点发送心跳,以保持集群稳定。
确保不发生资源不足。
集群的性能和稳定性对网络和磁盘 IO 非常敏感。任何资源匮乏都会导致心跳超时,从而导致集群的不稳定。不稳定的情况表明没有选出任何主节点。在这种情况下,集群不能对其当前状态进行任何更改,这意味着不能调度新的 pod。
保持稳定的etcd集群对Kubernetes集群的稳定性至关重要。因此,请在专用机器或隔离环境上运行etcd集群,以满足所需资源需求。
在生产中运行的 etcd 的最低推荐版本是 3.2.10+
。
使用有限的资源运行 etcd 只适合测试目的。为了在生产中部署,需要先进的硬件配置。
下面介绍如何启动单节点和多节点etcd集群。
1.单节点etcd集群
只为测试目的使用单节点etcd集群。
1)运行以下命令:
./etcd --listen-client-urls=http://$PRIVATE_IP:2379 --advertise-client-urls=http://$PRIVATE_IP:2379
2)使用参数--etcd-servers=$PRIVATE_IP:2379
启动Kubernetes API 服务器。
使用你自己的etcd客户端IP替换PRIVATE_IP
。
为了耐用性和高可用性,在生产中将以多节点集群的方式运行 etcd,并且定期备份。建议在生产中使用五个成员的集群。可以通过静态成员信息或动态发现的方式配置etcd集群。
例如,考虑运行以下客户端URL的五个成员的etcd集群:
http://$IP1:2379
,http://$IP2:2379
,http://$IP3:2379
,http://$IP4:2379
和 http://$IP5:2379
。
要启动Kubernetes API服务器:
1)运行以下命令:
./etcd --listen-client-urls=http://$IP1:2379, http://$IP2:2379, http://$IP3:2379, http://$IP4:2379, http://$IP5:2379 --advertise-client-urls=http://$IP1:2379, http://$IP2:2379, http://$IP3:2379, http://$IP4:2379, http://$IP5:2379
2)使用参数 --etcd-servers=$IP1:2379, $IP2:2379, $IP3:2379, $IP4:2379, $IP5:2379
启动Kubernetes API服务器,用etcd客户端IP地址替换IP
。
要运行负载均衡的etcd集群:
1)建立一个 etcd 集群。
2)在etcd集群前面配置负载均衡器。例如,让负载均衡器的地址为$LB
。
3)使用参数 --etcd-servers=$LB:2379
启动Kubernetes API服务器。
对etcd的访问相当于集群中的root权限,因此理想情况下只有 API 服务器才能访问它。考虑到数据的敏感性,建议只向需要访问etcd集群的节点授予权限。想要确保etcd的安全,可以设置防火墙规则或使用etcd提供的安全特性,这些安全特性依赖于x509公钥基础设施(PKI)。首先,通过生成密钥和证书对来建立安全的通信通道。例如,使用密钥对peer.key
和peer.cert
来保护etcd成员之间的通信,而 client.cert
和client.cert
用于保护etcd与其客户端之间的通信。
若要使用安全对等通信对etcd进行配置,请指定参数 --peer-key-file=peer.key
和--peer-cert-file=peer.cert
,并使用https作为URL模式。
类似地,要使用安全客户端通信对etcd进行配置,请指定参数 --key-file=k8sclient.key
和--cert-file=k8sclient.cert
,并使用https作为URL模式。
配置安全通信后,将 etcd 集群的访问限制在 Kubernetes API 服务器上。使用 TLS 身份验证来完成此任务。例如,考虑由 CA etcd.ca
信任的密钥对 k8sclient.key
和k8sclient.cert
。当etcd配置为--client-cert-auth
和TLS时,它使用系统CA或由 --trusted-ca-file
参数传入的 CA 验证来自客户端的证书。指定参数 --client-cert-auth=true
和--trusted-ca-file=etcd.ca
将限制对具有证书 k8sclient.cert
的客户端的访问。一旦正确配置了 etcd,只有具有有效证书的客户端才能访问它。要让 Kubernetes API 服务器访问,可以使用参数 --etcd-certfile=k8sclient.cert
,--etcd-keyfile=k8sclient.key
和 --etcd-cafile=ca.cert
配置它。
注意: Kubernetes 目前不支持 etcd 身份验证。想要了解更多信息,请参阅相关的问题支持 etcd v2 的基本认证。
etcd 集群通过容忍少数成员故障实现高可用性。但是,要改善集群的整体健康状况,请立即替换失败的成员。当多个成员失败时,逐个替换它们。替换失败成员需要两个步骤:删除失败成员和添加新成员。
虽然etcd在内部保留唯一的成员 ID,但建议为每个成员使用唯一的名称,以避免人为错误。例如,考虑一个三成员的etcd集群。让URL为:
member1=http://10.0.0.1, member2=http://10.0.0.2 和 member3=http://10.0.0.3。当 member1 失败时,将其替换为 member4=http://10.0.0.4。
获取失败的 member1 的成员 ID:
etcdctl --endpoints=http://10.0.0.2,http://10.0.0.3 member list
显示以下信息:
8211f1d0f64f3269, started, member1, http://10.0.0.1:2380, http://10.0.0.1:2379
91bc3c398fb3c146, started, member2, http://10.0.0.2:2380, http://10.0.0.2:2379
fd422379fda50e48, started, member3, http://10.0.0.3:2380, http://10.0.0.3:2379
移除失败的成员
etcdctl member remove 8211f1d0f64f3269
显示以下信息:
Removed member 8211f1d0f64f3269 from cluster
增加新成员:
./etcdctl member add member4 --peer-urls=http://10.0.0.4:2380
显示以下信息:
Member 2be1eb8f84b7f63e added to cluster ef37ad9dc622a7c4
在 IP 为 10.0.0.4
的机器上启动新增加的成员:
export ETCD_NAME="member4"
export ETCD_INITIAL_CLUSTER="member2=http://10.0.0.2:2380,member3=http://10.0.0.3:2380,member4=http://10.0.0.4:2380"
export ETCD_INITIAL_CLUSTER_STATE=existing
etcd [flags]
做以下事情之一:
更新其 --etcd-servers
参数,使 Kubernetes 知道配置进行了更改,然后重新启动 Kubernetes API 服务器。
如果在 deployment 中使用了负载均衡,更新负载均衡配置。
有关集群重新配置的详细信息,请参阅 etcd 重构文档。
所有Kubernetes对象都存储在etcd上。定期备份etcd集群数据对于在灾难场景(例如丢失所有主节点)下恢复 Kubernetes 集群非常重要。快照文件包含所有 Kubernetes 状态和关键信息。为了保证敏感的 Kubernetes 数据的安全,可以对快照文件进行加密。备份 etcd 集群可以通过两种方式完成:etcd 内置快照和卷快照。
etcd 支持内置快照,因此备份etcd集群很容易。快照可以从使用 etcdctl snapshot save
命令的活动成员中获取,也可以通过从etcd数据目录复制member/snap/db
文件,该etcd数据目录目前没有被etcd进程使用。获取快照通常不会影响成员的性能。下面是一个示例,用于获取 $ENDPOINT
所提供的键空间的快照到文件snapshotdb
:
ETCDCTL_API=3 etcdctl --endpoints $ENDPOINT snapshot save snapshotdb
# exit 0
# verify the snapshot
ETCDCTL_API=3 etcdctl --write-out=table snapshot status snapshotdb
+----------+----------+------------+------------+
| HASH | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| fe01cf57 | 10 | 7 | 2.1 MB |
+----------+----------+------------+------------+
如果etcd运行在支持备份的存储卷(如 Amazon Elastic Block 存储)上,则可以通过获取存储卷的快照来备份 etcd 数据。
通过交换性能,扩展 etcd 集群可以提高可用性。缩放不会提高集群性能和能力。一般情况下不要扩大或缩小 etcd 集群的集合。不要为 etcd 集群配置任何自动缩放组。强烈建议始终在任何官方支持的规模上运行生产 Kubernetes 集群时使用静态的五成员 etcd 集群。合理的扩展是在需要更高可靠性的情况下,将三成员集群升级为五成员集群。请参阅 etcd 重新配置文档以了解如何将成员添加到现有集群中的信息。
etcd 支持从 major.minor 或其他不同 patch 版本的 etcd 进程中获取的快照进行恢复。还原操作用于恢复失败的集群的数据。在启动还原操作之前,必须有一个快照文件。它可以是来自以前备份操作的快照文件,也可以是来自剩余数据目录的快照文件。有关从快照文件还原集群的详细信息和示例,请参阅 etcd 灾难恢复文档。如果还原的集群的访问 URL 与前一个集群不同,则必须相应地重新配置 Kubernetes API 服务器。在本例中,使用参数 --etcd-servers=$NEW_ETCD_CLUSTER
而不是参数 --etcd-servers=$OLD_ETCD_CLUSTER
重新启动 Kubernetes API 服务器。用相应的 IP 地址替换 $NEW_ETCD_CLUSTER
和 $OLD_ETCD_CLUSTER
。如果在 etcd 集群前面使用负载平衡,则可能需要更新负载均衡器。
如果大多数 etcd 成员永久失败,则认为 etcd 集群失败。在这种情况下,Kubernetes 不能对其当前状态进行任何更改。虽然已调度的 pod 可能继续运行,但新的 pod 无法调度。在这种情况下,恢复 etcd 集群并可能需要重新配置 Kubernetes API 服务器以修复问题。
从 Kubernetes v1.13.0 开始,不在支持 etcd2 作为新的或现有 Kubernetes 集群的后端。Kubernetes 支持 etcd2 和 etcd3 的时间表如下:
Kubernetes v1.0: 仅限 etcd2
Kubernetes v1.5.1: 添加了 etcd3 支持,新的集群仍默认为 etcd2
Kubernetes v1.6.0: 使用 kube-up.sh
创建的新集群默认为 etcd3,而 kube-apiserver
默认为 etcd3
Kubernetes v1.9.0: 宣布弃用 etcd2 存储后端
Kubernetes v1.13.0: 删除了 etcd2 存储后端,kube-apiserver
将拒绝以 --storage-backend = etcd2
开头,消息 etcd2 不再是支持的存储后端
在使用 --storage-backend = etcd2
升级 v1.12.x kube-apiserver 到 v1.13.x 之前,etcd v2 数据必须迁移到 v3 存储后端,并且 kube-apiserver 调用改为使用 --storage-backend=etcd3
。
从 etcd2 迁移到 etcd3 的过程在很大程度上取决于部署和配置 etcd 集群的方式,以及如何部署和配置 Kubernetes 集群。我们建议您查阅集群提供商的文档,以了解是否存在预定义的解决方案。
如果您的集群是通过 kube-up.sh
创建的并且仍然使用 etcd2 作为其存储后端,请参阅 Kubernetes v1.12 etcd 集群升级文档
在 etcd v3.3.13 或更早版本的 etcd v3 客户端有一个严重的错误,会影响 kube-apiserver 和 HA 部署。etcd 客户端平衡器故障转移不适用于安全端点。结果是,etcd 服务器可能会失败或短暂地与 kube-apiserver 断开连接。这会影响 kube-apiserver HA 的部署。
往期精彩文章回顾
kubernetes全栈技术+企业案例演示【带你快速掌握和使用k8s】
Prometheus+Grafana+Alertmanager搭建全方位的监控告警系统-超详细文档
k8s1.18多master节点高可用集群安装-超详细中文官方文档
jenkins+kubernetes+harbor+gitlab构建企业级devops平台
通过kubeconfig登陆k8s的dashboard ui界面
学无止境,了解更多关于kubernetes/docker/devops/openstack/openshift/linux/IaaS/PaaS相关内容,想要获取更多资料和免费视频,可按如下方式进入技术交流群
扫码加群????
微信:luckylucky421302
长按指纹关注公众号????
点击在看少个 bug????
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!