k8s 二进制部署之添加 masterN 实现高可用
Posted 菜鸟厚非
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s 二进制部署之添加 masterN 实现高可用相关的知识,希望对你有一定的参考价值。
架构
部署
一、系统初始化配置
第一步同样需要对新的访问进行初始化操作,请看 k8s 二进制部署之系统初始化配置。host 需更新,新加 master 与已有 master。
二、更新证书
2.1 更新 https 证书
1 . 更新 api server https 证书,此时需要将 LB VIP 新节点 ip 都需要加入到 hosts,在 ~/TLS/k8s 目录
cd ~/TLS/k8s
cat > server-csr.json << EOF
{
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"192.168.91.130",
"192.168.91.131",
"192.168.91.132",
"192.168.91.133",
"192.168.91.135",
"192.168.91.136",
"192.168.91.166",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
2 . 生成证书,会生成 server.pem 和 server-key.pem 文件
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
3 . 拷贝新 k8s apiserver 证书,到 k8s 工作目录
cp ~/TLS/k8s/ca*pem ~/TLS/k8s/server*pem /opt/kubernetes/ssl/
2.2 更新 kubeconfig
1 . 因为更新了 https 证书,所以 kubeconfig 也需要跟着更新
cd /opt/kubernetes/ssl/
# 创建kubelet bootstrapping kubeconfig
BOOTSTRAP_TOKEN=c47ffb939f5ca36231d9e3121a252940
KUBE_APISERVER="https://192.168.91.130:6443"
# 设置集群参数
kubectl config set-cluster kubernetes \\
--certificate-authority=./ca.pem \\
--embed-certs=true \\
--server=${KUBE_APISERVER} \\
--kubeconfig=bootstrap.kubeconfig
# 设置客户端认证参数
kubectl config set-credentials kubelet-bootstrap \\
--token=${BOOTSTRAP_TOKEN} \\
--kubeconfig=bootstrap.kubeconfig
# 设置上下文参数
kubectl config set-context default \\
--cluster=kubernetes \\
--user=kubelet-bootstrap \\
--kubeconfig=bootstrap.kubeconfig
# 设置默认上下文
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
#----------------------
# 创建kube-proxy kubeconfig文件
kubectl config set-cluster kubernetes \\
--certificate-authority=./ca.pem \\
--embed-certs=true \\
--server=${KUBE_APISERVER} \\
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy \\
--client-certificate=./kube-proxy.pem \\
--client-key=./kube-proxy-key.pem \\
--embed-certs=true \\
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-context default \\
--cluster=kubernetes \\
--user=kube-proxy \\
--kubeconfig=kube-proxy.kubeconfig
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
2 . 将这两个文件拷贝到 Node 节点 k8s 工作目录下
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.91.131:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.91.132:/opt/kubernetes/cfg/
三、复制新 master 所需文件
3.1 工作目录
在新 master 创建 k8s 工作目录
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
3.2 复制 k8s 相关文件
1 . 复制可执行文件 kube-apiserver、kube-controller-manager、kube-scheduler、证书、配置
scp -r /opt/kubernetes/ root@192.168.91.133:/opt
2 . 复制 kube-apiserver、kube-controller-manager、kube-scheduler 的 systemd 文件
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.91.133:/usr/lib/systemd/system
3 . 复制 kubectl
scp /usr/bin/kubectl root@192.168.91.133:/usr/bin
4 . 复制 etcd 证书
scp -r /opt/etcd root@192.168.91.133:/opt
四、修改新 master 配置文件
bind-address、advertise-address 修改为本机 ip
vi /opt/kubernetes/cfg/kube-apiserver.conf
KUBE_APISERVER_OPTS="--logtostderr=true \\
--v=4 \\
--etcd-servers=https://192.168.91.130:2379,https://192.168.91.131:2379,https://192.168.91.132:2379 \\
--bind-address=192.168.91.133 \\
--secure-port=6443 \\
--advertise-address=192.168.91.133 \\
--allow-privileged=true \\
--service-cluster-ip-range=10.0.0.0/24 \\
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota,NodeRestriction \\
--authorization-mode=RBAC,Node \\
--enable-bootstrap-token-auth \\
--token-auth-file=/opt/kubernetes/cfg/token.csv \\
--service-node-port-range=30000-50000 \\
--tls-cert-file=/opt/kubernetes/ssl/server.pem \\
--tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \\
--client-ca-file=/opt/kubernetes/ssl/ca.pem \\
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\
--etcd-cafile=/opt/etcd/ssl/ca.pem \\
--etcd-certfile=/opt/etcd/ssl/server.pem \\
--etcd-keyfile=/opt/etcd/ssl/server-key.pem"
五、启动新 master 组件
systemctl start kube-apiserver.service
systemctl status kube-apiserver.service
systemctl enable kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl status kube-controller-manager.service
systemctl enable kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl status kube-scheduler.service
systemctl enable kube-scheduler.service
六、检查
kubectl get cs
kubectl get node
七、 nginx、Keepalived
我们用 nginx 的 stream 模块做负载均衡,因此,master 将不直连 kube-apiserver 而是连接 nginx,再由 nginx 转发,做 nginx高可用的就需要写 vip 因为 ip 需要漂移。
7.1 安装 Nginx
1 . 在 192.168.91.135、192.168.91.136 服务器,安装 Nginx。
请参考 Nginx 部署
2 . 如果是编译安装的,没有加入此模块的,我们需要加入此模块 stream 。进入 nginx 源码目录,执行下面命令。
./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-pcre --with-stream
make && make install
cp -rf ./objs/nginx /usr/local/nginx/sbin
可以查看模块是否安装成功,使用下面命令
/usr/local/nginx/sbin/nginx -V
7.2 安装 Keepalived
在 192.168.91.135、192.168.91.136 服务器,安装 Keepalived。
请参考 Keepalived 部署
7.3 Keepalived+Nginx 高可用
在 192.168.91.135、192.168.91.136 服务器,配置 Keepalived、编写 Nginx 检测脚本即可
请参考 Keepalived+Nginx 高可用配置
八、配置 master 高可用
在 192.168.91.135、192.168.91.136 服务器,修改 Nginx 配置文件,如下
stream {
upstream k8s-apiserver {
server 192.168.91.130:6443;
server 192.168.91.133:6443;
}
server {
listen 6443;
proxy_pass k8s-apiserver;
}
}
这个是 4 层 TCP 协议,不要写到 http{} 模块里面,不然会报错
./nginx -s reload
九、node 节点配置文件统一 VIP
1 . bootstrap.kubeconfig、kubelet.kubeconfig、kube-proxy.kubeconfig 修改 server: https://192.168.91.166:6443
cd /opt/kubernetes/cfg/
vim bootstrap.kubeconfig
vim kubelet.kubeconfig
vim kube-proxy.kubeconfig
2 . 重启 kube-proxy、kubelet
重启各个 node 节点 kube-proxy、kubelet
systemctl restart kubelet.service
systemctl restart kube-proxy.service
重启完成后,可以查看其状态看是否成功
systemctl status kube-proxy
systemctl status kubelet
十、测试
10.1 master 宕机
关闭 master1 节点,然后在 master2 查看集群状态
10.2 IP 漂移
1 . 查看 VIP 可以看到此时在 192.168.91.135 服务器,
2 . 关闭 192.168.91.135 服务器,接着查看 192.168.91.136 服务器 ip,可以看到 VIP 漂移到了此服务器
3 . 在 master 2 查看,集群状态,可以看到 node 几点依旧正常
十一、注意
-
高可用
nginx、Keepalived 设置开机自启、且 Keepalived 与 Nginx 直接的 check 需要正确 -
为什么 kubectl get node
二进制部署就是不会把master作为集群节点的(没有在master上跑kubelet,保持单纯管理功能)
以上是关于k8s 二进制部署之添加 masterN 实现高可用的主要内容,如果未能解决你的问题,请参考以下文章