k8s的高可用,主要是实现Master节点的高可用。那么我们看看各个组件是如何解决高可用的。
Kubelet、Kube-proxy:只工作在当前Node节点上,无需高可用。
etcd:etcd如果是放在集群内部的,在kubeadm1.5之后,对于多Master集群,一个Master节点加入集群后将自动实现集群化扩展。所以集群已经自动实现高可用,无需再人工干预。
kube-controller-manager:对于多Master集群,这个组件只会有一个正常工作,其它处于休眠挂起状态。当工作节点发生故障时才会唤醒另一个接管。所以集群已经自动实现高可用,无需再人工干预。
kube-scheduler:与kube-controller-manager情况一样,集群已经自动实现高可用,无需再人工干预。
kube-apiserver:每个Master节点的kube-apiserver都是独立的,没有竞争关系,访问哪个节点效果都是一样的。 综上所述,只有kube-apiserver需要人工解决。解决方案也很简单,既然APIServer以HTTP API提供接口服务,就可以使用常规的四层或七层的代理实现高可用和负载均衡,如使用Nigix、HAProxy等代理服务器。并且可以更进一步,使用vip和keepalive实现,代理服务器的高可用。然后将集群的访问地址从APIServer的地址改为vip的地址。
master一般是三个节点或者五个节点做高可用,根据集群规模来定,master高可用指的是对apiserver做高可用或者对master的物理节点做高可用,node可以有多个节点,专门用来部署应用的。
登录k8s master1 master2,master3,分别修改/etc/keepalived/keepalived.conf,内容如下:
master-1:
global_defs {router_id master-1
}
vrrp_instance VI_1 {state MASTER interface ens160virtual_router_id 50priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.30.200}
}master-2:
global_defs {router_id master-2
}
vrrp_instance VI_1 {state BACKUP interface ens160virtual_router_id 50priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.30.200}
}master-3:
global_defs {router_id master-3
}
vrrp_instance VI_1 {state BACKUP interface ens160virtual_router_id 50priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.30.200}
}
以上需要注意的地方是192.168.30.200为虚拟IP,需要和集群处于同一个网段,且没有被配置为其它的物理机的IP,ens160为物理网卡的设备名称。
在三台master上执行以下命令启动keepalived
service keepalived start
systemctl enable keepalived
在master1上编辑初始化配置:keepalived的情况下controlPlaneEndpoint需要制定为虚拟IP地址
vi kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.23.6
imageRepository: registry.aliyuncs.com/google_containers
controlPlaneEndpoint: 192.168.30.200:6443
networking:podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12
启动初始化
kubeadm init --config kubeadm.conf
节点加入集群有两种角色
1.control-plane角色 表示的是master的备用节点
2.worker角色 表示的是k8s的node
control-plane节点加入方式
登录master-2和master-3,让它们以control-node的方式加入
kubeadm join 192.168.30.200:6443 --token g55zwf.wu671xiryl2c0k7z --discovery-token-ca-cert-hash sha256:2b6c285bdd34cc5814329d5ba8cec3302d53aa925430330fb35c174565f05ad0 --control-plane
把master-1节点上的/root/.kube/下的所有文件拷贝到master-2和master-3节点的/root/.kube目录下,方便master-2和master-3也可以执行kubectl指令
worker节点加入方式
kubeadm join 192.168.30.99:6443 --token g55zwf.wu671xiryl2c0k7z --discovery-token-ca-cert-hash sha256:2b6c285bdd34cc5814329d5ba8cec3302d53aa925430330fb35c174565f05ad0
下一篇:Java中的字符串