乐趣区

关于kubernetes:Kubernetes多主多从高可用集群部署

前文我搭建了一主两从的 Kubernetes 集群,然而还是存在一个问题,没有达到高可用的目标,如果 Master 节点呈现问题,整个集群将会瘫痪,所以高可用的要害动作在于多 Master 节点,并且部署过程要比单 Master 节点集群要简单很多。

思考再三,鉴于我理论部署过程中呈现的问题泛滥(天知道我经验了什么),我还是决定在本文只形容部署过程,即怎么做,力求照着本文能胜利部署出一套高可用的 Kubernetes 集群;至于 为什么?的问题我留在下一篇文章作为闲聊。

本次高可用计划架构图如下:

须要用到 haproxy 和 keepalived 组件提供 Master 节点高可用。

筹备工作

机器角色 IP
master 10.128.2.53
master 10.128.2.52
master 10.11.0.220
node 10.128.1.187
node 10.11.7.94
node 10.11.0.181
node 10.11.7.125

所有机器须要依照上文 Kubeadm 疾速部署 Kubernetes 集群中筹备工作环节进行设置,此外须要非凡留神的几点如下:

hostname 设置

须要设置 hosts 文件和hostname

## vi /etc/hosts
10.128.2.53 kubernetes-master01
10.128.2.52 kubernetes-master02
10.11.0.220 kubernetes-master03
10.128.1.187 kubernetes-node01
10.11.7.94 kubernetes-node02
10.11.0.181 kubernetes-node03
10.11.7.125 kubernetes-node04
10.128.2.111 kubernetes-vip
hostnamectl set-hostname kubernetes-master01
...
...

10.128.2.111 kubernetes-vip是通过 keepalived 实现的 vip 地址。

节点互信

须要设置 Master 三节点间互信以及 Master 免登录 Node 节点,参考前文。

装置 ipvs

ipvs 是 kube-proxy 实现负载平衡的一种技术实现,默认的实现形式是 iptables,后文再详述。

  • 装置软件
yum install ipvsadm ipset sysstat conntrack libseccomp -y
  • 加载模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
modprobe -- ip_tables
modprobe -- ip_set
modprobe -- xt_set
modprobe -- ipt_set
modprobe -- ipt_rpfilter
modprobe -- ipt_REJECT
modprobe -- ipip
EOF

配置重启主动加载

所有节点执行

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

kubeadm、kubelet、kubectl 装置

配置源

cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#重建 yum 缓存,输出 y 增加证书认证
yum makecache fast

本次装置最新的 1.20.4 版本

先配置 kubeletcggroupDriversystemd,这是官网倡议的,这里有个有意思的中央后文再说

cat > /var/lib/kubelet/config.yaml <<EOF
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF

所有节点装置

yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4
systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet

集群搭建

首先是装置高可用组件 haproxy 和 keepalived,这里我应用 docker 形式,3 个 Master 节点都需装置。

haproxy 装置

  • 创立配置文件haproxy.cfg
vim /etc/haproxy/haproxy.cfg

节点信息局部按本人的理论状况批改:

#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   https://www.haproxy.org/download/2.1/doc/configuration.txt
#   https://cbonte.github.io/haproxy-dconv/2.1/configuration.html
#
#---------------------------------------------------------------------

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2

#    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
#    user        haproxy
#    group       haproxy
    # daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  kubernetes-apiserver
    mode tcp
    bind *:9443  ## 监听 9443 端口
    # bind *:443 ssl # To be completed ....

    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js

    default_backend             kubernetes-apiserver

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend kubernetes-apiserver
    mode        tcp  # 模式 tcp
    balance     roundrobin  # 采纳轮询的负载算法
# k8s-apiservers backend  # 配置 apiserver,端口 6443
 server kubernetes-master01 10.128.2.53:6443 check
 server kubernetes-master02 10.128.2.52:6443 check
 server kubernetes-master03 10.11.0.220:6443 check

配置文件复制到其余 Master 节点

scp /etc/haproxy/haproxy.cfg root@kubernetes-master02:/etc/haproxy
scp /etc/haproxy/haproxy.cfg root@kubernetes-master03:/etc/haproxy

最初 docker 启动,

docker run -d --name=haproxy --net=host  -v /etc/haproxy:/usr/local/etc/haproxy:ro -v /var/lib/haproxy:/var/lib/haproxy haproxy:2.3.6

装置 keepalived

装置 keepalived 消耗了我不少工夫,其中碰到问题挺多的,当然也和以前没应用过 keepalived 无关。keepalived 同样须要 3 个 Master 节点都装置,并且稍有不同。

同样的,首先创立配置文件:

vim /etc/keepalived/keepalived.conf

查看网卡信息:

ip addr

内容如下:

global_defs {
   script_user root 
   enable_script_security

}

vrrp_script chk_haproxy {script "/bin/bash -c'if [[ $(netstat -nlp | grep 9443) ]]; then exit 0; else exit 1; fi'"  # haproxy 检测脚本,这里须要依据本人理论状况判断
    interval 2  # 每 2 秒执行一次检测
    weight 11 # 权重变动
}

vrrp_instance VI_1 {
  interface ens192 # 此处通过 ip addr 命令依据理论填写

  state MASTER # backup 节点设为 BACKUP
  virtual_router_id 51 # id 设为雷同,示意是同一个虚构路由组
  priority 100 #初始权重

  #这里须要留神,我的 3 个 Master 节点不在同一个网段,不配置会呈现多个 Master 节点的脑裂景象,值依据以后节点状况,配置其余 2 个节点
  unicast_peer {
        10.128.2.53
        10.128.2.52
  }

  virtual_ipaddress {10.128.2.111  # vip 虚构 ip}

  authentication {
    auth_type PASS
    auth_pass password
  }

  track_script {chk_haproxy}

  notify "/container/service/keepalived/assets/notify.sh"
}

最初 docker 运行就好了:

docker run --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW --net=host --volume /etc/keepalived/keepalived.conf:/container/service/keepalived/assets/keepalived.conf -d osixia/keepalived:2.0.20 --copy-service

Kubernetes 集群初始化

以下操作都在 kubernetes-master01 节点上执行

本次仍然应用 kubeadm 来实现集群的组建工作,新建 kubeadm 的集群配置文件 kubeadm.yaml,前文中 kube-proxy 采纳了 ipvs,也须要进行配置申明:

cat >> kubeadm.yaml <<EOF
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.20.2
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "kubernetes-vip:9443"
networking:
  dnsDomain: cluster.local
  podSubnet: 192.168.0.0/16
  serviceSubnet: 10.211.0.0/12
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
EOF

执行初始化命令:

kubeadm init --config kubeadm.yaml --upload-certs

胜利后执行:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

并记住节点退出集群的命令:

kubeadm join kubernetes-vip:9443 --token 6dntoh.syhp7vi2j7ikv5uv \
    --discovery-token-ca-cert-hash sha256:250115fad0a4b6852a919dbba4222ac65bc64843c660363ab119606ff8819d0a \
    --control-plane --certificate-key 7bd1bc54ee1fdbffcbfb17f93b32496cb93c0688523f7d5fe414cefd48fb05fe

kubeadm join kubernetes-vip:9443 --token 6dntoh.syhp7vi2j7ikv5uv \
    --discovery-token-ca-cert-hash sha256:250115fad0a4b6852a919dbba4222ac65bc64843c660363ab119606ff8819d0a

装置 calico 组件并执行:

wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
kubectl apply -f calico.yaml

接下来依据后面的节点退出命令,把残余的 master 节点和 node 节点退出集群,确认状态失常:

至此高可用集群也就搭建好了。

集群测试

集群搭建结束,咱们须要做一下破坏性测试来验证高可用性,前文 keepalived 配置文件中咱们配置的检测脚本是查看 9443 端口的状况,所以测试的计划也很简略,只须要进行 haproxy 运行并查看 keepalived 的日志即可,后果如下:

能够很分明的看到切换的过程。

本文至此完结了,是一篇纯过程性的总结,下一篇会就 Kubernetes 高可用集群部署过程中的问题和背地的原理做一些总结。

退出移动版