Kubeadm⽅式部署企业级K8s集⼀、前置知识点
1.1 ⽣产环境可部署Kubernetes集的两种⽅式
⽬前⽣产部署Kubernetes集主要有两种⽅式:
kubeadm
Kubeadm是⼀个K8s部署⼯具,提供kubeadm init和kubeadm join,⽤于快速部署Kubernetes集。
⼆进制包
从github下载发⾏版的⼆进制包,⼿动部署每个组件,组成Kubernetes集。
这⾥采⽤kubeadm搭建集。
kubeadm⼯具功能:
kubeadm init:初始化⼀个Master节点
kubeadm join:将⼯作节点加⼊集
kubeadm upgrade:升级K8s版本
kubeadm token:管理 kubeadm join 使⽤的令牌
kubeadm reset:清空 kubeadm init 或者 kubeadm join 对主机所做的任何更改
kubeadm version:打印 kubeadm 版本
kubeadm alpha:预览可⽤的新功能
1.2 准备环境
服务器要求:
建议最⼩硬件配置:2核CPU、2G内存、30G硬盘
服务器最好可以访问外⽹,会有从⽹上拉取镜像需求,如果服务器不能上⽹,需要提前下载对应镜像并导⼊节点
软件环境:
软件版本
操作系统CentOS7.8_x64 (最⼩化安装)
Docker19-ce
Kubernetes  1.20
服务器整体规划:
⾓⾊IP其他单装组件
k8s-master1192.168.31.61docker,etcd,nginx,keepalived
k8s-master2192.168.31.62docker,etcd,nginx,keepalived
k8s-node1192.168.31.63docker,etcd
负载均衡器对外IP192.168.31.88 (VIP)
架构图
1.3 操作系统初始化配置
# 关闭防⽕墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 临时
# 关闭swap
swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久
# 根据规划设置主机名
hostnamectl set-hostname <hostname>
# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.31.61 k8s-master1
192.168.31.62 k8s-master2
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.f << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  # ⽣效
# 时间同步
yum install ntpdate -y
ntpdate time.windows
⼆、部署Nginx+Keepalived⾼可⽤负载均衡器
  Kubernetes作为容器集系统,通过健康检查+重启策略实现了Pod故障⾃我修复能⼒,通过调度算法实现将Pod分布式部署,并保持预期副本数,根据Node失效状态⾃动在其他Node拉起Pod,实现了应⽤层的⾼可⽤性。
针对Kubernetes集,⾼可⽤性还应包含以下两个层⾯的考虑:Etcd数据库的⾼可⽤性和Kubernetes Master组件的⾼可⽤性。⽽kubeadm搭建的K8s集,Etcd只起了⼀个,存在单点,所以我们这⾥会独⽴搭建⼀个Etcd集。
Master节点扮演着总控中⼼的⾓⾊,通过不断与⼯作节点上的Kubelet和kube-proxy进⾏通信来维护整个集的健康⼯作状态。如果Master节点故障,将⽆法使⽤kubectl⼯具或者API做任何集管理。
Master节点主要有三个服务kube-apiserver、kube-controller-manager和kube-scheduler,其中kube-controller-manager和kube-scheduler组件⾃⾝通过选择机制已经实现了⾼可⽤,所以Master⾼可⽤主要针对kube-apiserver组件,⽽该组件是以HTTP API提供服务,因此对他⾼可⽤与Web服务器类似,
增加负载均衡器对其负载均衡即可,并且可⽔平扩容。
kube-apiserver⾼可⽤架构图:
Nginx是⼀个主流Web服务和反向代理服务器,这⾥⽤四层实现对apiserver实现负载均衡。
Keepalived是⼀个主流⾼可⽤软件,基于VIP绑定实现服务器双机热备,在上述拓扑中,Keepalived主要根据Nginx运⾏状态判断是否需要故障转移(偏移VIP),例如当Nginx主节点挂掉,VIP会⾃动绑定在Nginx备节点,从⽽保证VIP⼀直可⽤,实现Nginx⾼可⽤。
注:为了节省机器,这⾥与K8s master节点机器复⽤。也可以独⽴于k8s集之外部署,只要nginx与apiserver能通信就⾏。
2.1 安装软件包(主/备)
yum install epel-release -y
yum install nginx keepalived -y
2.2 Nginx配置⽂件(主/备⼀样)
cat > /etc/f << "EOF"
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
# 四层负载均衡,为两台Master apiserver组件提供负载均衡
stream {
log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
access_log  /var/log/nginx/k8s-access.log  main;
upstream k8s-apiserver {
server 192.168.31.61:6443;  # Master1 APISERVER IP:PORT
server 192.168.31.62:6443;  # Master2 APISERVER IP:PORT
}
server {
listen 16443;  # 由于nginx与master节点复⽤,这个监听端⼝不能是6443,否则会冲突
proxy_pass k8s-apiserver;
}
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log  /var/log/nginx/access.log  main;
sendfile            on;
tcp_nopush          on;
tcp_nodelay        on;
keepalive_timeout  65;
types_hash_max_size 2048;
include            /etc/pes;
default_type        application/octet-stream;
server {
listen      80 default_server;
server_name  _;
location / {
}
}
}
EOF
2.3 keepalived配置⽂件(Nginx Master)
cat > /etc/f << EOF
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
state MASTER
interface ens33  # 修改为实际⽹卡名
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯⼀的
priority 100    # 优先级,备服务器设置 90
advert_int 1    # 指定VRRP ⼼跳包通告间隔时间,默认1秒
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP
virtual_ipaddress {
192.168.31.88/24
}
track_script {
check_nginx
vrrp_script:指定检查nginx⼯作状态脚本(根据nginx状态判断是否故障转移)virtual_ipaddress:虚拟IP(VIP)
准备上述配置⽂件中检查nginx运⾏状态的脚本:
cat > /etc/keepalived/check_nginx.sh  << "EOF"
#!/bin/bash
count=$(ss -antp |grep 16443 |egrep -cv "grep|$$")
nginx ssl证书配置
if [ "$count" -eq 0 ];then
exit 1
else
exit 0
fi
EOF
chmod +x /etc/keepalived/check_nginx.sh
2.4 keepalived配置⽂件(Nginx Backup)
cat > /etc/f << EOF
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
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 {
state BACKUP
interface ens33
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯⼀的
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.31.88/24
}
track_script {
check_nginx
}
}
EOF
准备上述配置⽂件中检查nginx运⾏状态的脚本:
cat > /etc/keepalived/check_nginx.sh  << "EOF"
#!/bin/bash
count=$(ss -antp |grep 16443 |egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
exit 1
else
chmod +x /etc/keepalived/check_nginx.sh
注:keepalived根据脚本返回状态码(0为⼯作正常,⾮0不正常)判断是否故障转移。
2.5 启动并设置开机启动
systemctl daemon-reload
systemctl start nginx
systemctl start keepalived
systemctl enable nginx
systemctl enable keepalived
2.6 查看keepalived⼯作状态
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:04:f7:2c brd ff:ff:ff:ff:ff:ff
inet 192.168.31.80/24 brd 192.168.31.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.31.88/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe04:f72c/64 scope link
valid_lft forever preferred_lft forever
可以看到,在ens33⽹卡绑定了192.168.31.88 虚拟IP,说明⼯作正常。
2.7 Nginx+Keepalived⾼可⽤测试
关闭主节点Nginx,测试VIP是否漂移到备节点服务器。
在Nginx Master执⾏ pkill nginx
在Nginx Backup,ip addr命令查看已成功绑定VIP。
三、部署Etcd集
如果你在学习中遇到问题或者⽂档有误可联系阿良~ : k8init
Etcd 是⼀个分布式键值存储系统,Kubernetes使⽤Etcd进⾏数据存储,kubeadm搭建默认情况下只启动⼀个Etcd Pod,存在单点故障,⽣产环境强烈不建议,所以我们这⾥使⽤3台服务器组建集,可容忍1台机器故障,当然,你也可以使⽤5台组建集,可容忍2台机器故障。
节点名称IP
etcd-1192.168.31.61
etcd-2192.168.31.62
etcd-3192.168.31.63
注:为了节省机器,这⾥与K8s节点机器复⽤。也可以独⽴于k8s集之外部署,只要apiserver能连接到就⾏。
3.1 准备cfssl证书⽣成⼯具
cfssl是⼀个开源的证书管理⼯具,使⽤json⽂件⽣成证书,相⽐openssl更⽅便使⽤。
任意⼀台服务器操作,这⾥⽤Master节点。
wget /R1.2/cfssl_linux-amd64
wget /R1.2/cfssljson_linux-amd64
wget /R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
3.2 ⽣成Etcd证书
1. ⾃签证书颁发机构(CA)
创建⼯作⽬录:
mkdir -p ~/etcd_tls
cd ~/etcd_tls

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。