Kubernetes v1.9.7安装部署-Etcd高可用

  • A+
所属分类:Kubernetes

1、什么是ETCD

Kubernetes v1.9.7安装部署-Etcd高可用

Etcd CoreOS 团队于 2013 6 月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于 Go 语言实现。我们知道,在分布式系统中,各种服务的配置信息的管理分享,服务的发现是一个很基本同时也是很重要的问题。CoreOS 项目就希望基于 etcd 来解决这一问题。etcd 目前在 github.com/coreos/etcd 进行维护。

受到 Apache ZooKeeper 项目和 doozer 项目的启发,etcd 在设计的时候重点考虑了下面四个要素:简单:支持 REST 风格的 HTTP+JSON API;安全:支持 HTTPS 方式的访问;快速:支持并发 1k/s 的写操作;可靠:支持分布式结构,基于 Raft 的一致性算法。

注:Apache ZooKeeper 是一套知名的分布式系统中进行同步和一致性管理的工具。 注:doozer 则是一个一致性分布式数据库。 注:Raft 是一套通过选举主节点来实现分布式系统一致性的算法,相比于大名鼎鼎的 Paxos 算法,它的过程更容易被人理解,由 Stanford 大学的 Diego Ongaro John Ousterhout 提出。更多细节可以参考 raftconsensus.github.io

一般情况下,用户使用 etcd 可以在多个节点上启动多个实例,并添加它们为一个集群。同一个集群中的 etcd 实例将会保持彼此信息的一致性。

kubernetes 系统使用etcd存储所有的数据,我们这里部署3个节点的etcd 集群,这3个节点直接复用kubernetes master的3个节点,分别命名为etcd01、etcd02、etcd03:

ETCD01:172.16.200.12

ETCD02:172.16.200.13

ETCD03:172.16.200.14

 

2、定义临时环境变量

$ export NODE_NAME=ETCD01 # 当前部署的机器名称(随便定义,只要能区分不同机器即可)

$ export NODE_IP=172.16.200.12 # 当前部署的机器IP

$ export NODE_IPS="172.16.200.12 172.16.200.13 172.16.200.14"

# etcd 集群所有机器 IP $ # etcd 集群间通信的IP和端口

$ export ETCD_NODES=ETCD01=https://172.16.200.12:2380,ETCD02=https://172.16.200.13:2380,ETCD03=https://172.16.200.14:2380

$ # 导入用到的其它全局变量:ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR

$ source /usr/k8s/bin/env.sh

注释:如果不想每次重启都输入临时环境变量、可以把临时环境变量写入到~/.bash_profile文件中、写完之后exit退出系统验证一下。

验证方式:echo $node_ip

 

3、下载ETCD二进制文件

https://github.com/coreos/etcd/releases页面下载最新版本的二进制文件:

$ wget https://github.com/coreos/etcd/releases/download/v3.3.4/etcd-v3.3.4-linux-amd64.tar.gz

$ tar -xvf  etcd-v3.3.4-linux-amd64.tar.gz

$ sudo mv etcd-v3.3.4-linux-amd64/etcd* /usr/k8s/bin/

注释:所有ETCD节点全部需要ETCD二进制文件。(下载的过程中请注意选择amd64而不是arm64

Kubernetes v1.9.7安装部署-Etcd高可用

4、创建TLS密钥和证书

为了保证通信安全,客户端(如etcdctl)与etcd 集群、etcd 集群之间的通信需要使用TLS 加密。

创建etcd 证书签名请求:

$ cat > etcd-csr.json <<EOF

{

"CN": "etcd",

"hosts": [

"127.0.0.1",

"${NODE_IP}"

],

"key": {

"algo": "rsa",

"size": 2048

},

"names": [

{

"C": "CN",

"ST": "BeiJing",

"L": "BeiJing",

"O": "k8s",

"OU": "System"

}

]

}

EOF

注释:hosts 字段指定授权使用该证书的etcd节点IP(如果没有写入临时环境变量、则${NODE_IP}不会变动、创建完成之后我们可以采用cat命令进行查看地址变量是否写入)。

 

5、生成etcd证书和私钥

$ cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
-ca-key=/etc/kubernetes/ssl/ca-key.pem \
-config=/etc/kubernetes/ssl/ca-config.json \
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd

$ ls etcd*

etcd.csr  etcd-csr.json  etcd-key.pem  etcd.pem

$ sudo mkdir -p /etc/etcd/ssl

$ sudo mv etcd*.pem /etc/etcd/ssl/

注释:把证书分发到所有的ETCD节点。

 

6、创建ETCDsystemd unit文件

$ sudo mkdir -p /var/lib/etcd  # 必须要先创建工作目录

$ cat > etcd.service <<EOF

[Unit]

Description=Etcd Server

After=network.target

After=network-online.target

Wants=network-online.target

Documentation=https://github.com/coreos

[Service]

Type=notify

WorkingDirectory=/var/lib/etcd/

ExecStart=/usr/k8s/bin/etcd \\

--name=${NODE_NAME} \\

--cert-file=/etc/etcd/ssl/etcd.pem \\

--key-file=/etc/etcd/ssl/etcd-key.pem \\

--peer-cert-file=/etc/etcd/ssl/etcd.pem \\

--peer-key-file=/etc/etcd/ssl/etcd-key.pem \\

--trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\

--peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\

--initial-advertise-peer-urls=https://${NODE_IP}:2380 \\

--listen-peer-urls=https://${NODE_IP}:2380 \\

--listen-client-urls=https://${NODE_IP}:2379,http://127.0.0.1:2379 \\

--advertise-client-urls=https://${NODE_IP}:2379 \\

--initial-cluster-token=etcd-cluster-0 \\

--initial-cluster=${ETCD_NODES} \\

--initial-cluster-state=new \\

--data-dir=/var/lib/etcd

Restart=on-failure

RestartSec=5

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

EOF

指定etcd的工作目录和数据目录为/var/lib/etcd,需要在启动服务前创建这个目录;

为了保证通信安全,需要指定etcd 的公私钥(cert-file和key-file)、Peers通信的公私钥和CA 证书(peer-cert-file、peer-key-file、peer-trusted-ca-file)、客户端的CA 证书(trusted-ca-file);

--initial-cluster-state值为new时,--name的参数值必须位于--initial-cluster列表中;

 

7、启动ETCD服务

$ sudo mv etcd.service /etc/systemd/system/

$ sudo systemctl daemon-reload

$ sudo systemctl enable etcd

$ sudo systemctl start etcd

$ sudo systemctl status etcd

注释:最先启动的etcd 进程会卡住一段时间,等待其他节点启动加入集群,在所有的etcd 节点重复上面的步骤,直到所有的机器etcd 服务都已经启动。

 

8、验证服务

部署完etcd 集群后,在任一etcd 节点上执行下面命令:

for ip in ${NODE_IPS}; do

ETCDCTL_API=3 /usr/k8s/bin/etcdctl \

--endpoints=https://${ip}:2379  \

--cacert=/etc/kubernetes/ssl/ca.pem \

--cert=/etc/etcd/ssl/etcd.pem \

--key=/etc/etcd/ssl/etcd-key.pem \

endpoint health; done

输出如下结果:

Kubernetes v1.9.7安装部署-Etcd高可用

可以看到上面的信息3个节点上的etcd 均为healthy,则表示集群服务正常。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: