2.kubernetes之ssl加密方式部署-部署高可用Etcd集群

古冷 2018-06-08 581人围观 kubernetesdockercontainer

企业级kubernetes的部署

公司要新系统部署k8s应用,需要本地测试环境部署俩套,生产环境云上部署俩套k8s,互备模式,当一个升级更新维护时另一个来替代


部署高可用 etcd 集群

kuberntes 系统使用 etcd 存储所有数据,本文档介绍部署一个三节点高可用 etcd 集群的步骤,这三个节点复用 kubernetes master 机器,分别命名为hp-001hp-002hp-003

hp-001:192.168.10.1

hp-002:192.168.10.2

hp-003:192.168.10.3


下载二进制文件

wget https://github.com/coreos/etcd/releases/download/v3.1.6/etcd-v3.3.4-linux-amd64.tar.gz
tar -xvf  etcd-v3.3.4-linux-amd64.tar.gz 
mv etcd-v3.3.4-linux-amd64/etcd*  /usr/local/kubernetes/

创建 TLS 秘钥和证书

为了保证通信安全,客户端(如 etcdctl) 与 etcd 集群、etcd 集群之间的通信需要使用 TLS 加密,本节创建 etcd TLS 加密所需的证书和私钥。

创建 etcd 证书签名请求:

vim etcd-csr.json

{
  "CN": "etcd",
  "hosts": [
    "127.0.0.1",
    "192.168.10.1"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
  • hosts 字段指定授权使用该证书的 etcd 节点 IP;   #这里特别注意的是hosts是该节点的ip地址,要是三个节点的集群模式etcd的话必须在每个节点上创建etcd证书的json后创建pem证书,不然会TLS错误,集群之间通信错误

生成 etcd 证书和私钥:ca证书的创建方式http://www.90geek.com/post/k8s%E4%B9%8Bssl%E5%8A%A0%E5%AF%86%E6%96%B9%E5%BC%8F%E9%83%A8%E7%BD%B2-ca%E8%AF%81%E4%B9%A6%E5%88%9B%E5%BB%BA.html

https://pan.baidu.com/s/1sWS_tW-kggV6bj3pUOyClA

$ 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

分配证书
cp etcd-key.pem etcd.pem  /etc/kubernetes/ssl

创建 etcd 的 systemd unit 文件

这里写的只是一个节点的!!!要是集群模式要在三个节点都创建unit文件!!!要变更的地方是:改成该节点的目录和ip

WorkingDirectory=/data/etcd1/
--name=hp-001
--initial-advertise-peer-urls=https://192.168.10.1:2380 \
  --listen-peer-urls=https://192.168.10.1:2380 \
  --listen-client-urls=https://192.168.10.1:2379,http://127.0.0.1:2379 \
  --advertise-client-urls=https://192.168.10.1:2379 \
  --data-dir=/data/etcd1
创建数据目录和工作目录
mkdir -p /data/etcd1/

vim  /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=/data/etcd1/
ExecStart=/opt/kubernetes/etcd \
  --name=hp-001 \
  --cert-file=/etc/kubernetes/ssl/etcd.pem \
  --key-file=/etc/kubernetes/ssl/etcd-key.pem \
  --peer-cert-file=/etc/kubernetes/ssl/etcd.pem \
  --peer-key-file=/etc/kubernetes/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://192.168.10.1:2380 \
  --listen-peer-urls=https://192.168.10.1:2380 \
  --listen-client-urls=https://192.168.10.1:2379,http://127.0.0.1:2379 \
  --advertise-client-urls=https://192.168.10.1:2379 \
  --initial-cluster-token=etcd-cluster-0 \
  --initial-cluster=hp-001=https://192.168.10.1:2380,hp-002=https://192.168.10.2:2380,hp-003=https://192.168.10.3:2380 \
  --initial-cluster-state=new \
  --data-dir=/data/etcd1
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
  • 指定 etcd 的工作目录和数据目录为 /data/etcd1,需在启动服务前创建这个目录;

  • 为了保证通信安全,需要指定 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 列表中;

启动 etcd 服务

$ systemctl daemon-reload
$ systemctl enable etcd.service
$ systemctl start etcd.service
$ systemctl status etcd.service

最先启动的 etcd 进程会卡住一段时间,等待其它节点上的 etcd 进程加入集群,为正常现象。

在所有的 etcd 节点重复上面的步骤,直到所有机器的 etcd 服务都已启动。



有可能启动服务的过程中遇到服务起不来,日志报错为

Apr 12 01:06:48 k8s-master etcd[3092]: publish error: etcdserver: request timed out

解决:

分析是因为etcd1的配置文件

/etc/systemd/system/etcd.service 中的ETCD_INITIAL_CLUSTER_STATE是new,而在配置中ETCD_INITIAL_CLUSTER写入了etcd2/3的IP:PORT,这时etcd1尝试去连接etcd2、etcd3,但是etcd2、3的etcd服务此时还未启动,因此需要先启动etcd2和3的etcd服务,再去启动etcd1。

测试etcd集群是否正常


[root@hp-001 system]# etcdctl   --ca-file=/etc/kubernetes/ssl/ca.pem  --cert-file=/etc/kubernetes/ssl/etcd.pem   --key-file=/etc/kubernetes/ssl/etcd-key.pem   cluster-health

member 2bcf27dd11fd087d is healthy: got healthy result from https://192.168.10.1:2379

member 8feb0b7fc1def769 is healthy: got healthy result from https://192.168.10.3:2379

member 98779d2b9a4c1dc9 is healthy: got healthy result from https://192.168.10.2:2379


[root@hp-001 system]# etcdctl   --ca-file=/etc/kubernetes/ssl/ca.pem  --cert-file=/etc/kubernetes/ssl/etcd.pem   --key-file=/etc/kubernetes/ssl/etcd-key.pem   member list
2bcf27dd11fd087d: name=hp-001 peerURLs=https://192.168.10.1:2380 clientURLs=https://192.168.10.1:2379 isLeader=false
8feb0b7fc1def769: name=hp-003 peerURLs=https://192.168.10.3:2380 clientURLs=https://192.168.10.3:2379 isLeader=true
98779d2b9a4c1dc9: name=hp-002 peerURLs=https://192.168.10.2:2380 clientURLs=https://192.168.10.2:2379 isLeader=false


请发表您的评论
152文章数 1评论数
请关注微信公众号
微信二维码
Powered By Z-BlogPHP