《Kubernets部署篇:Centos7.6部署kubernetes1.20.6多master高可用集群》



一、架构图

在这里插入图片描述
集群模式高可用架构说明

核心组件高可用模式高可用实现方式
apiserver集群lvs+keepalived
controller-manager主备leader election
scheduler主备leader election
etcd集群kubeadm
calico集群kubectl

1、apiserver 通过lvs-keepalived实现高可用,vip将请求分发至各个control plane节点的apiserver组件。
2、controller-manager k8s内部通过选举方式产生领导者(由–leader-elect 选型控制,默认为true),同一时刻集群内只有一个controller-manager组件运行。
3、scheduler k8s内部通过选举方式产生领导者(由–leader-elect 选型控制,默认为true),同一时刻集群内只有一个scheduler组件运行。
4、etcd 通过运行kubeadm方式自动创建集群来实现高可用,部署的节点数为奇数,3节点方式最多容忍一台机器宕机。


二、部署环境

主机名系统版本内核版本IP地址备注
VIP192.168.1.18VIP((不是实际的主机))
lvs-keepalived-11centos7.6.18105.4.13192.168.1.11LVS+Keepalived
lvs-keepalived-12centos7.6.18105.4.13192.168.1.12LVS+Keepalived
k8s-master-13centos7.6.18105.4.13192.168.1.13master节点
k8s-master-14centos7.6.18105.4.13192.168.1.14master节点
k8s-master-15centos7.6.18105.4.13192.168.1.15master节点
k8s-worker-16centos7.6.18105.4.13192.168.1.16worker节点
k8s-client-17centos7.6.18105.4.13192.168.1.17client节点

说明:共有7台服务器,2台为lvs-keepalived集群,3台master集群,1台work集群,1台client。


三、环境初始化

说明:所有节点均需要升级内核、系统环境初始化、重启服务器等操作。

3.1、主机名设置及添加hosts解析

#1、分别设置主机名
hostnamectl set-hostname lvs-keepalived-11
hostnamectl set-hostname lvs-keepalived-12
hostnamectl set-hostname k8s-master-13
hostnamectl set-hostname k8s-master-14
hostnamectl set-hostname k8s-master-15
hostnamectl set-hostname k8s-worker-16
hostnamectl set-hostname k8s-client-17

#2、所有主机添加hosts解析
192.168.1.11 lvs-keepalived-11
192.168.1.12 lvs-keepalived-12
192.168.1.13 k8s-master-13
192.168.1.14 k8s-master-14
192.168.1.15 k8s-master-15
192.168.1.16 k8s-worker-16
192.168.1.17 k8s-client-17

3.2、系统环境初始化

《kubernetes系统环境初始化一键脚本》

效果如下图所示:
在这里插入图片描述
问题一:为什么要关闭swap交换分区?
Swap是交换分区,如果机器内存不够,会使用swap分区,但是swap分区的性能较低,k8s设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm初始化的时候会检测swap是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s的时候可以指定–ignore-preflight-errors=Swap来解决。

问题二:为什么开启net.bridge.bridge-nf-call-iptables内核参数?

在centos下安装docker,执行docker info出现如下警告:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

如果 Kubernetes 环境的网络链路中走了 bridge 就可能遇到上述 Service 同节点通信问题,而 Kubernetes 很多网络实现都用到了 bridge。启用 bridge-nf-call-iptables 这个内核参数 (置为 1),表示 bridge 设备在二层转发时也去调用 iptables 配置的三层规则 (包含 conntrack),所以开启这个参数就能够解决上述 Service 同节点通信问题,这也是为什么在 Kubernetes 环境中,大多都要求开启 bridge-nf-call-iptables 的原因。

问题三:为什么要开启net.ipv4.ip_forward = 1参数?
net.ipv4.ip_forward是数据包转发,出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。要让Linux系统具有路由转发功能,需要配置一个Linux的内核参数net.ipv4.ip_forward。这个参数指定了Linux系统当前对路由转发功能的支持情况;其值为0时表示禁止进行IP转发;如果是1,则说明IP转发功能已经打开。

问题四:什么是ipvs?
ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的4层LAN交换,作为 Linux 内核的一部分。ipvs运行在主机上,在真实服务器集群前充当负载均衡器。ipvs可以将基于TCP和UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。

问题五:ipvs和iptable对比分析?
kube-proxy支持 iptables 和 ipvs 两种模式, 在kubernetes v1.8 中引入了 ipvs 模式,在 v1.9 中处于 beta 阶段,在 v1.11 中已经正式可用了。iptables 模式在 v1.1 中就添加支持了,从 v1.2 版本开始 iptables 就是 kube-proxy 默认的操作模式,ipvs 和 iptables 都是基于netfilter的,但是ipvs采用的是hash表,因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能。那么 ipvs 模式和 iptables 模式之间有哪些差异呢?
1、ipvs 为大型集群提供了更好的可扩展性和性能
2、ipvs 支持比 iptables 更复杂的复制均衡算法(最小负载、最少连接、加权等等)
3、ipvs 支持服务器健康检查和连接重试等功能


3.3、内核升级

《Centos7内核升级至5.4.13一键脚本》
在这里插入图片描述
说明:以上脚本均是通用脚本,直接可以使用。


四、ssh双机互信

《Linux多主机双机互信脚本》

说明:配置k8s-master-13到k8s-master-14、k8s-master-15免密登录,本步骤只在k8s-master-13节点上上执行。

# 1、用法如下
[root@k8s-master-149 ~]# ./ssh_key.sh 
usage: ./ssh_key.sh user host password ssh-pub-key ssh-key port
usage: ./ssh_key.sh root host131 pass123 /root/.ssh/id_rsa.pub /root/.ssh/id_rsa 22

# 3、操作如下
yum install expect -y
ssh-keygen -t rsa
./ssh_key.sh root 192.168.1.14 123456 /root/.ssh/id_rsa.pub /root/.ssh/id_rsa 22
./ssh_key.sh root 192.168.1.15 123456 /root/.ssh/id_rsa.pub /root/.ssh/id_rsa 22

# 3、验证
ssh root@192.168.1.14
ssh root@192.168.1.15

如下图所示:
在这里插入图片描述
说明:以上脚本均是通用脚本,直接可以使用。


五、Docker部署

说明:以下操作kubernetes集群master节点和worker节点均需要执行。

《Linux运维实战:Centos7.6一键离线部署docker19.03.9》
在这里插入图片描述


六、kubernetes部署

6.1、设置kubernetes源

说明:以下操作无论是master节点和worker节点均需要执行。

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum clean all && yum -y makecache

6.2、安装kubelet、kubeadm和kubectl

说明:以下操作无论是master节点和worker节点均需要执行。

# 1、版本查看
yum list kubelet --showduplicates | sort -r

# 2、安装1.20.6版本
yum install kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6 -y 

6.3、k8s相关镜像下载

说明:以下操作无论是master节点和worker节点均需要执行。

kubernetes-v1.20.6+calio-v3.20.0+calico.yaml完整镜像资源包

镜像版本如下:

k8s.gcr.io/kube-apiserver:v1.20.6
k8s.gcr.io/kube-controller-manager:v1.20.6
k8s.gcr.io/kube-scheduler:v1.20.6
k8s.gcr.io/kube-proxy:v1.20.6
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0
calico/pod2daemon-flexvol:v3.20.0
calico/node:v3.20.0
calico/cni:v3.20.0
calico/kube-controllers:v3.20.0

说明:
1、以上关于k8s镜像下载,无论master节点还是worker节点均需要下载。

2、镜像资源包里包含calico.yaml文件。

镜像导入后,如下图所示:
在这里插入图片描述


6.4、kubernetes master节点部署

6.4.1、创建初始化配置文件

说明:以下操作只需要在第一个k8s-master-13节点上执行。

# 根据实际部署环境修改信息:
vim kubeadm-config.yaml

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.20.6
controlPlaneEndpoint: "192.168.1.18:6443"  #vip和端口
imageRepository: k8s.gcr.io
apiServer:
  timeoutForControlPlane: 4m0s
  certSANs:
  - 192.168.1.18  #vip地址
  - 192.168.1.13  #master节点ip地址
  - 192.168.1.14  #master节点ip地址
  - 192.168.1.15  #master节点ip地址
  - "k8s-master-13" #master节点主机名
  - "k8s-master-14" #master节点主机名
  - "k8s-master-15" #master节点主机名
  extraArgs:
    authorization-mode: "Node,RBAC"
    service-node-port-range: 30000-36000 # service端口范围
networking:
  dnsDomain: cluster.local
  serviceSubnet: "10.96.0.0/16" # service网段信息
  podSubnet: "10.244.0.0/16"    # pod网段信息
---
#开启ipvs模式
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind:  KubeProxyConfiguration
mode: ipvs

6.4.2、k8s-master-13起虚ip

说明:以下操作只需要在第一个k8s-master-13节点上执行。

ifconfig ens33:1 192.168.1.18 netmask 255.255.255.0 up

如下图所示:
在这里插入图片描述
说明:起虚拟ip目的是为了执行k8s-master-13的初始化,待初始化完成后去掉该虚拟ip。


6.4.3、master初始化

说明:以下操作只需要在第一个k8s-master-13节点上执行。

kubeadm init --config=kubeadm-config.yaml --upload-certs --ignore-preflight-errors=SystemVerification

#如下所示:
  kubeadm join 192.168.1.18:6443 --token vsz5v7.pw3uula3i2x0w4xe \
    --discovery-token-ca-cert-hash sha256:551f2028a1c7ace1ad4d63b29eb7b48a60eb368650f84ce51059ab3eaad07440 \
    --control-plane --certificate-key 63c372097410482560848167233217d193250d03b7931ef0bd416e3188b46a3c

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.18:6443 --token vsz5v7.pw3uula3i2x0w4xe \
    --discovery-token-ca-cert-hash sha256:551f2028a1c7ace1ad4d63b29eb7b48a60eb368650f84ce51059ab3eaad07440 

如下图所示,则表示初始化第一个master节点成功
在这里插入图片描述


6.4.3、配置kubectl

说明:以下操作需在k8s-master-13、k8s-master-14、k8s-master-15节点执行。

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

6.4.4、配置calico网络

说明:以下操作只需要在第一个k8s-master-13节点上执行。

#1、下载calico.yaml文件
wget https://docs.projectcalico.org/manifests/calico.yaml

#2、在master节点上部署CNI网络
kubectl apply -f calico.yaml

#3、查看k8s-master-13节点节点状态
[root@k8s-master-13 pkgs]# kubectl get nodes
NAME            STATUS   ROLES                  AGE     VERSION
k8s-master-13   Ready    control-plane,master   8m21s   v1.20.6

6.4.5、设置kubelet开机自启

说明:以下操作无论是master节点和worker节点均需要执行。

systemctl enable kubelet

6.4.6、证书分发

说明:以下操作只需要在第一个k8s-master-13节点上执行。将k8s-master-13节点证书分发到k8s-master-14、k8s-master-15节点主机上

vim cert-rsync-master.sh
#!/bin/bash
USER=root
CONTROL_PLANE_IPS="192.168.1.14 192.168.1.15"
for host in ${CONTROL_PLANE_IPS}; do
    ssh "${USER}"@$host mkdir -p /etc/kubernetes/pki/etcd
    scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/ca.key "${USER}"@$host:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/sa.key "${USER}"@$host:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:/etc/kubernetes/pki/	
    scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:	/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:/etc/kubernetes/pki/etcd/ca.crt
    scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:/etc/kubernetes/pki/etcd/ca.key
done

bash cert-rsync-master.sh

6.4.7、control plane节点加入k8s集群

说明:以下操作分别在另外两个control plane节点执行,当前环境对应为k8s-master-14和k8s-master-15两个节点。

# 1、以master身份加入kubernetes集群
  kubeadm join 192.168.1.18:6443 --token vsz5v7.pw3uula3i2x0w4xe \
    --discovery-token-ca-cert-hash sha256:551f2028a1c7ace1ad4d63b29eb7b48a60eb368650f84ce51059ab3eaad07440 \
    --control-plane --certificate-key 63c372097410482560848167233217d193250d03b7931ef0bd416e3188b46a3c

# 2、配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 3、设置开机自启
systemctl enable kubelet

问题一:error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition

#解决方法如下:
swapoff -a
kubeadm reset
ipvsadm --clear
rm -rf /etc/cni/net.d
rm -rf $HOME/.kube/config
systemctl daemon-reload
systemctl restart kubelet
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X  

6.4.8、kubectl命令自动补全

Kubernetes命令篇:Kubectl命令自动补全》


6.5、kubernetes worker节点部署

说明:以下操作只需要在worker节点执行。当前环境对应节点为k8s-worker-16

# 1、以worker身份加入kubernetes集群
kubeadm join 192.168.1.18:6443 --token vsz5v7.pw3uula3i2x0w4xe \
    --discovery-token-ca-cert-hash sha256:551f2028a1c7ace1ad4d63b29eb7b48a60eb368650f84ce51059ab3eaad07440 

# 2、设置开机自启
systemctl enable kubelet

如果你忘了token和公钥,可以通过如下命令执行:

执行命令生成token
kubeadm token list

获取CA(证书)公钥哈希值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^ .* //'

kubeadm join 192.168.1.18:6443 --token 新生成的Token填写此处 --discovery-token-ca-cert-hash sha256:获取的公钥哈希值填写此处

如果token和公钥过期,可以通过如下命令执行:

[root@k8s-master-13 ~]# kubeadm token create --print-join-command

如下所示,kubernetes一主多从,就部署完成了。

[root@k8s-master-13 pkgs]# kubectl get nodes
NAME            STATUS   ROLES                  AGE   VERSION
k8s-master-13   Ready    control-plane,master   37m   v1.20.6
k8s-master-14   Ready    control-plane,master   10m   v1.20.6
k8s-master-15   Ready    control-plane,master   13m   v1.20.6
k8s-worker-16   Ready    <none>                 84s   v1.20.6

七、LVS+Keepalived部署

说明:以下操作需要在lvs-keepalived-01和lvs-keepalived-02节点部署即可。由于yum安装的低版本keepalived服务结合k8s1.20.6版本存在问题,为了简化keepalived的部署,编写了高版本一键部署工具,只需要根据实际情况修改变量文件然后执行脚本即可完成部署,同时增加了服务开机自启。

《keepalived一键部署master节点和slave节点工具》

在这里插入图片描述

7.2、安装keepalived和ipvsadm

lvs无需安装,安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive。ipvsadm是通过命令行管理,而keepalive读取配置文件管理。

操作步骤如下:

#1、复制配置文件
cp env.conf.tpl env.conf

#2、编辑配置文件
vim env.conf

# keepalived master节点主机名
export keepalived_master_hostname="lvs-keepalived-11"

# keepalived master节点网卡名称
export keepalived_master_network_name="ens33"

# keepalived slave节点主机名
export keepalived_slave_hostname="lvs-keepalived-12"

# keepalived slave节点网卡名称
export keepalived_slave_network_name="ens33"

# 虚拟vip的ip地址,必须与controlPlaneEndpoint文件中定义的ip地址保持一致
export keepalived_vip="192.168.1.18"

# 虚拟vip的服务端口,必须与kubeadm-config.yaml文件中controlPlaneEndpoint定义的端口保持一致
export keepalived_port="6443"

# 后端k8s master节点1的apiserver的ip地址和端口
export k8s_master_host1="192.168.1.13"
export k8s_master_port1="6443"

# 后端k8s master节点2的apiserver的ip地址和端口
export k8s_master_host2="192.168.1.14"
export k8s_master_port2="6443"

# 后端k8s master节点3的apiserver的ip地址和端口
export k8s_master_host3="192.168.1.15"
export k8s_master_port3="6443"

#3、执行部署脚本
lvs-keepalived-11节点执行: ./op.sh build master
lvs-keepalived-12节点执行: ./op.sh build slave

#4、k8s-master-13节点去掉vip
ifconfig ens33:1 192.168.1.18 netmask 255.255.255.0 down

如下图所示,则表示部署成功。
在这里插入图片描述


7.2、加载ipvsadm模块

# 这里只列出一台验证结果
[root@lvs-keepalived-nginx-02 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lvs-keepalived-nginx-02 ~]# lsmod | grep ip_vs
ip_vs                 155648  0 
nf_conntrack          155648  1 ip_vs
nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs
libcrc32c              16384  3 nf_conntrack,xfs,ip_vs

7.3、查看vip

在这里插入图片描述


7.4、查看虚拟服务和各个RS的权重

如下图所示:
在这里插入图片描述

说明:此时vip在lvs-keepalived-01节点上。


八、master节点配置

说明:以下操作需在master节点主机上执行,当前环境对应节点为k8s-master-149、k8s-master-155、k8s-master-160。

# 注意:打开master所在服务器的“路由”功能、关闭“ARP查询”功能并设置回环ip,三台master配置相同,如下:
# 1、新建realserver.sh
cd /etc/rc.d/init.d/
vim realserver.sh 
#!/bin/bash
VIP=192.168.1.18  #vip地址
. /etc/rc.d/init.d/functions
case "$1" in
start)
	ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
	route add -host $VIP dev lo:0

	echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
	echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
	echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
	echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
	sysctl -p >/dev/null 2>&1
	echo "RealServer Start OK"
;;
stop)
	ifconfig lo:0 down
	route del $VIP > /dev/null 2>&1
	echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
	echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
	echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
	echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
	echo "RealServer Stoped"
;;
*)
	echo "$0: Usage:$0 {start|stop}"
	exit 1
;;
esac

# 2、运行脚本并设置开机自启
chmod u+x /etc/rc.d/init.d/realserver.sh
cd /etc/rc.d/init.d && bash realserver.sh start
sed -i '$a cd /etc/rc.d/init.d && bash realserver.sh start' /etc/rc.d/rc.local
chmod u+x /etc/rc.d/rc.local 

说明:此脚本用于control plane节点绑定 VIP ,并抑制响应 VIP 的 ARP 请求。这样做的目的是为了不让关于 VIP 的 ARP 广播时,节点服务器应答( 因为control plane节点都绑定了 VIP ,如果不做设置它们会应答,就会乱套 )。


九、client节点配置

# 1、设置kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 2、更新缓存
yum clean all && yum -y makecache

# 3、安装kubectl
yum install -y kubectl-1.20.6

# 4、拷贝admin.conf
mkdir -p /etc/kubernetes
scp 192.168.1.13:/etc/kubernetes/admin.conf /etc/kubernetes/
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

# 5、kubectl测试
[root@k8s-client-170 ~]# kubectl get nodes
NAME             STATUS   ROLES    AGE    VERSION
k8s-master-13   Ready    master   100m   v1.20.6
k8s-master-14   Ready    master   91m    v1.20.6
k8s-master-15   Ready    master   89m    v1.20.6
k8s-worker-16   Ready    <none>   83m    v1.20.6

#6、查看组件状态,如果检查状态不正常请参考第十章问题总结
[root@k8s-client-17 pkgs]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   

十、问题总结

问题一:组件controller-manager与scheduler状态为Unhealthy处理

如下图所示:
在这里插入图片描述
问题处理思路:

1、先查看本地的端口,可以确认没有启动10251、10252端口
2、确认kube-scheduler和kube-controller-manager组件配置是否禁用了非安全端口
3、配置文件路径:/etc/kubernetes/manifests/kube-scheduler.yaml 、/etc/kubernetes/manifests/kube-controller-manager.yaml
  mkdir /etc/kubernetes/manifests/bak
  cp /etc/kubernetes/manifests/kube-scheduler.yaml /etc/kubernetes/manifests/bak/kube-scheduler.yaml
  cp /etc/kubernetes/manifests/kube-controller-manager.yaml /etc/kubernetes/manifests/bak/kube-controller-manager.yaml
  sed -i '/port=0/d' /etc/kubernetes/manifests/kube-scheduler.yaml
  sed -i '/port=0/d' /etc/kubernetes/manifests/kube-controller-manager.yaml
说明:在当前版本中经测试不需要重启kubelet服务和服务器
############################################################
4、如果不行请重启kubelet服务
5、如果不行请重启服务器   

参考如下链接

组件controller-manager与scheduler状态为Unhealthy处理


十一、k8s集群高可用测试


11.1、k8s-master-13关机

11.1.1、关闭k8s-master-13

[root@k8s-master-13 ~]# init 0

11.1.2、apiserver组件节点查看

说明:在lvs-keepalived-01上执行ipvsadm查看apiserver转发到的服务器。
在这里插入图片描述
在client端查看集群节点信息
在这里插入图片描述
结论:当集群master节点有一台宕机时,对k8s集群无影响,当有两个master节点同时宕机时,etcd集群崩溃,整个k8s集群也不能正常对外服务。


十二、k8s集群集群功能性测试

说明:所有功能性测试都在client节点完成。

# 1、关闭k8s-master-155节点,查看集群节点状态
[root@k8s-client-170 ~]# kubectl get nodes
NAME             STATUS     ROLES    AGE   VERSION
k8s-master-149   NotReady   master   8d    v1.17.4
k8s-master-155   Ready      master   8d    v1.17.4
k8s-master-160   Ready      master   8d    v1.17.4
k8s-worker-161   Ready      <none>   8d    v1.17.4
k8s-worker-162   Ready      <none>   8d    v1.17.4
k8s-worker-166   Ready      <none>   8d    v1.17.4

# 2、编辑nginx-master.yaml文件
vim nginx-master.yaml
apiVersion: apps/v1             #描述文件遵循extensions/v1beta1版本的Kubernetes API
kind: Deployment                #创建资源类型为Deployment
metadata:                       #该资源元数据
  name: nginx-master            #Deployment名称
spec:                           #Deployment的规格说明
  selector:
    matchLabels:
      app: nginx 
  replicas: 3                   #指定副本数为3
  template:                     #定义Pod的模板
    metadata:                   #定义Pod的元数据
      labels:                   #定义label(标签)
        app: nginx              #label的key和value分别为app和nginx
    spec:                       #Pod的规格说明
      containers:               
      - name: nginx             #容器的名称
        image: nginx:latest     #创建容器所使用的镜像
        imagePullPolicy: IfNotPresent

# 3、执行yaml文件
kubectl create -f nginx-master.yaml

# 4、查看pod状态
[root@k8s-client-170 ~]# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-master-75b7bfdb6b-4wgkc   1/1     Running   0          76s
nginx-master-75b7bfdb6b-6qx6p   1/1     Running   0          76s
nginx-master-75b7bfdb6b-xsflj   1/1     Running   0          76s

结论:
1、在3节点的k8s集群中,当有一个master节点宕机时,集群各项功能不受影响。
2、在3节点的k8s集群中,当有两个master节点同时宕机时,etcd集群崩溃,整个k8s集群也不能正常对外服务。


十三、lvs-keepalived集群高可用测试

说明:所有功能性测试都在client节点完成。

# 1、关闭lvs-keepalived-01节点,查看集群节点状态
[root@k8s-client-170 ~]# kubectl get nodes
NAME             STATUS     ROLES    AGE   VERSION
k8s-master-149   Ready      master   8d    v1.17.4
k8s-master-155   Ready      master   8d    v1.17.4
k8s-master-160   Ready      master   8d    v1.17.4
k8s-worker-161   Ready      <none>   8d    v1.17.4
k8s-worker-162   Ready      <none>   8d    v1.17.4
k8s-worker-166   Ready      <none>   8d    v1.17.4

# 2、编辑nginx-master.yaml文件
vim nginx-master.yaml
apiVersion: apps/v1             #描述文件遵循extensions/v1beta1版本的Kubernetes API
kind: Deployment                #创建资源类型为Deployment
metadata:                       #该资源元数据
  name: nginx-master            #Deployment名称
spec:                           #Deployment的规格说明
  selector:
    matchLabels:
      app: nginx 
  replicas: 3                   #指定副本数为3
  template:                     #定义Pod的模板
    metadata:                   #定义Pod的元数据
      labels:                   #定义label(标签)
        app: nginx              #label的key和value分别为app和nginx
    spec:                       #Pod的规格说明
      containers:               
      - name: nginx             #容器的名称
        image: nginx:latest     #创建容器所使用的镜像
        imagePullPolicy: IfNotPresent

# 3、执行yaml文件
kubectl create -f nginx-master.yaml

# 4、查看pod状态
[root@k8s-client-170 ~]# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-master-75b7bfdb6b-4wgkc   1/1     Running   0          76s
nginx-master-75b7bfdb6b-6qx6p   1/1     Running   0          76s
nginx-master-75b7bfdb6b-xsflj   1/1     Running   0          76s

结论:当lvs-keepalived集群有一台宕机时,对k8s集群无影响,仍能正常对外提供服务。


十四、修改scheduler、controller-manager监听端口

说明:默认在1.19之后10252、10251、10249都是绑定在127.0.0.1上的,如果想要通过prometheus监控,会采集不到数据,所以可以把端口绑定到物理机ip上,如果你的环境已经修改这一步可以忽略。建议在安装kubernetes集群的时候进行如下操作,降低生产环境风险。

操作步骤如下:

#1、无需重启kubelet服务,分别在三台master节点修改kube-scheduler.yaml
[root@k8s-master-13 ~]# sed -i 's#127.0.0.1#192.168.1.13#g'  /etc/kubernetes/manifests/kube-scheduler.yaml
[root@k8s-master-14 ~]# sed -i 's#127.0.0.1#192.168.1.14#g'  /etc/kubernetes/manifests/kube-scheduler.yaml
[root@k8s-master-15 ~]# sed -i 's#127.0.0.1#192.168.1.15#g'  /etc/kubernetes/manifests/kube-scheduler.yaml

#2、无需重启kubelet服务,分别在三台master节点修改kube-controller-manager.yaml
[root@k8s-master-13 ~]# sed -i 's#127.0.0.1#192.168.1.13#g' /etc/kubernetes/manifests/kube-controller-manager.yaml
[root@k8s-master-14 ~]# sed -i 's#127.0.0.1#192.168.1.14#g' /etc/kubernetes/manifests/kube-controller-manager.yaml
[root@k8s-master-15 ~]# sed -i 's#127.0.0.1#192.168.1.15#g' /etc/kubernetes/manifests/kube-controller-manager.yaml

#3、分别在三台master节点上查看相应的端口是否被物理机监听
[root@k8s-master-13 ~]# ss -antulp | grep :10251 && ss -antulp | grep :10252
[root@k8s-master-14 ~]# ss -antulp | grep :10251 && ss -antulp | grep :10252
[root@k8s-master-15 ~]# ss -antulp | grep :10251 && ss -antulp | grep :10252

#4、无需重启kubelet服务,分别在三台master节点上把—port=0删除,否则会kubectl get cs会出现controller-manager和scheduler状态为Unhealthy
[root@k8s-master-13 ~]# sed -i '/port=0/d' /etc/kubernetes/manifests/kube-scheduler.yaml
[root@k8s-master-13 ~]# sed -i '/port=0/d' /etc/kubernetes/manifests/kube-controller-manager.yaml
[root@k8s-master-14 ~]# sed -i '/port=0/d' /etc/kubernetes/manifests/kube-scheduler.yaml
[root@k8s-master-14 ~]# sed -i '/port=0/d' /etc/kubernetes/manifests/kube-controller-manager.yaml
[root@k8s-master-15 ~]# sed -i '/port=0/d' /etc/kubernetes/manifests/kube-scheduler.yaml
[root@k8s-master-15 ~]# sed -i '/port=0/d' /etc/kubernetes/manifests/kube-controller-manager.yaml

#5、kube-proxy默认端口10249是监听在127.0.0.1上的,需要改成监听到物理节点上,线上建议在安装k8s的时候就做修改,降低风险
# 注意:如果是多master节点只需要在一个节点执行即可
[root@k8s-master-13 ~]# kubectl edit configmap kube-proxy -n kube-system
把metricsBindAddress这段修改成metricsBindAddress: 0.0.0.0:10249

# 6、重启kube-proxy(必须)
# 注意:如果是多master节点只需要在一个节点执行即可
[root@k8s-master-13 ~]# kubectl get pods -n kube-system | grep kube-proxy |awk '{print $1}' | xargs kubectl delete pods -n kube-system
[root@k8s-master-13 ~]# ss -tnulp | grep 10249

如下图所示,即prometheus才能获取到kube-proxy、kube-controller-manager、kube-scheduler三个组件的数据
在这里插入图片描述


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东城绝神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值