
写在之前
最近业务事情较多,没有及时更新,很惭愧,接下来的几天,尽快把这个系列完成。本文档是通过网上大量的学习资料,基于前辈写的很多不错的文档,结合公司实际情况、个人情况等,进行集群部署,本文档只是个人学习总结。
下载并分发软件包
#!/bin/bash
cd /data/k8s/work
source /data/k8s/bin/env.sh
wget https://github.com/etcd-io/etcd/releases/download/v3.3.18/etcd-v3.3.18-linux-amd64.tar.gz
tar -zxf etcd-v3.3.18-linux-amd64.tar.gz
for node_ip in ${ETCD_IPS[@]}
do
echo ">>> ${node_ip}"
scp etcd-v3.3.18-linux-amd64/etcd* root@${node_ip}:/opt/k8s/bin
ssh root@${node_ip} "chmod +x data/k8s/bin/*"
done
创建启动文件模板
#!/bin/bash
cd /data/k8s/work
source /data/k8s/bin/env.sh
cat > etcd.service.template <<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=${ETCD_DATA_DIR}
ExecStart=/data/k8s/bin/etcd \\
--data-dir=${ETCD_DATA_DIR} \\
--wal-dir=${ETCD_WAL_DIR} \\
--name=##NODE_NAME## \\
--cert-file=/etc/etcd/cert/etcd.pem \\
--key-file=/etc/etcd/cert/etcd-key.pem \\
--trusted-ca-file=/etc/kubernetes/cert/ca.pem \\
--peer-cert-file=/etc/etcd/cert/etcd.pem \\
--peer-key-file=/etc/etcd/cert/etcd-key.pem \\
--peer-trusted-ca-file=/etc/kubernetes/cert/ca.pem \\
--peer-client-cert-auth \\
--client-cert-auth \\
--listen-peer-urls=https://##NODE_IP##:2380 \\
--initial-advertise-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=k8s-etcd-cluster \\
--initial-cluster=${ETCD_NODES} \\
--initial-cluster-state=new \\
--auto-compaction-mode=periodic \\
--auto-compaction-retention=1 \\
--max-request-bytes=33554432 \\
--quota-backend-bytes=6442450944 \\
--heartbeat-interval=250 \\
--election-timeout=2000
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
配置解释
| 配置选项 | 选项说明 |
| wal | 存放预写式日志,文件中记录了整个数据变化的全部历程,数据的修改在提交前,都要先写入到WAL中 |
| data-dir | 指定节点的数据存储目录(包括:节点ID、集群ID、集群初始化配置、Snapshot文件等),如果未指定,会写在当前目录 |
| wal-dir | 存放预写式日志,文件中记录了整个数据变化的全部历程,数据的修改在提交前,都要先写入到WAL中,如果未指定,写在--data-dir目录下面 |
| name | 节点名称,如果--initial-cluster-state=new这个值为new,哪么--name的参数值必须位于--initial-cluster列表中 |
| cert-file | 客户端与服务器之间TLS证书文件的路径 |
| key-file | 客户端与服务器之间TLS密钥文件的路径 |
| trusted-ca-file | 签名client证书的CA证书,用于验证client证书 |
| peer-cert-file | 对等服务器TLS证书文件的路径 |
| peer-key-file | 对等服务器TLS密钥文件的路径 |
| peer-client-cert-auth | 启用对等客户端证书验证 |
| client-cert-auth | 启用客户端验证 |
| listen-peer-urls | 与集群其它成员之间的通信地址 |
| initial-advertise-peer-urls | 通告给集群其它节点,本地的对等URL地址 |
| listen-client-urls | 监听本地端口,对外提供服务的地址 |
| advertise-client-urls | 客户端URL,用于通告集群的其余部分 |
| initial-cluster-token | 集群的token,整个集群中保持一致 |
| initial-cluster | 集群中的所有信息节点 |
| initial-cluster-state | 初始化集群状态,默认为new |
| auto-compaction-mode | 配置基于时间的三种模式 |
| auto-compaction-retention | 设置保留历史时间为1小时 |
| max-request-bytes | 服务器将接受的最大客户端请求大小 |
| quota-backend-bytes | 当后端大小超过给定的配额时,报警 |
| heartbeat-interval | 心跳间隔的时间,单位毫秒 |
| election-timeout | 选举超时时间,单位毫秒 |
服务器配置生成并分发
#!/bin/bash
# 根据模板生成各服务器配置
cd /data/k8s/work
source /data/k8s/bin/env.sh
for (( i=0; i < 3; i++ ))
do
sed -e "s/##NODE_NAME##/${ETCD_NAMES[i]}/" -e "s/##NODE_IP##/${ETCD_IPS[i]}/" etcd.service.template > etcd-${ETCD_IPS[i]}.service
done
# 分发到etcd集群服务器
for node_ip in ${ETCD_IPS[@]}
do
echo ">>> ${node_ip}"
scp etcd-${node_ip}.service root@${node_ip}:/etc/systemd/system/etcd.service
done
远程启动Etcd服务
#!/bin/bash
source /data/k8s/bin/env.sh
for node_ip in ${ETCD_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "mkdir -p ${ETCD_DATA_DIR} ${ETCD_WAL_DIR}"
ssh root@${node_ip} "systemctl daemon-reload && systemctl enable etcd && systemctl restart etcd "
done
服务测试
etcd进程状态
#!/bin/bash
cd /data/k8s/work
source /data/k8s/bin/env.sh
for node_ip in ${ETCD_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "systemctl status etcd|grep -i active"
done
结果如下:
>>> 192.168.16.101
Active: active (running) since Fri 2019-12-27 10:37:58 CST; 1 weeks 6 days ago
>>> 192.168.16.102
Active: active (running) since Fri 2019-12-27 10:35:02 CST; 1 weeks 6 days ago
>>> 192.168.16.103
Active: active (running) since Fri 2019-12-27 10:35:04 CST; 1 weeks 6 days ago
etcd集群健康状态
#!/bin/bash
source /data/k8s/bin/env.sh
for node_ip in ${ETCD_IPS[@]}
do
echo ">>> ${node_ip}"
ETCDCTL_API=3 data/k8s/bin/etcdctl \
--endpoints=https://${node_ip}:2379 \
--cacert=/etc/kubernetes/cert/ca.pem \
--cert=/etc/etcd/cert/etcd.pem \
--key=/etc/etcd/cert/etcd-key.pem endpoint health
done
结果如下:
>>> 192.168.16.101
https://192.168.16.101:2379 is healthy: successfully committed proposal: took = 11.701119ms
>>> 192.168.16.102
https://192.168.16.102:2379 is healthy: successfully committed proposal: took = 16.642322ms
>>> 192.168.16.103
https://192.168.16.103:2379 is healthy: successfully committed proposal: took = 10.666141ms
etcd集群状态
#!/bin/bash
source data/k8s/bin/env.sh
ETCDCTL_API=3 /data/k8s/bin/etcdctl \
-w table --cacert=/etc/kubernetes/cert/ca.pem \
--cert=/etc/etcd/cert/etcd.pem \
--key=/etc/etcd/cert/etcd-key.pem \
--endpoints=${ETCD_ENDPOINTS} endpoint status
结果如下:
+-----------------------------+------------------+---------+---------+-----------+-----------+------------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+-----------------------------+------------------+---------+---------+-----------+-----------+------------+
| https://etcd01.k8s.vip:2379 | 3a24b6728b5c27ab | 3.3.18 | 3.1 MB | false | 4 | 5511275 |
| https://etcd02.k8s.vip:2379 | 650c1614add8d9a | 3.3.18 | 3.1 MB | true | 4 | 5511275 |
| https://etcd03.k8s.vip:2379 | bac9ebb7f9efb1bd | 3.3.18 | 3.2 MB | false | 4 | 5511275 |
+-----------------------------+------------------+---------+---------+-----------+-----------+------------+
总结
部署思路是下载二进制安装包,分发到服务器,生成启动文件模板,根据之前定义的变量,进行替换并生成各服务器启动文件,再把启动文件分发到各服务器去,最后启动服务并验证。
分享使我快乐

往期文档
文章转载自Linux点滴运维实践,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




