k8s官网高可用部署参考:https://kubernetes.io/docs/setup/independent/high-availability/
目录
一 ,k8s高可用集群搭建原理
二 ,k8s高可用搭建步骤
一, k8s高可用集群搭建原理
在k8s集群中,pod节点挂掉还不用担心,它会有恢复,但是如果是单节点master挂掉了,那情况就危险了,会导致
集群全部挂点,所以,需要给k8s集群做高可用,消除master的单点故障
对于k8s,要做高可用,要考虑一下几点
在kubernetes-1.15.以后的版本有些改变,如下:
****Apiserver****Apiserver****Apiserver**** (如果有三个,并不会影响与etcd的沟通)
****ETCD****ETCD****ETCD**** (当配置多主集群时,etcd会扩展)
****controller-manager****controller-manager****controller-manager (在高可用集群中,是休眠状态,就是一个运行,其他休眠)
****scheduler****scheduler****scheduler**** (在高可用集群中,是休眠状态,就是一个运行,其他休眠)
****kubelet**** (不需要做高可用)
****Proxy**** (不需要做高可用)
上图就是要搭建的集群架构
二 , k8s高可用搭建步骤
搭建目录:
注:一定要慢慢来,按步骤做,不然出差不好找问题
- 集群的准备
- 集群各各节点初始化
- 安装docker-ce
- kubeadm安装搭建主从
- 加入主节点,和从节点
- ETCD集群查看
- 部署网络Flannfly(集群内)
(1) 集群的准备
系 统 | 主 机 名 | I P |
Centos7.6 | matser01 | 192.168.30.145 |
Centos7.6 | master02 | 192.168.30.144 |
Centos7.6 | master03 | 192.168.30.143 |
三台master节点做高可用
要求:三台master的cpu虚拟核数要>=4个 | 三台master节点机器要可以上网,可以相互连通。(确保每一台master都是一样的配置)
(2) 集群各各节点初始化
这里初始化参看我的笔记部署k8s集群(二)
这里初始化最后有一点不同
按部署k8s集群(二) 中部署到升级完内核后,重启reboor后,需要关闭NUMA
如图:(这里是一定要是重启完后做)
其中#vim grub 修改的是:"GRUB_CMDLINE_LINUX" 这一行最后添加numa=off (关闭的意思)添加完后,是这样的:GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet numa=off" (每个人做可能quiet前不同,只要在最后添加即可)
按图中步骤做完后,要再次重启机器*****
(3) 安装docker-ce
*****所有节点都安装docker-ce*****
安装需要的依赖包
#yum install -y yum-utils device-mapper-persistent-data lvm2
下载docker-ce源
#yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新软件包并安装docker-ce
#yum update -y && yum install -y docker-ce
创建docker目录
#mkdir /etc/docker
#mkdir -p /etc/systemd/system/docker.service.d
*上传文件daemon.json 到/etc/docker/ (如图:)
启动docker-ce并开机自启
#systemctl start docker && systemctl enable docker
(4) kubeadm安装搭建主从
开始搭建前,先部署调度
部署调度(所有节点都要做)
#modprobe br_netfilter
#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_ipv4
EOF
#chmod 755 /etc/sysconfig/modules/ && bash /etc/sysconfig/modules/ipvs.modules
#lsmod | grep -e ip_vs -e nf_conntrack_ipv4
调度做完,开始部署kubeadm
这里每个节点都采用的是睿云的镜像包,下载以下包 如图
导入docker
#docker load -i haproxy.tar
#dcoker load -i keepalived.tar
解压
#tar zxvf kubeadm-basic.images.tar .gz
修改load-images.sh
如图:通过pwd这里先找到解压后的路径,并复制粘贴到load-images.sh中“cd”和“ls” 这两行
完成后,对这个文件加权限
#chmod a+x load-images.sh
加完权限后,开始执行权限
#./load-images.sh
每个节点都做完以上操作后,解压start文件
#tar zxvf start.keep.tar.gz
#mv data /
#cd /data/lb/
这里的yaml文件是Kubeadm的配置文件,另外两个sh文件是启动脚本
进入etc目录下,有一个haproxy的文件,修改,再最后一行加入本负载节点IP与端口
保存退出后,修改start-haproxy,sh文件,如下图(修改前几行,加入节点IP)
启动haproxy
#./start-haproxy.sh
查看一下是否成功监听
修改keepalived文件 如下图(定义一个VIP在第一行添加修改,第二行是当前网卡名)
其他不做修改,保存退出即可
启动#./start-keepalived.sh
查看一下是否开启
#ip a
(4) 加入主节点,和从节点
************以上做完后,就可以 创建集群了(开始安装kubeadm)
加入源
#yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
#systemc enable kubelet.service
Kub,生成yaml文件 如图
#cd /usr/local/kubernetes/install
#kubeadm config print init-defaults > kubeadm-config.yaml
修改kubeadm-config.yaml (红色为必要修改内容)
cat
*******************************************************************
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:2
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.30.145
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master01
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "192.168.30.140:6444"
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.15.1
networking:
dnsDomain: cluster.local
podSubnet: "10.244.0.0/16"
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
***********************************************************************************
修改完成后,可以初始化了
#kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs |tee kubeadm-init.log
这里初始化完成后,跟以前单节点不一样,会多出一些信息,如图
先按文件要求走三步,如图,
#mkdir -p $HOME/.kube
#sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#sudo chown $(id -u):$(id -g) $HOME/.kube/config
做完后,查看是否生效
#kubelct get node
此时,一个节点就部署完成
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
加入其他主节点,要和这个节点安装的包要一致
首先在此节点上
#scp -r /data 192.168.30.144:/
#scp -r /data 192.168.30.143:/
导入docker
#docker load -i haproxy.tar
#dcoker load -i keepalived.tar
安装kubadm(跟上面一样)注意不要初始化,到改完配置文件即可
#systemctl enable kubelet.service
最后,也是最重要一步:在主节点上找到Log文件,复制粘贴到其他节点并运行,如图
这里注意,要添加的节点要做完三步后,再拷贝主节点的配置文件内容到本节点初始化如图
复制以下部分到其他要加入节点(192.168.30.144)
此时,加入完成后,在主节点需改haproxy.cfg文件
在最后加入节点IP(注意:这里最好是在节点部署都完成后,最后加入节点IP,如果是提前加,可能启动会识别不到,会报错)
在第一台主机上重新做一下docker镜像
#docker ps -a
#docker rm -f HAProxy-K8S && bash /data/lb/start-haproxy.sh
然后把haproxy.cfg文件拷贝到要加入的节点机器,并也运行以上命令,如图
最后,查询是否加入成功
# kubectl get pod -n kube-system
到这里基本上部署已经完成了,再加入节点和以上方法一样
(5) ETCD集群查看
查看状态:
#kubectl get endpoints kube-controller-manager --namespace=kube-system -o yaml
#kubectl get endpoints kube-scheduler --namespace=kube-system -o yaml
(6) 部署网络Flannfly(集群内)
部署网络:这里部署网络让每一个节点可以通网(方法和单机部署一样,都是部署Flannly)
#mkdir k8s-flannly
#cd k8s-flannly
#wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#kubectl create -f kube-flannel.yml
*******在这里可能下载不稳定,做一下域名映射到ip*********
查询IP:https://site.ip138.com/raw.githubusercontent.com/
会出现出个IP,选择离我们最近的,目前最近的是中国香港 : 151.101.76.133
然后在/etc/hosts文件里加入: 151.101.76.133 raw.githubusercontent.com
保存退出后,再次尝试wget下载,就可以了
*******************************************************************
启动网络部署
#kubectl apply -f kube-flannel.yml
查看是否运行成功
#kubectl get pod -n kube-system
#kubectl get nodes
此刻网络状态便通了