kubernetes集群的etcd数据库详细介绍 - Go语言中文社区

kubernetes集群的etcd数据库详细介绍


微信公众号搜索DevOps和k8s全栈技术 ,即可关注我的公众号,也可通过扫描文章最后的二维码关注,每天都会分享技术文章供大家参考阅读~,拥抱开源,同大家共同进步~

etcd是什么?

etcd是具有一致性和高可用性的键值数据库,可以作为保存Kubernetes所有集群数据的后台数据库,你需要对Kubernetes集群的etcd做备份。

准备一套k8s环境

你必须拥有一个 Kubernetes 的集群,同时你的Kubernetes集群必须带有 kubectl 命令行工具。如果你还没有集群,你可以通过如下文档创建一个集群:

k8s1.18高可用集群安装-超详细中文官方文档

k8s1.18多master节点高可用集群安装-超详细中文官方文档

kubernetes1.17.3安装-超详细的安装步骤

安装kubernetes1.17.3多master节点的高可用集群

获取k8s版本信息,可以输入 kubectl version

前提条件

  • 运行的 etcd 集群个数成员为奇数。

  • etcd 是一个 leader-based 分布式系统。确保主节点定期向所有从节点发送心跳,以保持集群稳定。

  • 确保不发生资源不足。

    集群的性能和稳定性对网络和磁盘 IO 非常敏感。任何资源匮乏都会导致心跳超时,从而导致集群的不稳定。不稳定的情况表明没有选出任何主节点。在这种情况下,集群不能对其当前状态进行任何更改,这意味着不能调度新的 pod。

  • 保持稳定的etcd集群对Kubernetes集群的稳定性至关重要。因此,请在专用机器或隔离环境上运行etcd集群,以满足所需资源需求。

  • 在生产中运行的 etcd 的最低推荐版本是 3.2.10+

资源要求

使用有限的资源运行 etcd 只适合测试目的。为了在生产中部署,需要先进的硬件配置。

启动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


2.多节点etcd集群

为了耐用性和高可用性,在生产中将以多节点集群的方式运行 etcd,并且定期备份。建议在生产中使用五个成员的集群。可以通过静态成员信息或动态发现的方式配置etcd集群。

例如,考虑运行以下客户端URL的五个成员的etcd集群:

http://$IP1:2379http://$IP2:2379http://$IP3:2379http://$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

3.使用负载均衡的多节点etcd集群

要运行负载均衡的etcd集群:

1)建立一个 etcd 集群。

2)在etcd集群前面配置负载均衡器。例如,让负载均衡器的地址为$LB

3)使用参数 --etcd-servers=$LB:2379启动Kubernetes API服务器。

安全的etcd集群

对etcd的访问相当于集群中的root权限,因此理想情况下只有 API 服务器才能访问它。考虑到数据的敏感性,建议只向需要访问etcd集群的节点授予权限。想要确保etcd的安全,可以设置防火墙规则或使用etcd提供的安全特性,这些安全特性依赖于x509公钥基础设施(PKI)。首先,通过生成密钥和证书对来建立安全的通信通道。例如,使用密钥对peer.keypeer.cert来保护etcd成员之间的通信,而 client.certclient.cert用于保护etcd与其客户端之间的通信。

1.安全通信

若要使用安全对等通信对etcd进行配置,请指定参数 --peer-key-file=peer.key--peer-cert-file=peer.cert,并使用https作为URL模式。

类似地,要使用安全客户端通信对etcd进行配置,请指定参数 --key-file=k8sclient.key--cert-file=k8sclient.cert,并使用https作为URL模式。

2.限制etcd集群的访问

配置安全通信后,将 etcd 集群的访问限制在 Kubernetes API 服务器上。使用 TLS 身份验证来完成此任务。例如,考虑由 CA etcd.ca信任的密钥对 k8sclient.keyk8sclient.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 集群通过容忍少数成员故障实现高可用性。但是,要改善集群的整体健康状况,请立即替换失败的成员。当多个成员失败时,逐个替换它们。替换失败成员需要两个步骤:删除失败成员和添加新成员。

虽然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。

  1. 获取失败的 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
    
  2. 移除失败的成员

    etcdctl member remove 8211f1d0f64f3269

    显示以下信息:

    Removed member 8211f1d0f64f3269 from cluster
    
  3. 增加新成员:

    ./etcdctl member add member4 --peer-urls=http://10.0.0.4:2380

    显示以下信息:

    Member 2be1eb8f84b7f63e added to cluster ef37ad9dc622a7c4
    
  4. 在 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]
    
  5. 做以下事情之一:

    1. 更新其 --etcd-servers 参数,使 Kubernetes 知道配置进行了更改,然后重新启动 Kubernetes API 服务器。

    2. 如果在 deployment 中使用了负载均衡,更新负载均衡配置。

有关集群重新配置的详细信息,请参阅 etcd 重构文档。

备份etcd集群

所有Kubernetes对象都存储在etcd上。定期备份etcd集群数据对于在灾难场景(例如丢失所有主节点)下恢复 Kubernetes 集群非常重要。快照文件包含所有 Kubernetes 状态和关键信息。为了保证敏感的 Kubernetes 数据的安全,可以对快照文件进行加密。备份 etcd 集群可以通过两种方式完成:etcd 内置快照和卷快照。

1.内置快照

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     |
+----------+----------+------------+------------+

2.卷快照

如果etcd运行在支持备份的存储卷(如 Amazon Elastic Block 存储)上,则可以通过获取存储卷的快照来备份 etcd 数据。

扩展etcd集群

通过交换性能,扩展 etcd 集群可以提高可用性。缩放不会提高集群性能和能力。一般情况下不要扩大或缩小 etcd 集群的集合。不要为 etcd 集群配置任何自动缩放组。强烈建议始终在任何官方支持的规模上运行生产 Kubernetes 集群时使用静态的五成员 etcd 集群。合理的扩展是在需要更高可靠性的情况下,将三成员集群升级为五成员集群。请参阅 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 服务器以修复问题。

升级和回滚etcd集群

从 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客户端均衡器

在 etcd v3.3.13 或更早版本的 etcd v3 客户端有一个严重的错误,会影响 kube-apiserver 和 HA 部署。etcd 客户端平衡器故障转移不适用于安全端点。结果是,etcd 服务器可能会失败或短暂地与 kube-apiserver 断开连接。这会影响 kube-apiserver HA 的部署。                             

往期精彩文章回顾

kubernetes全栈技术+企业案例演示【带你快速掌握和使用k8s】

kubernetes面试题汇总

DevOps视频和资料免费领取

kubernetes技术分享-可用于企业内部培训

谈谈我的IT发展之路

kubernetes系列文章第一篇-k8s基本介绍

kubernetes系列文章第二篇-kubectl

了解pod和pod的生命周期-这一篇文章就够了

Kubernetes中部署MySQL高可用集群

Prometheus+Grafana+Alertmanager搭建全方位的监控告警系统-超详细文档

k8s1.18多master节点高可用集群安装-超详细中文官方文档

k8s中蓝绿部署、金丝雀发布、滚动更新汇总

运维常见问题汇总-tomcat篇

关于linux内核参数的调优,你需要知道

kubernetes持久化存储volume

kubernetes挂载ceph rbd和cephfs

报警神器Alertmanager发送报警到多个渠道

jenkins+kubernetes+harbor+gitlab构建企业级devops平台

kubernetes网络插件-flannel篇

kubernetes网络插件-calico篇

kubernetes认证、授权、准入控制

限制不同的用户操作k8s资源

面试真题&技术资料免费领取-覆盖面超全~

Prometheus监控MySQL

Prometheus监控Nginx

Prometheus监控Tomcat

linux面试题汇总

测试通过storageclass动态生成pv

通过编写k8s的资源清单yaml文件部署gitlab服务

helm安装和使用-通过helm部署k8s应用

Prometheus Operator-上篇-安装和使用篇

Prometheus Operator-下篇

通过kubeconfig登陆k8s的dashboard ui界面

通过token令牌登陆k8s dashboard ui界面                                                                 

技术交流群

学无止境,了解更多关于kubernetes/docker/devops/openstack/openshift/linux/IaaS/PaaS相关内容,想要获取更多资料和免费视频,可按如下方式进入技术交流群

                            扫码加群????

微信:luckylucky421302

微信公众号

                                     长按指纹关注公众号????


                                       点击在看少个 bug????

                                                 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_38320674/article/details/107527235
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-04-11 08:03:14
  • 阅读 ( 1362 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢