上一篇我们介绍了kubernetes1.17.3单master节点的集群安装,但是对于生产环境来说,需要对master节点做高可用,这样才可以保证集群能够处于稳定的运行状态,那么我们接下来就开始带领大家去安装k8s1.17.3的高可用集群,如果你是初学小白,只要跟着做,也能保证100%完成安装,下面开始我们的安装之旅吧,内容较多,都是干货,无任何套路~~
如果你觉得累,请看看下面这段话:我们想要去的地方,永远没有捷径,只有脚踏实地,一步一个脚印的才能走向诗和远方!
友情提示:
1.k8s1.16.4,k8s1.17.3,k8s1.18高可用集群的安装视频在百度网盘,可按文章最后的方式加我免费获取
2.下文需要的yaml文件所在的github地址:
https://github.com/luckylucky421/kubernetes1.17.3/tree/master
大家可以把我的github仓库fork到你们自己的仓库里,觉得不错的不要忘记在我的github上点star哈~~
3.下文需要的镜像获取方式:
链接:https://pan.baidu.com/s/1UCldCLnIrDpE5NIoMqvXIg 提取码:xk3y
一、准备实验环境
1.准备四台centos7虚拟机,用来安装k8s集群,下面是四台虚拟机的配置情况
master1(192.168.124.16)配置:
操作系统:centos7.4、centos7.5、centos7.6以及更高版本都可以 配置:4核cpu,6G内存,两块60G硬盘 网络:桥接网络
master2(192.168.124.26)配置:
操作系统:centos7.4、centos7.5、centos7.6以及更高版本都可以 配置:4核cpu,6G内存,两块60G硬盘 网络:桥接网络
master3(192.168.124.36)配置:
操作系统:centos7.4、centos7.5、centos7.6以及更高版本都可以 配置:4核cpu,6G内存,两块60G硬盘 网络:桥接网络
node1(192.168.124.56)配置:
操作系统:centos7.6 配置:4核cpu,4G内存,两块60G硬盘 网络:桥接网络
二、初始化实验环境
1.配置静态ip
把虚拟机或者物理机配置成静态ip地址,这样机器重新启动后ip地址也不会发生改变。
1.1 在master1节点配置网络
修改/etc/sysconfig/network-scripts/ifcfg-ens33文件,变成如下:
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static IPADDR=192.168.124.16 NETMASK=255.255.255.0 GATEWAY=192.168.124.1 DNS1=192.168.124.1 DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 DEVICE=ens33 ONBOOT=yes
修改配置文件之后需要重启网络服务才能使配置生效,重启网络服务命令如下:
service network restart
1.2 在master2节点配置网络
修改/etc/sysconfig/network-scripts/ifcfg-ens33文件,变成如下:
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static IPADDR=192.168.124.26 NETMASK=255.255.255.0 GATEWAY=192.168.124.1 DNS1=192.168.124.1 DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 DEVICE=ens33 ONBOOT=yes
修改配置文件之后需要重启网络服务才能使配置生效,重启网络服务命令如下:
service network restart
1.3 在master3节点配置网络
修改/etc/sysconfig/network-scripts/ifcfg-ens33文件,变成如下:
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static IPADDR=192.168.124.36 NETMASK=255.255.255.0 GATEWAY=192.168.124.1 DNS1=192.168.124.1 DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 DEVICE=ens33 ONBOOT=yes
修改配置文件之后需要重启网络服务才能使配置生效,重启网络服务命令如下:
service network restart
注:ifcfg-ens33文件配置解释:
IPADDR=192.168.124.16 #ip地址,需要跟自己电脑所在网段一致 NETMASK=255.255.255.0 #子网掩码,需要跟自己电脑所在网段一致 GATEWAY=192.168.124.1 #网关,在自己电脑打开cmd,输入ipconfig /all可看到 DNS1=192.168.124.1 #DNS,在自己电脑打开cmd,输入ipconfig /all可看到
1.4 在node1节点配置网络
修改/etc/sysconfig/network-scripts/ifcfg-ens33文件,变成如下:
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static IPADDR=192.168.124.56 NETMASK=255.255.255.0 GATEWAY=192.168.124.1 DNS1=192.168.124.1 DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 DEVICE=ens33 ONBOOT=yes
修改配置文件之后需要重启网络服务才能使配置生效,重启网络服务命令如下:
service network restart
2.安装基础软件包,各个节点操作
yum -y install wget net-tools nfs-utilslrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzipsudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate
3.关闭firewalld防火墙,各个节点操作,centos7系统默认使用的是firewalld防火墙,停止firewalld防火墙,并禁用这个服务
systemctl stop firewalld &&systemctl disable firewalld
4.安装iptables,各个节点操作,如果你用firewalld不是很习惯,可以安装iptables,这个步骤可以不做,根据大家实际需求
4.1 安装iptables
yum install iptables-services -y
4.2 禁用iptables
service iptables stop && systemctl disable iptables
5.时间同步,各个节点操作
5.1 时间同步
ntpdate cn.pool.ntp.org
5.2 编辑计划任务,每小时做一次同步
crontab -e* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
6. 关闭selinux,各个节点操作
关闭selinux,设置永久关闭,这样重启机器selinux也处于关闭状态
修改/etc/sysconfig/selinux文件
sed -i 's/SELINUX=enforcing/SELINUX=disabled/'/etc/sysconfig/selinuxsed -i"s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
上面文件修改之后,需要重启虚拟机,可以强制重启:
reboot -f
7.关闭交换分区,各个节点操作
swapoff -a# 永久禁用,打开/etc/fstab注释掉swap那一行。sed -i 's/.*swap.*/#&/' /etc/fstab
8.修改内核参数,各个节点操作
cat <<EOF > /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsysctl --system
9.修改主机名
在192.168.124.16上:
hostnamectl set-hostname master1
在192.168.124.26上:
hostnamectl set-hostname master2
在192.168.124.36上:
hostnamectl set-hostname master3
在192.168.124.56上:
hostnamectl set-hostname node1
10.配置hosts文件,各个节点操作
在/etc/hosts文件增加如下几行:
192.168.124.16 master1192.168.124.26 master2192.168.124.36 master3192.168.124.56 node1
11.配置master1到node无密码登陆,配置master1到master2、master3无密码登陆
在master1上操作
ssh-keygen -t rsa
#一直回车就可以
ssh-copy-id -i .ssh/id_rsa.pubroot@192.168.124.26
#上面需要输入密码,输入master2物理机密码即可
ssh-copy-id -i .ssh/id_rsa.pubroot@192.168.124.36
#上面需要输入密码,输入master3物理机密码即可
ssh-copy-id -i .ssh/id_rsa.pubroot@192.168.124.56
#上面需要输入密码,输入node1物理机密码即可
三、安装kubernetes1.17.3高可用集群
1.修改yum源,各个节点操作
(1)备份原来的yum源
mv /etc/yum.repos.d/CentOS-Base.repo/etc/yum.repos.d/CentOS-Base.repo.backup
(2)下载阿里的yum源
wget -O /etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-7.repo
(3)生成新的yum缓存
yum makecache fast
(4)配置安装k8s需要的yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0EOF
(5)清理yum缓存
yum clean all
(6)生成新的yum缓存
yum makecache fast
(7)更新yum源
yum -y update
(8)安装软件包
yum -y install yum-utilsdevice-mapper-persistent-data lvm2
(9)添加新的软件源
yum-config-manager--add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.安装docker19.03,各个节点操作
2.1 查看支持的docker版本
yum list docker-ce --showduplicates |sort-r
2.2 下载19.03.7版本
yum install -y docker-ce-19*systemctl enable docker &&systemctl start docker
#查看docker状态,如果状态是active(running),说明docker是正常运行状态
systemctl status docker
2.3 修改docker配置文件,配置镜像加速器
cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] } EOF
2.4 重启docker使配置生效
systemctl daemon-reload && systemctlrestart docker
2.5 设置网桥包经IPTables,core文件生成路径,配置永久生效
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables echo 1 >/proc/sys/net/bridge/bridge-nf-call-ip6tables echo """ vm.swappiness = 0 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 """ > /etc/sysctl.conf sysctl -p
2.6 开启ipvs,不开启ipvs将会使用iptables,但是效率低,所以官网推荐需要开通ipvs内核
cat >/etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash ipvs_modules="ip_vs ip_vs_lc ip_vs_wlcip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nqip_vs_sed ip_vs_ftp nf_conntrack" for kernel_module in \${ipvs_modules}; do /sbin/modinfo -F filename \${kernel_module}> /dev/null 2>&1 if [$? -eq 0 ]; then /sbin/modprobe \${kernel_module} fi done EOF chmod755 /etc/sysconfig/modules/ipvs.modules && bash/etc/sysconfig/modules/ipvs.modules && modprobe ip_vs && lsmod| grep ip_vs
3.安装kubernetes1.17.3
3.1 在master1、master2、master3和node1上安装kubeadm和kubelet
yum install kubeadm-1.17.3 kubelet-1.17.3 -y systemctl enable kubelet
3.2上传镜像到master1、master2、master3和node1节点之后,手动解压镜像,镜像在百度网盘,我的是从官方下载的镜像,大家可以放心使用
docker load -i kube-apiserver.tar.gz docker load -i kube-scheduler.tar.gz docker load -i kube-controller-manager.tar.gz docker load -i pause.tar.gz docker load -i cordns.tar.gz docker load -i etcd.tar.gz docker load -i kube-proxy.tar.gz docker load -i cni.tar.gz docker load -i calico-node.tar.gz docker load -i kubernetes-dashboard_1_10.tar.gz docker load -i metrics-server-amd64_0_3_1.tar.gz docker load -i addon.tar.gz
说明:
pause版本是3.1,用到的镜像是k8s.gcr.io/pause:3.1
etcd版本是3.4.3,用到的镜像是k8s.gcr.io/etcd:3.4.3-0
cordns版本是1.6.5,用到的镜像是k8s.gcr.io/coredns:1.6.5
cni版本是3.5.3,用到的镜像是quay.io/calico/cni:v3.5.3
calico版本是3.5.3,用到的镜像是quay.io/calico/node:v3.5.3
apiserver、scheduler、controller-manager、kube-proxy版本是1.17.3,用到的镜像分别是
k8s.gcr.io/kube-apiserver:v1.17.3
k8s.gcr.io/kube-controller-manager:v1.17.3
k8s.gcr.io/kube-scheduler:v1.17.3
k8s.gcr.io/kube-proxy:v1.17.3
kubernetes dashboard版本1.10.1,用到的镜像是k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
metrics-server版本0.3.1,用到的镜像是k8s.gcr.io/metrics-server-amd64:v0.3.1
addon-resizer版本是1.8.4,用到的镜像是k8s.gcr.io/addon-resizer:1.8.4
3.3 部署keepalive+lvs实现master节点高可用-对apiserver做高可用
(1)部署keepalived+lvs,在各master节点操作
yum install -y socat keepalived ipvsadm conntrack
(2)修改master1的keepalived.conf文件,按如下修改
修改/etc/keepalived/keepalived.conf
master1节点修改之后的keepalived.conf如下所示:
global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP nopreempt interface ens33 virtual_router_id 80 priority 100 advert_int 1 authentication { auth_type PASS auth_pass just0kk } virtual_ipaddress { 192.168.124.199 } } virtual_server 192.168.124.199 6443 { delay_loop 6 lb_algo loadbalance lb_kind DR net_mask 255.255.255.0 persistence_timeout 0 protocol TCP real_server 192.168.124.16 6443 { weight 1 SSL_GET { url { path /healthz status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.124.26 6443 { weight 1 SSL_GET { url { path /healthz status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.124.36 6443 { weight 1 SSL_GET { url { path /healthz status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
(3)修改master2的keepalived.conf文件,按如下修改
修改/etc/keepalived/keepalived.conf
master2节点修改之后的keepalived.conf如下所示:
global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP nopreempt interface ens33 virtual_router_id 80 priority 50 advert_int 1 authentication { auth_type PASS auth_pass just0kk } virtual_ipaddress { 192.168.124.199 } } virtual_server 192.168.124.199 6443 { delay_loop 6 lb_algo loadbalance lb_kind DR net_mask 255.255.255.0 persistence_timeout 0 protocol TCP real_server 192.168.124.16 6443 { weight 1 SSL_GET { url { path /healthz status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.124.26 6443 { weight 1 SSL_GET { url { path /healthz status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.124.36 6443 { weight 1 SSL_GET { url { path /healthz status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
(4)修改master3的keepalived.conf文件,按如下修改
修改/etc/keepalived/keepalived.conf
master3节点修改之后的keepalived.conf如下所示:
global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP nopreempt interface ens33 virtual_router_id 80 priority 30 advert_int 1 authentication { auth_type PASS auth_pass just0kk } virtual_ipaddress { 192.168.124.199 } } virtual_server 192.168.124.199 6443 { delay_loop 6 lb_algo loadbalance lb_kind DR net_mask 255.255.255.0 persistence_timeout 0 protocol TCP real_server 192.168.124.16 6443 { weight 1 SSL_GET { url { path /healthz status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.124.26 6443 { weight 1 SSL_GET { url { path /healthz status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.124.36 6443 { weight 1 SSL_GET { url { path /healthz status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
重要知识点,必看,否则生产会遇到巨大的坑
keepalive需要配置BACKUP,而且是非抢占模式nopreempt,假设master1宕机, 启动之后vip不会自动漂移到master1,这样可以保证k8s集群始终处于正常状态, 因为假设master1启动,apiserver等组件不会立刻运行,如果vip漂移到master1, 那么整个集群就会挂掉,这就是为什么我们需要配置成非抢占模式了
启动顺序master1->master2->master3,在master1、master2、master3依次执行如下命令
systemctl enable keepalived && systemctl start keepalived && systemctl status keepalived
keepalived启动成功之后,在master1上通过ip addr可以看到vip已经绑定到ens33这个网卡上了
2: ens33:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UPgroup default qlen 1000 link/ether 00:0c:29:9d:7b:09 brd ff:ff:ff:ff:ff:ff inet 192.168.124.16/24 brd 192.168.124.255 scope global noprefixrouteens33 valid_lft forever preferred_lft forever inet 192.168.124.199/32 scopeglobal ens33 valid_lft forever preferred_lft forever inet6 fe80::e2f9:94cd:c994:34d9/64 scope link tentative noprefixroutedadfailed valid_lft forever preferred_lft forever inet6 fe80::ed0d:a5fc:e36a:a563/64 scope link noprefixroute valid_lft forever preferred_lft forever