etcd是用于共享配置和服务发现的分布式KV存储系统,随着CoreOS和Kubernetes等项目在开源社区日益火热,它们都用到了etcd组件作为一个高可用、强一致性的服务发现存储仓库。
操作系统版本:CentOS 7.2
集群机器:192.168.116.151、192.168.116.152、192.168.116.153
对应的主机名:etcd-host0、etcd-host1、etcd-host2

一、创建CA证书和密钥
为了保证通信安全,客户端(如 etcdctl) 与 etcd 集群、etcd 集群之间的通信需要使用 TLS 加密,因此需要先创建 etcd TLS 加密所需的证书和私钥。
使用CloudFlare 的 PKI 工具集 cfssl 来生成 Certificate Authority (CA) 证书和秘钥文件,CA 是自签名的证书,用来签名后续创建的其它 TLS 证书。

1、安装CFSSL

# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
# chmod +x cfssl_linux-amd64
# mv cfssl_linux-amd64 /usr/local/bin/cfssl
# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
# chmod +x cfssljson_linux-amd64
# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
# chmod +x cfssl-certinfo_linux-amd64
# mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
# mkdir ssl
# cd ssl
# cfssl print-defaults config > config.json
# cfssl print-defaults csr > csr.json

2、创建 CA (Certificate Authority)

# cat ca-config.json
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}

ca-config.json :可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile
signing :表示该证书可用于签名其它证书;生成的 ca.pem 证书中CA=TRUE
server auth :表示 client 可以用该 CA 对 server 提供的证书进行验证
client auth :表示 server 可以用该 CA 对 client 提供的证书进行验证

创建 CA 证书签名请求:

# cat ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}

生成 CA 证书和私钥:

# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
# ls ca*
# ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem

分发证书
将生成的 CA 证书、秘钥文件、配置文件拷贝到所有机器的/etc/kubernetes/ssl 目录下

#本机
# mkdir -p /etc/kubernetes/ssl
# cp ca* /etc/kubernetes/ssl
#拷贝其它机器
# scp -r /etc/kubernetes 192.168.116.152:/etc/
# scp -r /etc/kubernetes 192.168.116.153:/etc/

给etcd创建 TLS 秘钥和证书(以下步骤在集群中每台机器中执行)

创建 etcd 证书签名请求:

# cat > etcd-csr.json <<EOF
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"192.168.116.151"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF

hosts 字段指定授权使用该证书的 etcd 节点 IP

生成 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
# mkdir -p /etc/etcd/ssl
# mv etcd*.pem /etc/etcd/ssl

二、创建etcd的systemd服务
1、创建systemd unit 文件

在/etc/systemd/system目录下创建etcd.service文件,内容如下

[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/
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/root/local/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

2、创建etcd.service文件引用的配置文件及WorkingDirectory目录。

在/etc/etcd目录下创建etcd.conf文件,内容如下

# [member]
NODE_NAME=etcd-host0 #修改为每台机器自已的名称
NODE_IP=192.168.116.151 #修改为每台机自已的IP #[cluster]
ETCD_NODES=etcd-host0=https://192.168.116.151:2380,etcd-host1=https://192.168.116.152:2380,etcd-host2=https://192.168.116.153:2380
[root@localhost etcd]# pwd
/etc/etcd

创建WorkingDirectory目录

# mkdir /var/lib/etcd

三、启动etcd服务与验证

在集群中每台机器依次执行以下命令启动etcd服务,初次启动服务首台机器可能会卡住一段时间,为正常现象,稍微等待一会儿。

# systemctl daemon-reload
# systemctl enable etcd
# systemctl start etcd
# systemctl status etcd

如一切顺利,执行以下命令,三台 etcd 的输出均为 healthy 时表示集群服务正常。

# for ip in 192.168.116.151 192.168.116.152 192.168.116.153; do ETCDCTL_API=3 /root/local/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

最新文章

  1. 解决FF浏览器无法执行window.close()脚本
  2. Qt界面中嵌入其他exe程序的界面,使用Qt5
  3. 随机生成字符串-php-js
  4. git分支与版本管理、版本回退、冲突解决记录
  5. php 本周开始时间和结束时间;本月开始时间结束时间;上月开始时间结束时间
  6. yii2-admin 插件使用简要教程
  7. Power Designer 使用技巧总结
  8. 调整ListBox控件的行间距及设置文本格式
  9. python【第十二篇】Mysql基础
  10. numpy库:常用基本
  11. 解决Android5.0以下Dialog引起的内存泄漏
  12. Struts2中validate数据校验的两种常用方法
  13. UML和模式应用5:细化阶段(2)--细化阶段制品之领域模型
  14. Qt FFMPEG+OpenCV开启摄像头
  15. swift开发之--代理协议的使用
  16. Python以不可见字符作为列分割符
  17. hadoop的调试
  18. Intel Galileo Debian Image Prequits
  19. IntelliJ IDEA开发工具println报错的解决方法
  20. 解决eclipse中java代码注释变成乱码的问题

热门文章

  1. 使用Eclipse在Excel中找出两张表中相同证件号而姓名或工号却出现不同的的项
  2. 学习Lucene、solr之前应当了解的一些术语
  3. 微信公众平台宣布增加接口IP白名单提高安全性
  4. PHP怎么获取系统信息和服务器详细信息
  5. 织梦中data文件夹是存放什么内容的
  6. IntelliJ IDEA 2016.2.x 激活
  7. 借助 Vue 来构建单页面应用
  8. 为什么我不愿意用ECharts
  9. MySQL数据引擎
  10. python 序列