Kubernetes之核心组件ETCD介绍

目录

  • Kubernetes之核心组件ETCD介绍

    • ETCD的主要功能
    • ETCD实用注意事项
      • 1、ETCD cluster初始化的问题
      • 2、ETCD读请求的机制
      • 3、ETCD的compact机制
    • ETCD的问题

Kubernetes之核心组件ETCD介绍

Etcd是CoreOS基于Raft开发的分布式key-value存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)。

ETCD的主要功能

  • 基本的key-value存储
  • 监听机制
  • key的过期及续约机制,用于监控和服务发现
  • 原子CAS和CAD,用于分布式锁和leader选举

    ETCD基于RAFT的一致性

    选举方法

  • 初始化系统时,阶段处于follower状态并设定一个election timeout,如果在这时间周期内没有收到来自leader的heartbeat,节点将发起选举:将自己切换为candidate之后,向集群中其他follower节点发送请求,询问其是否选举自己成为leader。
  • 当收到来及集群中过半节点数的接受投票后,节点即成为leader,开始接受保存client的数据并向其他follower节点同步日志,如果没有达成一致,则candidate随机选择一个等待时间(150-300ms)再次发起投票,得到集群中半数以上follower接受的candidate将成为lwader。
  • leader节点依靠定时向follower发送heartbeat来保持其地位。
  • 任何时候如果其他follower在election timeout期间都没有收到来自leader的headerbeat,同样会将自己状态切换为candidate并发起选举。没成功选举一次,新lwader的任期(Term)都会比之前的leader任期大1。

    日志复制

    当接Leader收到客户端的日志(事务请求) 后先把该日志追加到本地的Log中,然后通过heartbeat把该Entry同步给其他Follower,Follower接收到日志后记录日志然后向Leader发送ACK,当Leader收到大多数(n/2+1) Follower的ACK信息后将该日志设置为已提交并追加到本地磁盘中,通知客户端并在下个heartbeat中Leader将通知所有的Follower将该日志存储在自己的本地磁盘中。

    安全性

    安全性是用于保证每个节点都执行相同序列的安全机制,如当某个Follower在当前Leader commit Log时变得不可用了,稍后可能该Follower又会倍选举为Leader,这时新Leader可能会用新的Log覆盖先前已committed的Log,这就是导致节点执行不同序列;Safety就是用于保证选举出来的Leader一定包含先前 commited Log的机制;

  • 选举安全性(Election Safety) :每个任期(Term) 只能选举出一个Leader
  • Leader完整性(Leader Completeness) :指Leader日志的完整性,当Log在任期Term1被Commit后,那么以后任期Term2、Term3…等的Leader必须包含该Log;Raft在选举阶段就使用Term的判断用于保证完整性:当请求投票的该Candidate的Term较大或Term相同Index更大则投票,否则拒绝该请求。

    失效处理

  • 1) Leader失效:其他没有收到heartbeat的节点会发起新的选举,而当Leader恢复后由于步进数小会自动成为follower(日志也会被新leader的日志覆盖)
  • 2) follower节点不可用:follower 节点不可用的情况相对容易解决。因为集群中的日志内容始终是从 leader 节点同步的,只要这一节点再次加入集群时重新从 leader节点处复制日志即可。
  • 3) 多个candidate:冲突后candidate将随机选择一个等待间隔(150ms ~ 300ms)再次发起投票,得到集群中半数以上follower接受的candidate将成为leader

    ETCD,Zoopkeeper,Consul比较

  • Etcd 和 Zookeeper 提供的能力非常相似,都是通用的一致性元信息存储,都提供watch机制用于变更通知和分发,也都被分布式系统用来作为共享信息存储,在软件生态中所处的位置也几乎是一样的,可以互相替代的。二者除了实现细节,语言,一致性协议上的区别,最大的区别在周边生态圈。Zookeeper 是apache下的,用java写的,提供rpc接口,最早从hadoop项目中孵化出来,在分布式系统中得到广泛使用(hadoop, solr, kafka, mesos 等) 。Etcd 是coreos公司旗下的开源产品,比较新,以其简单好用的rest接口以及活跃的社区俘获了一批用户,在新的一些集群中得到使用(比如kubernetes) 。虽然v3为了性能也改成二进制rpc接口了,但其易用性上比 Zookeeper 还是好一些。
  • 而Consul 的目标则更为具体一些,Etcd 和 Zookeeper 提供的是分布式一致性存储能力,具体的业务场景需要用户自己实现,比如服务发现,比如配置变更。而Consul 则以服务发现和配置变更为主要目标,同时附带了kv存储。

ETCD实用注意事项

1、ETCD cluster初始化的问题

如果集群第一次初始化启动的时候,有一台节点未启动,通过v3的接口访问的时候,会报告Error: Etcdserver: not capable 错误。这是为兼容性考虑,集群启动时默认的API版本是2.3,只有当集群中的所有节点都加入了,确认所有节点都支持v3接口时,才提升集群版本到v3。这个只有第一次初始化集群的时候会遇到,如果集群已经初始化完毕,再挂掉节点,或者集群关闭重启(关闭重启的时候会从持久化数据中加载集群API版本) ,都不会有影响。

2、ETCD读请求的机制

v2 quorum=true 的时候,读取是通过raft进行的,通过cli请求,该参数默认为true。
v3 –consistency=“l” 的时候(默认) 通过raft读取,否则读取本地数据。sdk 代码里则是通过是否打开:WithSerializable option 来控制。一致性读取的情况下,每次读取也需要走一次raft协议,能保证一致性,但性能有损失,如果出现网络分区,集群的少数节点是不能提供一致性读取的。但如果不设置该参数,则是直接从本地的store里读取,这样就损失了一致性。使用的时候需要注意根据应用场景设置这个参数,在一致性和可用性之间进行取舍。

3、ETCD的compact机制

Etcd 默认不会自动 compact,需要设置启动参数,或者通过命令进行compact,如果变更频繁建议设置,否则会导致空间和内存的浪费以及错误。Etcd v3 的默认的backend quota 2GB,如果不 compact,boltdb 文件大小超过这个限制后,就会报错:”Error: etcdserver: mvcc: database space exceeded”,导致数据无法写入。

ETCD的问题

当前 Etcd 的raft实现保证了多个节点数据之间的同步,但明显的一个问题就是扩充节点不能解决容量问题。要想解决容量问题,只能进行分片,但分片后如何使用raft同步数据?只能实现一个 multiple group raft,每个分片的多个副本组成一个虚拟的raft group,通过raft实现数据同步。当前实现了multiple group raft的有 TiKV 和 Cockroachdb,但尚未一个独立通用的。理论上来说,如果有了这套 multiple group raft,后面挂个持久化的kv就是一个分布式kv存储,挂个内存kv就是分布式缓存,挂个lucene就是分布式搜索引擎。当然这只是理论上,要真实现复杂度还是不小。

参考文档

Kubernetes指南-倪朋飞
Kubernetes-handbook-jimmysong-20181218

原文地址:https://www.cnblogs.com/wlbl/p/10652838.html

时间: 2024-11-06 07:35:14

Kubernetes之核心组件ETCD介绍的相关文章

(转帖)开源容器集群管理系统Kubernetes架构及组件介绍

最近在搞Docker还有她的管理工具,选型Kuberetes后,被她的术语和概念搞得晕头转向...看了一篇文章还不错,放到这里分享出来. 地址:http://www.linuxidc.com/Linux/2015-12/125757.htm 引文如下: Kubernetes 作为Docker生态圈中重要一员,是Google多年大规模容器管理技术的开源版本,是产线实践经验的最佳表现.如Urs Hölzle所说,无论是公有云还是私有云甚至混合云,Kubernetes将作为一个为任何应用,任何环境的容

服务发现系统etcd介绍

一.概述 etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性.Raft是一个新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的方式来实现一致性,在Raft中,任何一个节点都可能成为Leader.Google的容器集群管理系统Kubernetes.开源PaaS平台Cloud Foundry和CoreOS的Fleet都

etcd 介绍、经典适用场景、安装、配置、测试

1.介绍 很多人第一反应可能是一个键值存储仓库,却没有重视官方定义的后半句,用于配置共享和服务发现. 实际上,etcd作为一个受到ZooKeeper与doozer启发而催生的项目,除了拥有与之类似的功能外,更专注于以下四点. 简单:基于HTTP+JSON的API让你用curl就可以轻松使用. 安全:可选SSL客户认证机制. 快速:每个实例每秒支持一千次写操作. 可信:使用Raft算法充分实现了分布式. 2.适用场景 值得注意的是,分布式系统中的数据分为控制数据和应用数据.使用etcd的场景默认处

Kubernetes Controller 之 Deployment 介绍

一.Deployment 我们接着前面的文章说,如果不清楚的请查看之前的博文:http://blog.51cto.com/wzlinux/2322616 前面我们已经了解到,Kubernetes 通过各种 Controller 来管理 Pod 的生命周期.为了满足不同业务场景,Kubernetes 开发了 Deployment.ReplicaSet.DaemonSet.StatefuleSet.Job 等多种 Controller.我们首先学习最常用的 Deployment. 1.运行 Depl

Kubernetes 控制器之 Deployment 介绍(六)

一.Deployment.ReplicaSet.Pod之间的关系 我们接着前面的文章说,如果不清楚的请查看之前的博文:http://blog.51cto.com/wzlinux/2322616 前面我们已经了解到,Kubernetes 通过各种 Controller 来管理 Pod 的生命周期.为了满足不同业务场景,Kubernetes 开发了 Deployment.ReplicaSet.DaemonSet.StatefuleSet.Job 等多种 Controller.我们首先学习最常用的 D

kubernetes的Ingress资源介绍

Ingress 的资源帮助信息介绍 [[email protected] ~]# kubectl explain ingress KIND: Ingress VERSION: extensions/v1beta1 DESCRIPTION: Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be con

Kubernetes部分Volume类型介绍及yaml示例

1.EmptyDir(本地数据卷) EmptyDir类型的volume创建于pod被调度到某个宿主机上的时候,而同一个pod内的容器都能读写EmptyDir中的同一个文件.一旦这个pod离开了这个宿主机,EmptyDirr中的数据就会被永久删除.所以目前EmptyDir类型的volume主要用作临时空间,比如Web服务器写日志或者tmp文件需要的临时目录.yaml示例如下: [[email protected] demon2]# cat test-emptypath.yaml apiVersio

Kubernetes部分Volume类型介绍及yaml示例--NFS(网络数据卷)

说明nfs 卷允许将现有的 NFS(网络文件系统)共享挂载到你的容器中.不像 emptyDir,当删除 Pod 时,nfs 卷的内容被保留,卷仅仅是被卸载.这意味着 NFS 卷可以预填充数据,并且可以在 pod 之间"切换"数据. NFS 可以被多个写入者同时挂载. 部署NFS服务器关于NFS的部署,请参考NFS部署及优化(一) 实战pod内的文件共享 #创建yaml文件 cat >> nginx_volume.yaml << EOF apiVersion: v

kubernetes简单介绍和实战

kubernetes简单介绍和实战 在本文中,我们从技术细节上对kubernetes进行简单运用介绍,利用一些yaml脚本层面上实例告诉大家kubernetes基本概念.Kubernetes以及它呈现出的编程范式值得你去使用和整合到自己的技术栈中. kubernetes简单介绍 kubernetes起源 Kubernetes最初认为是谷歌开源的容器集群管理系统,是Google多年大规模容器管理技术Borg或Omega的开源版本.准确来说的话,kubernetes更是一个全新的平台,一个全新的平台