k8s实践(2) etcd集群安装

被刻印的时光 ゝ 提交于 2020-08-11 02:00:06

k8s实践系列的相关文件都在github:https://github.com/huangguisu/k8s.git

etcd分布式键值存储系统,用于保持集群状态,比如Pod、Service等对象信息。因此我们在k8s集群安装之前,先把搭建好etcd集群。

一、ETCD简介


​      etcd是由CoreOS团队发的一个分布式一致性的KV存储系统,可用于服务注册发现和共享配置,随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用强一致性的服务发现存储仓库,渐渐为开发人员所关注。在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。

1、优点:

etcd作为一个受到ZooKeeper与doozer启发而催生的项目,除了拥有与之类似的功能外,更专注于以下四点:

简单:安装配置简单,而且提供了 HTTP API 进行交互,使用也很简单
安全:支持 SSL 证书验证
快速:根据官方提供的 benchmark 数据,单实例支持每秒 2k+ 读操作
可靠:采用 raft 算法,实现分布式系统数据的可用性和一致性


2、使用场景

1、服务发现(Service Discovery):服务发现就是在一个分布式集群中,如何发现服务端并建立连接。即,发现对应服务的IP和端口,建立连接而已。
2、消息发布与订阅:在构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息订阅者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者。通过这种方式可以做到分布式系统配置的集中式管理与动态更新。
3、负载均衡:分布式系统中,为了保证服务的高可用以及数据的一致性,通常都会把应用节点部署多分,以此达到对等服务,即使其中的某一个服务失效了,也不影响使用。因为每个对等服务节点上都存有完整的服务功能,利用合理的负载均衡策略,访问流量就可以分流到不同的机器上。
4、分布式通知与协调:这个功能与消息发布和订阅有些相似,但是,也有一定得区别。它们都用到了etcd中的Watcher机制,通过注册与异步通知机制,实现分布式环境下不同系统或者模块之间的通知与协调,从而对数据变更做到实时处理。不同系统都在etcd上对同一个目录进行注册,同时设置Watcher观测该目录的变化。只要某个系统更新了etcd的目录,其它设置了Watcher的系统就会收到通知,并作出相应处理。
5、分布式队列:创建一个先进先出的队列,保证顺序。另一种比较有意思的实现是在保证队列达到某个条件时再统一按顺序执行。
6、分布式锁:etcd采用Raft算法保证数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。锁服务有两种使用方式,一是保持独占,二是控制时序。




 

3、架构原理:

从etcd的架构图中我们可以看到,etcd主要分为四个部分。

HTTP Server: 用于处理用户发送的API请求以及其它etcd节点的同步与心跳信息请求。
Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。
Raft:Raft强一致性算法的具体实现,是etcd的核心。
WAL:Write Ahead Log(预写式日志),是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。WAL中,所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照;Entry表示存储的具体日志内容。


通常,一个用户的请求发送过来,会经由HTTP Server转发给Store进行具体的事务处理,如果涉及到节点的修改,则交给Raft模块进行状态的变更、日志的记录,然后再同步给别的etcd节点以确认数据提交,最后进行数据的提交,再次同步。

 

ETCD使用Raft协议来维护集群内各个节点状态的一致性。简单说,ETCD集群是一个分布式系统,由多个节点相互通信构成整体对外服务,每个节点都存储了完整的数据,并且通过Raft协议保证每个节点维护的数据是一致的。

​   etcd推荐使用奇数作为集群节点个数。因为奇数个节点和其配对的偶数个节点相比,容错能力相同,却可以少一个节点。综合考虑性能和容错能力,etcd官方文档推荐的etcd集群大小是3,5,7。由于etcd使用是Raft算法,每次写入数据需要有2N+1个节点同意可以写入数据,所以部分节点由于网络或者其他不可靠因素延迟收到数据更新,但是最终数据会保持一致,高度可靠。随着节点数目的增加,每次的写入延迟会相应的线性递增,除了节点数量会影响写入数据的延迟,如果节点跟接节点之间的网络延迟,也会导致数据的延迟写入。

结论:
​ 1.节点数并非越多越好,过多的节点将会导致数据延迟写入。
​ 2.节点跟节点之间的跨机房,专线之间网络延迟,也将会导致数据延迟写入。
​ 3.受网络IO和磁盘IO的延迟
​ 4.为了提高吞吐量,etcd通常将多个请求一次批量处理并提交Raft,
​ 5.增加节点,读性能会提升,写性能会下降,减少节点,写性能会提升。




 

4、和ZK比较

ZK作为典型代表与ETCD进行比较,而不考虑[Consul]项目作为比较对象,原因为Consul的可靠性和稳定性还需要时间来

  • 一致性协议: ETCD使用[Raft]协议, ZK使用ZAB(类PAXOS协议),前者容易理解,方便工程实现;
  • 维护方面:ETCD方便,有管理界面,ZK难以运维;
  • API:ETCD提供HTTP+JSON, gRPC接口,跨平台跨语言,ZK需要使用其客户端;
  • 访问安全方面:ETCD支持HTTPS访问,ZK在这方面缺失;

 

二、安装


1.etcd下载:

etcd下载地址:https://github.com/coreos/etcd/releases
下载完成后用 tar -zxvf etcd-v3.3.12-linux-amd64.tar.gz 文件解压
cd etcd-v3.3.12-linux-amd64.tar.gz 进入目录 把etcd etcdctl两个文件复制到要安装的目录


2.etcd 单机配置

ln  -s /mnt/app/etcd /mnt/app/etcd-v3.3.12-linux-amd64

mdkir  /mnt/app/etcd/conf

vi /mnt/app/etcd/conf/etcd.json:

{
"name":"etcd-node1",
"data-dir":"/mnt/app/etcd/data/cluster.data",
"listen-peer-urls":"http://0.0.0.0:2380",
"listen-client-urls":"http://0.0.0.0:2379",
}




3.etcd集群配置

ln  -s /mnt/app/etcd /mnt/app/etcd-v3.3.12-linux-amd64

mdkir  /mnt/app/etcd/conf

vi /mnt/app/etcd/conf/etcd_cluster.json:

{
"name":"etcd-node1",
"data-dir":"/mnt/app/etcd/data/cluster.data",
"listen-peer-urls":"http://0.0.0.0:2380",
"listen-client-urls":"http://0.0.0.0:2379",



"initial-advertise-peer-urls":"http://node1.etcd.k8-cluster.com:2380",
"initial-cluster":"etcd-node1=http://node1.etcd.k8-cluster.com:2380,etcd-node2=http://node2.etcd.k8-cluster.com:2380,etcd-node3=http://node3.etcd.k8-cluster.com:
2380",
"initial-cluster-state":"new",
"initial-cluster-token":"k8s-etcd-cluster",
"advertise-client-urls":"http://node1.etcd.k8-cluster.com:2379"
}





参数说明

参数说明: 
● –data-dir 指定节点的数据存储目录,若不指定,则默认是当前目录。这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指 定–wal-dir,还会存储WAL文件 
● –wal-dir 指定节点的was文件存储目录,若指定了该参数,wal文件会和其他数据文件分开存储 
● –name 节点名称 
● –initial-advertise-peer-urls 告知集群其他节点的URL,tcp2380端口用于集群通信 
● –listen-peer-urls 监听URL,用于与其他节点通讯 
● –advertise-client-urls 告知客户端的URL, 也就是服务的URL,tcp2379端口用于监听客户端请求 
● –initial-cluster-token 集群的ID 
● –initial-cluster 集群中所有节点 
● –initial-cluster-state 集群状态,new为新创建集群,existing为已存在的集群

然后在集群服务器各个节点上设置hosts:

192.168.10.21 node1.etcd.k8-cluster.com
192.168.10.22 node2.etcd.k8-cluster.com
192.168.10.23 node3.etcd.k8-cluster.com

 

四、ETCD命令



$ cd  /mnt/app//etcd/
1.查看版本信息:

$ ./etcdctl version
 
etcdctl version: 3.2.6
API version: 3.2
2.启动命令:



$ ./etcd --config-file= /mnt/app//etcd/conf/etcd.json
3.查看集群成员信息:

$ ./etcdctl member list


4.查看集群状态(Leader节点):

$ ./etcdctl cluster-health


5. HTTPS加密下使用etcdctl检查集群健康状况:'

 

 

五、ECTD读写操作


基于HTTP协议的API使用起来比较简单,这里主要通过etcdctl和curl两种方式来做简单介绍。

1.下面通过给message key设置Hello值示例:

$ ./etcdctl set /message Hello
 
Hello
 
$ curl -X PUT http://127.0.0.1:2379/v2/keys/message -d value="Hello"
{"action":"set","node":{"key":"/message","value":"Hello","modifiedIndex":4,"createdIndex":4}}
2.读取message的值:





$ ./etcdctl  get /message
Hello
 
$ curl http://127.0.0.1:2379/v2/keys/message
{"action":"get","node":{"key":"/message","value":"Hello","modifiedIndex":9,"createdIndex":9}}
3.删除message key:




$ ./etcdctl  rm  /message
 
$ curl -X DELETE http://127.0.0.1:2379/v2/keys/message
{"action":"delete","node":{"key":"/message","modifiedIndex":10,"createdIndex":9},"prevNode":{"key":"/message","value":"Hello","modifiedIndex":9,"createdIndex":9}}
说明:因为是集群,所以message在其中一个节点创建后,在集群中的任何节点都可以查询到。



4.查看所有key-value:

curl -s http://127.0.0.1:2379/v2/keys/?recursive=true

六、supervisor启动


涉及到k8s的所有服务,我都直接使用supervisor来启动:

mkdir  mkdir  /mnt/logs/etcd

vi  /usr/local/app/supervisor/conf.d/etcd.conf

[program:etcd]
command =/mnt/app/etcd/etcd  --config-file=/mnt/app//etcd/conf/etcd_cluster.json
process_name=%(program_name)s
numprocs=1
directory=/mnt/app/%(program_name)s/
umask=022
priority=999
autostart=true
autorestart=true
startsecs=10
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=root
redirect_stderr=true
stdout_logfile=/mnt/logs/%(program_name)s/server.log
stdout_logfile_maxbytes=50000MB
stdout_logfile_backups=10
stdout_capture_maxbytes=0MB
stdout_events_enabled=false
stderr_logfile=/mnt/logs/%(program_name)s/error.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
stderr_events_enabled=false
;environment=JAVA_HOME="/usr/java"
serverurl=AUTO


七、配置ETCD为启动服务


也可以使用系统服务来启动:
1.编辑/usr/lib/systemd/system/etcd.service,添加下面内容:

[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
 
[Service]
Type=notify
WorkingDirectory=/opt/etcd-v3.2.6/
# User=etcd
ExecStart=/opt/etcd-v3.2.6/etcd --config-file=/etc/etcd/conf.yml
Restart=on-failure
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target















2.更新启动:

systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
systemctl restart etcd
 
systemctl status etcd.service -l
 





易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!