1、简介
所有持久化的状态信息以KV的形式存储在ETCD中。类似zookeeper,提供分布式协调服务。之所以说kubenetes各个组件是无状态的,就是因为其中把数据都存放在ETCD中。由于ETCD支持集群,这里在三台主机上都部署上ETCD。
2、创建etcd证书签名请求
tee etcd-csr.json <<EOF # 生产环境建议预留几个IP,用于节点扩容
{
"CN":"etcd",
"hosts": [
"127.0.0.1",
"192.168.0.1",
"192.168.0.2",
"192.168.0.3"
],
"key": {
"algo":"rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST":"BeiJing",
"L":"BeiJing",
"O":"k8s",
"OU":"System"
}
]
}
EOF
# 生成etcd证书和私钥
cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \
-ca-key=/opt/kubernetes/ssl/ca-key.pem\
-config=/opt/kubernetes/ssl/ca-config.json \
-profile=kubernetes etcd-csr.json |cfssljson -bare etcd
# 将证书复制到其他节点
cp etcd*.pem /opt/kubernetes/ssl/
scp etcd*.pem 192.168.0.2:/opt/kubernetes/ssl/
scp etcd*.pem 192.168.0.3:/opt/kubernetes/ssl/
3、部署服务
cd /usr/local/src/
wget https://github.com/etcd-io/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz
tar xf etcd-v3.3.10-linux-amd64.tar.gz
cd etcd-v3.3.10-linux-amd64
cp etcd etcdctl /opt/kubernetes/bin/
scp etcd etcdctl 192.168.0.2:/opt/kubernetes/bin/
scp etcd etcdctl 192.168.0.3:/opt/kubernetes/bin/
4、配置etcd服务
# 配置etcd系统文件
tee /opt/kubernetes/cfg/etcd.conf <<EOF
# [member]
ETCD_NAME="etcd-node1"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.0.1:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.0.1:2379,https://127.0.0.1:2379"
# [cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.1:2380"
ETCD_INITIAL_CLUSTER="etcd-node1=https://192.168.0.1:2380,etcd-node2=https://192.168.0.2:2380,etcd-node3=https://192.168.0.3:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="k8s-etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.1:2379"
# [security]
CLIENT_CERT_AUTH="true"
ETCD_CA_FILE="/opt/kubernetes/ssl/ca.pem"
ETCD_CERT_FILE="/opt/kubernetes/ssl/etcd.pem"
ETCD_KEY_FILE="/opt/kubernetes/ssl/etcd-key.pem"
PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_CA_FILE="/opt/kubernetes/ssl/ca.pem"
ETCD_PEER_CERT_FILE="/opt/kubernetes/ssl/etcd.pem"
EOF
ETCD_NAME 节点名称
ETCD_DATA_DIR 数据目录
ETCD_LISTEN_PEER_URLS 集群通信监听地址
ETCD_LISTEN_CLIENT_URLS 客户端访问监听地址
ETCD_INITIAL_ADVERTISE_PEER_URLS 集群通告地址
ETCD_ADVERTISE_CLIENT_URLS 客户端通告地址
ETCD_INITIAL_CLUSTER 集群节点地址
ETCD_INITIAL_CLUSTER_TOKEN 集群Token
ETCD_INITIAL_CLUSTER_STATE 加入集群的当前状态,new是新集群,existing表示加入已有集群
# 配置etcd系统服务
tee /usr/lib/systemd/system/etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=simple
WorkingDirectory=/var/lib/etcd
EnvironmentFile=-/opt/kubernetes/cfg/etcd.conf
# set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc)/opt/kubernetes/bin/etcd"
Type=notify
[Install]
WantedBy=multi-user.target
EOF
# 将配置文件和服务文件拷贝到其他两个节点(记得修改对应的IP和ETCD_NAME)
scp /opt/kubernetes/cfg/etcd.conf192.168.0.2:/opt/kubernetes/cfg
scp /opt/kubernetes/cfg/etcd.conf 192.168.0.3:/opt/kubernetes/cfg
scp /usr/lib/systemd/system/etcd.service192.168.0.2:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service 192.168.0.3:/usr/lib/systemd/system/
5、启动etcd服务
systemctl daemon-reload
ssystemctl enable etcd
systemctl start etcd
systemctl status etcd
6、集群验证
etcdctl--endpoints=https://192.168.0.1:2379,https://192.168.0.2:2379,https://192.168.0.3:2379\
--ca-file=/opt/kubernetes/ssl/ca.pem\
--cert-file=/opt/kubernetes/ssl/etcd.pem\
--key-file=/opt/kubernetes/ssl/etcd-key.pem cluster-health
返回如下信息说明ETCD集群配置正常:
member 3126a455a15179c6 is healthy: got healthy result from https://192.168.0.1:2379
member 40601cc6f27d1bf1 is healthy: got healthy result from https://192.168.0.2:2379
member 431013e88beab64c is healthy: got healthy result from https://192.168.0.3:2379
cluster is healthy
7、etcd集群管理
# etcd数据备份
#!/bin/bash
date_time=`date+%Y%m%d`
etcdctl backup --data-dir /var/lib/etcd/default.etcd/ --backup-dir/tmp/etcd_backup/${date_time}
find /tmp/etcd_backup/ -ctime +7 -exec rm -r {} \;
# 更新节点
如果你想更新一个节点的IP(peerURLS),首先你需要知道那个节点的 ID。你可以列出所有节点,找出对应节点的 ID。
etcdctl--endpoints=https://192.168.0.1:2379 --ca-file=/opt/kubernetes/ssl/ca.pem--cert-file=/opt/kubernetes/ssl/etcd.pem--key-file=/opt/kubernetes/ssl/etcd-key.pem member list
etcdctl--endpoints=https://192.168.0.1:2379 --ca-file=/opt/kubernetes/ssl/ca.pem--cert-file=/opt/kubernetes/ssl/etcd.pem--key-file=/opt/kubernetes/ssl/etcd-key.pem member update a8266ecf031671f3 https://192.168.0.1:2380
# 删除一个节点
etcdctl--endpoints=https://192.168.0.1:2379 --ca-file=/opt/kubernetes/ssl/ca.pem--cert-file=/opt/kubernetes/ssl/etcd.pem--key-file=/opt/kubernetes/ssl/etcd-key.pem member remove a8266ecf031671f3
# 添加一个节点
通过etcdctl 或对应的 API 注册新节点
etcdctl--endpoints=https://192.168.0.1:2379 --ca-file=/opt/kubernetes/ssl/ca.pem--cert-file=/opt/kubernetes/ssl/etcd.pem--key-file=/opt/kubernetes/ssl/etcd-key.pem member add etcd4 http://192.168.0.1:2380
# 备注
使用恰当的参数启动新节点
在注册完新节点后,会返回一段提示,包含3个环境变量。然后在第二部启动新节点的时候,带上这3个环境变量即可
值得注意的是,如果原先的集群只有1个节点,在新节点成功启动之前,新集群并不能正确的形成。因为原先的单节点集群无法完成leader的选举。直到新节点启动完,和原先的节点建立连接以后,新集群才能正确形成。
# 故障恢复
在etcd集群无法提供正常的服务,我们需要用到一些备份和数据恢复的手段。etcd背后的raft,保证了集群的数据的一致性与稳定性。所以我们对etcd的恢复,更多的是恢复etcd的节点服务,并还原用户数据。
首先,从剩余的正常节点中选择一个正常的成员节点, 使用 etcdctl backup 命令备份etcd数据。
然后,将Etcd数据恢复到新的集群的任意一个节点上, 使用 --force-new-cluster 参数启动Etcd服务。这个参数会重置集群ID和集群的所有成员信息,其中节点的监听地址会被重置为localhost:2379, 表示集群中只有一个节点。
启动完成单节点的etcd,可以先对数据的完整性进行验证,确认无误后再通过Etcd API修改节点的监听地址,让它监听节点的外部IP地址,为增加其他节点做准备
用etcd命令找到当前节点的ID。
由于etcdctl不具备修改成员节点参数的功能, 下面的操作要使用API来完成。
curl http://127.0.0.1:2579/v2/members/98f0c6bf64240842-XPUT -H"Content-Type:application/json" -d'{"peerURLs":["http://127.0.0.1:2580"]}'
最后,在完成第一个成员节点的启动后,可以通过集群扩展的方法使用 etcdctl member add 命令添加其他成员节点进来
# 扩展集群
在集群中的任何一台etcd节点上执行命令,将新节点注册到集群:
curl http://127.0.0.1:2379/v2/members-XPOST -H "Content-Type: application/json" -d '{"peerURLs":["http://192.168.0.1:2380"]}'
在新节点上启动etcd容器,注意-initial-cluster-state参数为existing