kubernetes 1.18.x 高可用二进制部署荐

kubernetes 1.18.x 高可用二进制部署

标签(空格分隔): kubernetes系列



一: kubernetes 高可用简介

1Q u ] 3 [ R , # -.1 kubernetes 高可用介绍

高可用架构@ L _ z(扩容多Master架构)
Kubernetes作为2 3 v A I , e ? R容器集群系统,通过健康检查+重启策略实现了Pod故障自我修复能力,通过调X / 4 U v S h度算法实e $ f 8 o $现将Pod分布式部署,并保持预期副本数,根据Node失效状态自动在其他Node拉起Pod,实现了应用层的高可用性。
针对Kubernetes集群,高可用性还应包含以下两个层面的考虑G ` : - V ~:Etcd数据库的高可用性和Kubern6 . 0etes Master组件的高可用性。而Etcd我/ 3 - u D? E - h 7已经采用& l + q : . L3个节点组建集群实现高可4 ? Q用,本节将对Master节点高可用进行说明S C 3 8 ~ j  ) G和实施。
Master节点扮演着总控中心的角色,通过不断与工作4 u 9 P L节点上的Kubelet进行通信来维护整个集群的健康工作状态。如果Master节点故障,将无法使用kubectl工具或者API0 f & & O 6 h t做任何集群管理。
Master节点主要有三个服务kube-apiserver、kube-controller-mansger和kube-scheduler,其中kube-controller-mansger和kube-scheduler组件自身通过选L O B T K择机制已经 a  & 实现了高可用,所以Master高可用主要针对kube-apiserver组件,而该组件是以HTTP API提供服务,因此对他高可用与Web服务器类似,增加负载均衡器对其负载均衡即可,并且可水平扩容。

1.2 部署结构图

kubernetes 1.18.x  高可用二进制部署荐

1.3 多mas@ v P 1 ) # 1terk o o 结构图

kubernetes 1.18.x  高可用二进制部署荐


二:部署承接上文

之前步骤参考:
https://blog.51cto.com/flyfish225/2~ q h s Z v504511
在node04.flyfish 节点上面部署doc! E q r 2 3 0 }ker
2.1 解压二进制包
tar zxvf docker-19.? q : E 1 / l h03.9.tgz
mv docker/* /usr/bin

kubernetes 1.18.x  高可用二进制部署荐

kubernetes 1.18.x  高可用二进制部署荐

2.h a I b a u2 systemd管理docker= ( & K &
cat > /usr/lib/systemd/sJ L = 6 !ystem/docker.service << EOF
[L e f ` (U] T 2 8 (nit]
Description=Docker Application Container Engine
Documenta% G ` . w ~ H K ttioY F D In=https://docs.docker.com
After=network-online.target firewalld.sen . ( D N V Krvice
Wants=network-online.target
[Service]
T= c R ) Sype=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=M # f winfinity
LimitNPROC=infinity
Limq n sitCORE=infinity
TimeoutStartSec=w h M0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3~ o z T
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
2.3 创建配置文件
mkdir /etc/docker
cat > /etc? 7 [ k l * E $ ,/doc` 0 S 4 Xker/daemon.json << EOF
{
"registry-mirrors": ["https://, ! i ~ pb9pmyej V % m - j (lo.mirror.aliyuncs.com"]
}
EOF
registry-mirrors 阿里云镜像加速器

kubernetes 1.18.x  高可用二进制部署荐

2.4 启动并设置开机启R ^ p ] = E 9 y r动
syste$ i O { 1 dmctl daemon-reload
systemctl start docker
systemctl enable docker

kubernetes 1.18.x  高可用二进制部署荐


部署Master2 Node(192.168.100.14)
Master2 与已部署的Master1所有操作一致。所以我们只需将Master1所有% o X l K qK8s文件n & s s D g g拷贝过来,再修改下服务器IP和主机名启动即可。
1. 创建etcd证书目录
在Master2创建etcd证书目录:
mkdir -p /opt/etcd/ssl

kubernetes 1.18.x  高可用二进制部署荐

2. 拷贝文件(Master1操作)
拷贝Master1上所有K8s文件和etcd证书到Master2:
scp -r /opt/kubernetes root@192.16] !  % 8 ! 28.100.14:/opt
scp -r /opt/cni/ root@192.16s b P s U8.100.14:/opt
scp -r /opt/etcd/ssl root@% c B ]192.168.100.14:/opt/etcd
scp /usr/lib/systemd/system/kube* root@192.168.100.14:/usr/lib/systemd/system
scp /usr/bin/kubectl  root@192.168.100.14:/9 k =usr/bin

kubernetes 1.18.x  高可用二进制部署荐

3. 删除证书文件
删除kubelet证书和kubeconfig文件:
rm -f /opt/kubeG $ R # arne# { Y & R T r S ptes/cfg/kubelet.kubecon u [ F P s ffig
rm -f /opm ? 0 X + Tt/kubernetes/ssl/kubelet*

kubernetes 1.18.x  高可用二进制部署荐


4. 修改配置文件IP和主机名
修改P 2 tapiserver、[ !  J m Hkubeletq % M *和kube-proxy配置文件为本地IP:
vim /opt/kubernetes/cN ~ 9 t Vfg/kube-apiserver.conf
...
--bind-address=192.168.100.14 \
--advertise-address=192.168.100.14 \
...
vim /opt/kubernetes/cfg/kubelet.conf
--hostname-override=node04.flyfish
vim /opt/kubernetes/cfg/kubeF I Z  A ` a-proxy-config.yml
hostnameOverride: node+ 6 M X04.f= p ) q u R $ 7 Fly v bfish

kubernetes 1.18.x  高可用二进制部署荐

kubernetes 1.18.x  高可用二进制部署荐

kubernetes 1.18.x  高可用二进制部署荐


5. 启动设置开机启动- a | d t h |
syste$ F J V mctl daemon-reload
systemctl start ku, + dbe-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy
systemctl enable kube-apiserver
systemctl enable kL | f R f Lube-controller-manager
systemctl enab` V G t K X Jle kube-scheduler
systemctl enable kubelet
systemctl enable kube-proxy

kubernetes 1.18.x  高可用二进制部署荐


kubeD M J w Wctl get cs 

kubernetes 1.18.x  高可用二进制部署荐


7. 批准kubelet证书申请
在node01.flyfish 节点 上面 批准授权
kubectl get csr
kubectl certificate approve nodp p H D I fe-csr-fyeyjxpS4JM/ ] K g KpC2QvfmLOyeBbYUiMoYTSTGQETWVlqD4

kubernetes 1.18.x  高可用二进制部署荐

kubernetes 1.18.x  高可用二进制部署荐


kubectlE c O / O J q get node

kubernetes 1.18.x  高可用二进制部署荐


三:部署nginx 负载均衡服务器

kube-apiserver高可用架构图:

kubernetes 1.18.x  高可用二进制部署荐


在node05.flyfish 与node07.flyfish 上面部署0 7 Y w nginx 与keepalive
注意在 node06.flc E # eyfish 上面部署了vmware harbor
yum install epel-release -y
yum install nginx keepalived -yt ; p F

cat > /etc/nginx/nginx.conf << "EOF"
user n 0 V L j & p w Jginx;
worker_pro} # a & ~ + h m rcessK d 3 h ? m 3es auto;
error_log /var/log/nginx/erb { z 2 2 M e ,ror.log;
pid /run/nginx.pid;
include /usr/share/ngi0 h l 4 # ` u [nx/modules/*.conf;
events {
wJ b !orker_connections 1024;
}
# 四层负载L d k A ^ {均衡/ / q + 9,为两台Master apiserver组件提供负载均衡
streamB ( H p  k {
log_format  main  '$remote_addr $upstream_addr - [$d T 7 M S | s Ptime_lH f q O qocal] $status $upstream_bytes_sent';
access_logL [ f ( k 0 T ?  /var/log/nginx/k8s-access.log  main;
upstream k8s-apiserver {
server 192.168.100.11:6443* W %  E o 1  r;   # Master1 APISERVER IP:PORT
serv[ a F K 0er 192.168.100.14:6443;   # Master2 APISERVER IP:PORT
}
server {
lh p 4 q A , 6 +isten 6443;
proxy_pass k8s-api2 1 4 ` N ? z  9server;
}
}
http {
log_format  main  '$remote_addr - $remote_user [$time_local]$ o ! } ] J "$request" '
'$status $| h D 6body_bytes_sent "$ht^ Q TtC . 0 * ^ p j 7p_] n S E 3 ? XrefL + W y % Y verer" '
'"$http_u# T ser_agent" "$http_x_forwarded_b O 1 _ B T 5 ! for"';
access_log  /var/log/nC 2 L / 2 T d M {ginx/access.log  main;
send- L ; w J q sfile            on;
tcp_nopush          on;
tcp_nodela_ ? q l 4 [ V A By         on;
keepalive_tiV R Lmeout   65;
types_hash_max_size 2048;
include             /etc7 % f ! Q/nginx/mime.types;
default_type        application/octet-stream;
server {
listen       80 default_server;i k # ~ h T O
server_name  _;
location / {
}
}
}
EOF

###3. keepalived配置文件(Nginx Master)

cat > /etc/keepalivc v 1 y [ed/keepalit d v # D ` gved.conf <{ k J;< EOF
glob. * ? F N C ~al_defs {
notification_email {
acam 6 W x ` | )sseW _ v Bn@firewall.loc
failover@fc : ^ O s  Tirewall.loc
sysadmin@firewall.L d ` + X ! 5loc
}
notification_email_fQ | = 5 c S b V arom Alexandre.Cassr & b ? v  @en@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
}
vrrp_script check_nginx {
script "/etc/keepalivea 0 fd/B :  1 7 X r 8check_nginx.sh"
}
vrrp_instance VI$ H j H u_1 {
state MASTER
interfaceI o x X g k - T ens33
virtual_router_$ B ; t ]id= H / H k  G ~ 51 # VRRP 路由 ID实例,每个实例是唯一的
priority 100    # 优先级,备服务器设置 9n 2 k r w E p0
advert_int 1    # 指定VRRP 心跳包通告间隔时间,默认1秒
authentiZ M g R } B [ D acation {
auth_type PASS
auth_pass 1i ~ X I y K111
}
# 虚拟IP
virtual_ipaddress {
192.168.100.100/24
}
track_script {
check_nginx
}
}
EOF

vrrp_script:指定检查nginx工作状态脚本(根据nginx状态判断是否故障转移)
virtual_iI i g t $ b G wpaddress:虚拟IP(VIP)

检查nginx状态脚本:
catC j I H ~ ) a q > /etc/keepalived/check_nginx.sh  << "EOF"
#!/bin/bashP + f
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
if [) J g T "$count" -eq 0 ]Y e 2 9 c J;then
exit 1
else
e( Y Y 6xit 0
fi
EOF
chmod +x /etc/keepalived/check_ng] ^ I : O @ } y Linx.sh

四:keepalived配置文件(X s J ? 2 W & nNginx Backup)

cat > /etc/keepalived/k= ( x ) w o [eepalived.conf << EOF
glob7 & Y d Y n sal_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.lQ V I ) b poc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_BACKUP
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
sg ^ f , d P W D Vtate BACKUP
interface ens33
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
priority 90
advert_int 1
authentication {
authr U q [  a_type PASS
auth_pass 1111
}
virtual_ipadH Y e 7 * U ~ $ sdress {
192.168.31.88/24
}
track_script {
check_nginx
}
}
EOF
上述配置文件中检查ngT  +inx运行状态脚本:
ca7 t L h & x Zt > /etc/keepaJ g n z ~lived/check_n` . ( f Q B p ! }ginx.sh  << "EOF"
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
if [ "$cou* h 9nt" -eq 0 ];then
exit 1
else
exit 0
fi
EOF
chmod +x /etc/keepalived/check_P o O ` k E : &nginx.sh
注:keepaliD 3 E pved根据脚本返回状态码(0为工作正常,非0不正常)判断是否故障转移。

5H t J 6 2 j ( $. 启动并设置开机启动
systemctl daemon-reload
systemctl start nginx
systemctl start keepalived
systemctl enable nginx
systemctl enable keep Q ! $ n * p ^ Halived

kubernetes 1.18.x  高可用二进制部署荐

kubernetes 1.18.x  高可用二进制部署荐


6. 查看keepalived& ` 9 - G r工作状态
ip addr
在node05.flyfish 上面 有一个 虚拟VIP 

kubernetes 1.18.x  高可用二进制部署荐


7. Nginx+` , yKeepalived高可用测试
关闭主节点Nginx,测试VIP是否漂移到备节点服务器。
杀掉node05.flyfish 的nginx
pkill nginx
查看浮) ] c % o h动IP 是否 飘到了node07.flyfish 节点

kubernetes 1.18.x  高可用二进制部署荐

可以看到 浮动VIP 已经飘到了node07.flyfisI # Zh 主机上面了

kubernetes 1.18.x  高可用二进制部署荐


去任意一个k8s 节点查看 服务器VIP 是否能够 获取到kube-apiserver 的g z ! V m 5 3 t 0 信息
curl -k https://192.168.100.100:6443/version; G ? v U S % V P

kubernetes 1.18.x  高可用二进制部署荐


检查 nignx 日志

kubernetes 1.18.x  高可用二进制部署荐

7.4 修改所有Worker Node连接LB VI/ 0 % S M j UP

虽然我们增加了Master2和负载均衡器,但是我们是从单Master架构扩容的,也就是说目前所有的Node组件连接都还是Master) ! i $ o v d |1,如果不改为连接VIP走负载均衡器,那么Master还是单点故障。
因此a 4 w 5接下来就是要改所有Node组件配置文件,由原来192.168.100.11修改为192.168.100.100(VIP):

kubernetes 1.18.x  高可用二进制部署荐

h P 3 k S Y M有node 节点执行命令
sed -i 's#192.168( 4 = ^ s 0.31.71:6443#192.168.31.88:6443#' /P s Dopt/kubernetes/cfg/*
systemctl restart kubelet
systemctl restart kube-proxy
kubectl get node 

kubernetes 1.18.x  高可用二进制部署荐

至此 k8s 多节点m! n + w xaster 集群配置完成} f M 5 x v