4-2 高可用集群部署(上)
二、高可用集群部署
1. CA证书(任意节点)
1.1 安装cfssl
cfssl是非常好用的CA工具,我们用它来生成证书和秘钥文件
安装过程比较简单,如下:
# 下载
$ mkdir -p ~/bin
$ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O ~/bin/cfssl
$ wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O ~/bin/cfssljson
# 修改为可执行权限
$ chmod +x ~/bin/cfssl ~/bin/cfssljson
# 设置PATH 好像不需要也可以 已经下到bin了
$ vi ~/.bash_profile 添加
export PATH=$PATH:/opt/kubernetes/bin:~bin
$ source ~/.bash_profile
# 验证
$ cfssl version
1.2 生成根证书
根证书是集群所有节点共享的,只需要创建一个 CA 证书,后续创建的所有证书都由它签名。
# 生成证书和私钥
$ cd /root/kubernetes-ha-binary/target/pki
$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
# 生成完成后会有以下文件(我们最终想要的就是ca-key.pem和ca.pem,一个秘钥,一个证书)
$ ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
# 创建目录
$ ssh <user>@<node-ip> "mkdir -p /etc/kubernetes/pki/"
# 分发到每个主节点
$ scp ca*.pem <user>@<node-ip>:/etc/kubernetes/pki/
2. 部署etcd集群(master节点)
2.1 下载etcd
如果你是从网盘下载的二进制可以跳过这一步(网盘中已经包含了etcd,不需要另外下载)。
没有从网盘下载bin文件的话需要自己下载etcd
$ wget https://github.com/coreos/etcd/releases/download/v3.2.18/etcd-v3.2.18-linux-amd64.tar.gz
2.2 生成证书和私钥
# 生成证书、私钥
$ cd /root/kubernetes-ha-binary/target/pki/etcd
$ cfssl gencert -ca=../ca.pem \
-ca-key=../ca-key.pem \
-config=../ca-config.json \
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd
# 分发到每个etcd节点
$ scp etcd*.pem <user>@<node-ip>:/etc/kubernetes/pki/
2.3 创建service文件
# scp配置文件到每个master节点
$ scp target/<node-ip>/services/etcd.service <node-ip>:/etc/systemd/system/
# 创建数据和工作目录
$ ssh <user>@<node-ip> "mkdir -p /var/lib/etcd"
2.4 启动服务
etcd 进程首次启动时会等待其它节点的 etcd 加入集群,命令 systemctl start etcd 会卡住一段时间,为正常现象。
#启动服务
$ systemctl daemon-reload && systemctl enable etcd && systemctl restart etcd
#查看状态
$ service etcd status
#查看启动日志
$ journalctl -f -u etcd
3. 部署api-server(master节点)
3.1 生成证书和私钥
# 生成证书、私钥
$ cd /root/kubernetes-ha-binary/target/pki/apiserver
$ cfssl gencert -ca=../ca.pem \
-ca-key=../ca-key.pem \
-config=../ca-config.json \
-profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
# 分发到每个master节点
$ scp kubernetes*.pem <user>@<node-ip>:/etc/kubernetes/pki/
3.2 创建service文件
# scp配置文件到每个master节点
$ scp /root/kubernetes-ha-binary/target/<node-ip>/services/kube-apiserver.service <user>@<node-ip>:/etc/systemd/system/
# 创建日志目录
$ ssh <user>@<node-ip> "mkdir -p /var/log/kubernetes"
3.3 启动服务
#启动服务
$ systemctl daemon-reload && systemctl enable kube-apiserver && systemctl restart kube-apiserver
#查看运行状态
$ service kube-apiserver status
#查看日志
$ journalctl -f -u kube-apiserver
#检查监听端口
$ netstat -ntlp
4. 部署keepalived - apiserver高可用(master节点)
4.1 安装keepalived
# 在两个主节点上安装keepalived(一主一备)
$ yum install -y keepalived
4.2 创建keepalived配置文件
# 创建目录
$ ssh <user>@<master-ip> "mkdir -p /etc/keepalived"
$ ssh <user>@<backup-ip> "mkdir -p /etc/keepalived"
# 分发配置文件
$ scp /root/kubernetes-ha-binary/target/configs/keepalived-master.conf <user>@<master-ip>:/etc/keepalived/keepalived.conf
$ scp /root/kubernetes-ha-binary/target/configs/keepalived-backup.conf <user>@<backup-ip>:/etc/keepalived/keepalived.conf
# 分发监测脚本
$ scp /root/kubernetes-ha-binary/target/configs/check-apiserver.sh <user>@<master-ip>:/etc/keepalived/
$ scp /root/kubernetes-ha-binary/target/configs/check-apiserver.sh <user>@<backup-ip>:/etc/keepalived/
4.3 启动keepalived
# 分别在master和backup上启动服务 先启动主节点
$ systemctl enable keepalived && service keepalived start
# 检查状态
$ service keepalived status
# 查看日志
$ journalctl -f -u keepalived
# 访问测试
$ curl --insecure https://<master-vip>:6443/
5. 部署kubectl(任意节点)
kubectl 是 kubernetes 集群的命令行管理工具,它默认从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息。
5.1 创建 admin 证书和私钥
kubectl 与 apiserver https 安全端口通信,apiserver 对提供的证书进行认证和授权。
kubectl 作为集群的管理工具,需要被授予最高权限。这里创建具有最高权限的 admin 证书。
# 创建证书、私钥
$ cd /root/kubernetes-ha-binary/target/pki/admin
$ cfssl gencert -ca=../ca.pem \
-ca-key=../ca-key.pem \
-config=../ca-config.json \
-profile=kubernetes admin-csr.json | cfssljson -bare admin
5.2 创建kubeconfig配置文件
kubeconfig 为 kubectl 的配置文件,包含访问 apiserver 的所有信息,如 apiserver 地址、CA 证书和自身使用的证书
# 设置集群参数
$ kubectl config set-cluster kubernetes \
--certificate-authority=../ca.pem \
--embed-certs=true \
--server=https://<MASTER_VIP>:6443 \
--kubeconfig=kube.config
# 设置客户端认证参数
$ kubectl config set-credentials admin \
--client-certificate=admin.pem \
--client-key=admin-key.pem \
--embed-certs=true \
--kubeconfig=kube.config
# 设置上下文参数
$ kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=admin \
--kubeconfig=kube.config
# 设置默认上下文
$ kubectl config use-context kubernetes --kubeconfig=kube.config
# 创建目录 (kubectl 个人只在master01上安装了 3台都安装也可以)
$ scp ssh <user>@<master-ip> "mkdir -p ~/.kube"
# 分发到目标节点 (kubectl 个人只在master01上安装了 3台都安装也可以)
$ scp kube.config <user>@<master-ip>:~/.kube/config
5.3 授予 kubernetes 证书访问 kubelet API 的权限
在执行 kubectl exec、run、logs 等命令时,apiserver 会转发到 kubelet。这里定义 RBAC 规则,授权 apiserver 调用 kubelet API。
在master01上执行 给kubectl授权
$ kubectl create clusterrolebinding kube-apiserver:kubelet-apis --clusterrole=system:kubelet-api-admin --user kubernetes
5.4 小测试
# 查看集群信息
$ kubectl cluster-info
$ kubectl get all --all-namespaces
$ kubectl get componentstatuses
6. 部署controller-manager(master节点)
controller-manager启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态。当 leader 节点不可用后,剩余节点将再次进行选举产生新的 leader 节点,从而保证服务的可用性。
6.1 创建证书和私钥
# 生成证书、私钥
$ cd /root/kubernetes-ha-binary/target/pki/controller-manager
$ cfssl gencert -ca=../ca.pem \
-ca-key=../ca-key.pem \
-config=../ca-config.json \
-profile=kubernetes controller-manager-csr.json | cfssljson -bare controller-manager
# 分发到每个master节点
$ scp controller-manager*.pem <user>@<node-ip>:/etc/kubernetes/pki/
6.2 创建controller-manager的kubeconfig
# 创建kubeconfig
$ kubectl config set-cluster kubernetes \
--certificate-authority=../ca.pem \
--embed-certs=true \
--server=https://<MASTER_VIP>:6443 \
--kubeconfig=controller-manager.kubeconfig
$ kubectl config set-credentials system:kube-controller-manager \
--client-certificate=controller-manager.pem \
--client-key=controller-manager-key.pem \
--embed-certs=true \
--kubeconfig=controller-manager.kubeconfig
$ kubectl config set-context system:kube-controller-manager \
--cluster=kubernetes \
--user=system:kube-controller-manager \
--kubeconfig=controller-manager.kubeconfig
$ kubectl config use-context system:kube-controller-manager --kubeconfig=controller-manager.kubeconfig
# 分发controller-manager.kubeconfig到每一个master节点上
$ scp controller-manager.kubeconfig <user>@<node-ip>:/etc/kubernetes/