k8s 二进制部署之添加 masterN 实现高可用

Posted 菜鸟厚非

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s 二进制部署之添加 masterN 实现高可用相关的知识,希望对你有一定的参考价值。

前一篇:k8s 二进制部署之 Node 组件部署

架构



部署

一、系统初始化配置

第一步同样需要对新的访问进行初始化操作,请看 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 实现高可用的主要内容,如果未能解决你的问题,请参考以下文章

k8s之集群部署(二进制部署)

k8s 二进制部署之 node 安装 docker

6、二进制安装K8s之部署kubectl

二进制部署K8s集群进阶使用之第1节关于K8s证书

二进制部署K8s集群进阶使用之第4节pod控制器

云原生之kubernetes实战在k8s环境下部署Homepage个人导航页