搭建多主节点k8s高可用集群(三主两从一VIP)

搭建多主节点k8s高可用集群(三主两从一VIP)

一、前期环境准备

安装要求

  • 集群所有机器都要操作
  • 一台或多台机器,操作系统CentOS7.x-86_x64
  • 硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘20GB 或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap 分区

服务器配置

高可用集群(三主两从一VIP) 主机名 ip地址 配置 需要用到的服务 备注
k8s-master1 172.16.12.111 2C/2G/20G kubeadm,docker,keepalived,haproxy
k8s-master2 172.16.12.112 2C/2G/20G kubeadm,docker,keepalived,haproxy
k8s-master3 172.16.12.113 2C/2G/20G kubeadm,docker,keepalived,haproxy
k8s-node1 172.16.12.114 2C/2G/20G kubeadm,docker
k8s-node2 172.16.12.115 2C/2G/20G kubeadm,docker
VIP k8s-vip 172.16.12.220 不需要真实服务器也可
1、检查操作系统的版本
# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
cat /etc/redhat-release
Centos Linux 7.5.1804 (Core)
2、禁用iptable和firewalld服务

kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

# 关闭iptables服务
systemctl stop iptables
systemctl disable iptables
#关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
2.1 补充:

如果在云服务器之类的不能关闭防火墙,需要开启相关端口;

master节点:
规则 端口范围 作用 使用者
TCP 6443* Kubernetes API serve All
TCP 2379-2380 etcd server client API kube-apiserver, etcd
TCP 10250 Kubelet API Self, Control plane
TCP 10251 kube-scheduler Self
TCP 10252 kube-controller-manager Self
node节点:
规则 端口范围 作用 使用者
TCP 10252 Kubelet API Self, Control plane
TCP 30000-32767 NodePort Services** All
3、添加阿里云yum源
cat >> /etc/yum.repo/aliyun.repo << EOF 
[aliyun-os]
name=aliyun-os
baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/
enabled=1
gpgcheck=0

[aliyun-epel]
name=aliyun-epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
enabled=1
gpgcheck=0

[aliyun-extra]
name=aliyun-extra
baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
enabled=1
gpgcheck=0
EOF

#清除缓存
yum clean all

#重新加载源缓存
yum makecache
4、关闭selinux
#临时关闭selinux
setenforce 0

#永久关闭selinux
sed -i 's/^SELINUX=enforcing$/SELINUX=diasbled/' /etc/selinux/config

#临时关闭所有的交换分区
swapoff -a

#永久关闭所有的交换分区
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
5、修改主机名:
#进入相关主机操作
[root@k8s-master1 ~]# hostnamectl set-hostname k8s-master1
[root@k8s-master2 ~]# hostnamectl set-hostname k8s-master2
[root@k8s-master3 ~]# hostnamectl set-hostname k8s-master3
[root@k8s-node1 ~]# hostnamectl set-hostname k8s-node1
[root@k8s-node2 ~]# hostnamectl set-hostname k8s-node2
6、修改hosts文件
cat >> /etc/hosts << EOF 
172.16.12.111 k8s-master1
172.16.12.112 k8s-master2
172.16.12.113 k8s-master3
172.16.12.114 k8s-node1
172.16.12.115 k8s-node2
172.16.12.220 k8s-vip
EOF
7、时间同步
#安裝同步时间命令
yum install ntpdate -y

#同步时间
ntpdate cn.pool.ntp.org

#设置定时任务每五分钟同步一次时间
echo "*/5 * * * * root /usr/sbin/ntpdate cn.pool.ntp.org &>/dev/null" >> /etc/crontab
8、调整文件数大小
[root@k8s-master1 ~]# ulimit -SHn 65535

[root@k8s-master1 ~]# cat >> /etc/security/limits.conf << EOF 

* soft nofile 655360
* hard nofile 131072
* soft nproc 65535
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
  EOF

补充说明:

  • hard:严格的设定,必定不能超过这个设定的数值

  • soft:警告的设定,可以超过这个设定值,但是若超过则有警告信息 限制资源:

  • core – 限制内核文件的大小

  • date – 最大数据大小

  • fsize – 最大文件大小

  • memlock – 最大锁定内存地址空间

  • nofile – 打开文件的最大数目

  • rss – 最大持久设置大小

  • stack – 最大栈大小

  • cpu – 以分钟为单位的最多 CPU 时间

  • noproc – 进程的最大数目(系统的最大进程数)

  • as – 地址空间限制 maxlogins – 此用户允许登录的最大数目

9、安装配置ipvsadm
#安装所需的命令(上面已经全部安装了,可以不用管)
[root@k8s-master1 ~]# yum -y install ipvsadm ipset sysstat conntrack libseccomp

#加载ipvs相关模块
[root@k8s-master1 ~]# modprobe -- ip_vs
[root@k8s-master1 ~]# modprobe -- ip_vs_rr
[root@k8s-master1 ~]# modprobe -- ip_vs_wrr
[root@k8s-master1 ~]# modprobe -- ip_vs_sh
[root@k8s-master1 ~]# modprobe -- nf_conntrack_ipv4
[root@k8s-master1 ~]# cat > /etc/modules-load.d/ipvs.conf << EOF
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF

[root@k8s-master1 ~]# systemctl enable --now systemd-modules-load.service
10、免密登录
#生成密钥
[root@k8s-master1 ~]# ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa &> /dev/null
#循环给高可用集群进行免密设置
[root@k8s-master1 ~]# for i in k8s-master1 k8s-master2 k8s-master3 k8s-node1 k8s-node2;do sshpass -p '服务器root密码' ssh-copy-id -o StrictHostKeyChecking='no' -i .ssh/id_rsa.pub $i;done
11、安装docker
yum -y install gcc-c++ gcc
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io
yum makecache fast
#启动docker服务并设置开机自启
systemctl start enable --now docker
11-1 配置docker

docker镜像加速器,cgroup

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://t1fyrekt.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#由于新版kubelet建议使用systemd,所以可以把docker的CgroupDriver改成systemd

#重新加载docker配置
systemctl daemon-reload
#重新启动docker服务
systemctl restart docker
12、配置相关的内核参数

将桥接的IPv4 流量传递到iptables 的链

cat <<EOF >> /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF

#让其生效
sysctl --system
13、添加kubenetes国内镜像源
# 1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
			http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

# 3、安装kubeadm、kubelet和kubectl
[root@master ~]# yum install --setopt=obsoletes=0  kubeadm-1.21.0 kubelet-1.21.0 kubectl-1.21.0 -y

# 4、配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet, 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

#查看kubeadm版本
kubeadm version

# 5、设置kubelet开机自启
[root@master ~]# systemctl enable --now kubelet

image-20230903223754122

13-1 k8s命令自动补全配置
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
#终端重新连接才能生效

二、部署keepalived+haproxy 高可用

仅需部署在三台master节点

说明:

健康检查和失败切换是keepalived的两大核心功能

健康检查是用tcp三次握手,http请求等方式对负载均衡器后面的实际的服务器进行健康状态检测;

失败切换是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳。当主负载均衡器出现问题时,由备负载均衡器承载对应的业务

HAProxy 是一款TCP/HTTP 反向代理负载均衡服务器软件,类似nginx。

​ 当k8s集群中某个节点服务器发生故障时,Keepalived服务会自动将失效的节点从正常队列中剔除,并将请求调度到别的正常的节点服务器上,从而保证用户访问不受影响。当故障节点被修复后,Keepalived服务又会自动切换回来。

​ 如果是公有云平台部署可以选择公用云自带的负载均衡来代替haproxy和keepalived,比如阿里云的SLB,或者腾讯云的ELB(大部分公有云不支持keepalived)。如果使用的是阿里云,kubectl控制端不能放在master节点,因为阿里云SLB有回环问题,也就是说SLB代理的服务器不能反向访问这个问题,但是腾讯云修复了这个问题。

Keepalived和HAProxy组合结构
搭建多主节点k8s高可用集群(三主两从一VIP)_第1张图片

操作步骤

1、安装

yum安装 keepalived 和 haproxy

yum -y install keepalived haproxy
2、修改haproxy配置
[root@k8s-master1 ~]#cat /etc/haproxy/haproxy.cfg
global
  maxconn  2000
  ulimit-n  16384
  log  127.0.0.1 local0 err
  stats timeout 30s

defaults
  log global
  mode  http
  option  httplog
  timeout connect 5000
  timeout client  50000
  timeout server  50000
  timeout http-request 15s
  timeout http-keep-alive 15s

frontend monitor-in
  bind *:33305
  mode http
  option httplog
  monitor-uri /monitor

frontend k8s-master
  bind 0.0.0.0:16443
  bind 127.0.0.1:16443
  mode tcp
  option tcplog
  tcp-request inspect-delay 5s
  default_backend k8s-master

backend k8s-master
  mode tcp
  option tcplog
  option tcp-check
  balance roundrobin
  default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
  server k8s-master1	172.16.12.111:6443  check  
  server k8s-master2	172.16.12.112:6443  check
  server k8s-master3	172.16.12.113:6443  check
3、配置keepalived
  • interface      #网卡名称
  • mcast_src_ip    #该节点的ip
  • virtual_ipaddress   #vip地址
k8s-master1配置
[root@k8s-master1 ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
script_user root
    enable_script_security
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh" #健康检查脚本
    interval 5
    weight -5
    fall 2  
    rise 1
}
vrrp_instance VI_1 {
    state MASTER					#高可用主1
    interface eth0					#网卡名称
    mcast_src_ip 172.16.12.111		#该节点 IP
    virtual_router_id 51
    priority 100				#设置最高级优先级
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        172.16.12.220			#vip地址
    }
    track_script {
       chk_apiserver
    }
}

k8s-master2配置
[root@k8s-master2 ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
script_user root
    enable_script_security
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh"
    interval 5
    weight -5
    fall 2  
    rise 1
}
vrrp_instance VI_1 {
    state BACKUP					#高可用 从1
    interface ens33					#网卡名称
    mcast_src_ip 172.16.12.112	    #该k8s-master2节点 IP
    virtual_router_id 51
    priority 50				#设置优先级
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        172.16.12.220			#vip地址
    }
    track_script {
       chk_apiserver
    }
}

k8s-master3配置
[root@k8s-master3 ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
script_user root
    enable_script_security
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh"
    interval 5
    weight -5
    fall 2  
    rise 1
}
vrrp_instance VI_1 {
    state BACKUP					#高可用从2
    interface ens33					#网卡名称
    mcast_src_ip 172.16.12,113		#该节点 IP
    virtual_router_id 51
    priority 49				#设置优先级
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        172.16.12.220			#vip地址
    }
    track_script {
       chk_apiserver
    }
}

4、健康检测脚本

所有主节点都需要

[root@k8s-master1 ~]# cat /etc/keepalived/check_apiserver.sh
#!/bin/bash
err=0
for k in $(seq 1 3);do
    check_code=$(pgrep haproxy)
    if [[ $check_code == "" ]]; then
        err=$(expr $err + 1)
        sleep 1
        continue
    else
        err=0
        break
    fi
done

if [[ $err != "0" ]]; then
    echo "systemctl stop keepalived"
    /usr/bin/systemctl stop keepalived
    exit 1
else
    exit 0
fi

#给监测脚本添加执行权限
[root@k8s-master1 ~]# chmod +x /etc/keepalived/check_apiserver.sh
5、启动

启动 keepalived 与 haproxy

#生效配置文件
[root@k8s-master1 ~]# systemctl daemon-reload

#启动并设置开机自启haproxy
[root@k8s-master1 ~]# systemctl enable --now haproxy

#启动并设置开机自启keepalived
[root@k8s-master1 ~]# systemctl enable --now keepalived

测试vip漂移

①、k8s-master1主节点查看VIP
#查看IP与vip的IP
[root@k8s-master1 ~]# hostname -I

#测试vip的16443端口是否通
[root@k8s-master1 ~]# nc -v 172.16.12.220 16443

搭建多主节点k8s高可用集群(三主两从一VIP)_第2张图片

搭建多主节点k8s高可用集群(三主两从一VIP)_第3张图片

②、手动关闭master1节点
[root@k8s-master1 ~]# systemctl stop keepalived.service

搭建多主节点k8s高可用集群(三主两从一VIP)_第4张图片

③、按照keepalived的配置优先级,到master2查看

搭建多主节点k8s高可用集群(三主两从一VIP)_第5张图片

④、启动master1节点

vip自动回到master1节点

[root@k8s-master1 ~]# systemctl start keepalived.service

搭建多主节点k8s高可用集群(三主两从一VIP)_第6张图片

三、初始化k8s

master节点初始化

1、修改配置文件

k8s-master1节点创建kubeadm-config.yaml

  • advertiseAddress      #自己的master1节点IP

  • name            #自己的master1节点的名称

  • certSANs         #vip地址

  • controlPlaneEndpoint    #vip地址

  • kubernetesVersion     #kubernets版本

  • podSubnet         #pod网段

  • serviceSubnet       #service网段

[root@k8s-master1 ~]# vim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: 7t2weq.bjbawausm0jaxury
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 172.16.12.111
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8s-master1
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  certSANs:
  - 172.16.12.220
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 172.16.12.220:16443
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.21.0
networking:
  dnsDomain: cluster.local
  podSubnet: 10.0.0.0/16
  serviceSubnet: 10.96.0.0/12 #pod和service不能在同一网段
scheduler: {}
2、更新配置文件
kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml
3、同步配置文件

将new.yaml文件复制到其他master节点

scp new.yaml 172.16.12.112:/root/
scp new.yaml 172.16.12.113:/root/

查看需要的镜像文件

kubeadm config images list --config /root/new.yaml

搭建多主节点k8s高可用集群(三主两从一VIP)_第7张图片

4、下载镜像

所有master节点操作

kubeadm config images pull --config /root/new.yaml

coredns镜像可能下载不了,可以“曲线救国”

docker pull coredns/coredns:1.8.0

docker tag coredns/coredns:1.8.0 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
5、初始化master1节点

master1节点 初始化,初始化后生成对应的证书

kubeadm init --config /root/new.yaml  --upload-certs

搭建多主节点k8s高可用集群(三主两从一VIP)_第8张图片

6、加入集群

Token过期后生成新的token:

kubeadm token create --print-join-command

Master需要生成–certificate-key

kubeadm init phase upload-certs --upload-certs

在其他主节点执行,加入集群

kubeadm join 172.16.12.220:16443 --token 7t2weq.bjbawausm0jaxury \
	--discovery-token-ca-cert-hash sha256:c1a423c36d4e61b2aad80b1b96054a6b3383c975d37913aadc16e8ab0c221997 \
	--control-plane --certificate-key 68325dbd227c04b0a711a7e03af388e113ab9cddc876b231cc3ab02d74622db6

搭建多主节点k8s高可用集群(三主两从一VIP)_第9张图片

在node节点执行,加入集群。

Node节点上主要部署公司的一些业务应用,不建议在master节点部署应用。测试环境节约资源可将pod移至master节点。

kubeadm join 172.16.12.220:16443 --token 7t2weq.bjbawausm0jaxury \
	--discovery-token-ca-cert-hash sha256:c1a423c36d4e61b2aad80b1b96054a6b3383c975d37913aadc16e8ab0c221997

搭建多主节点k8s高可用集群(三主两从一VIP)_第10张图片

master1节点 配置环境变量,用于访问Kubernetes集群

cat <<EOF >> /root/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF

#让其生效
source /root/.bashrc

在 master1节点 查看集群节点状态

kubectl get nodes

搭建多主节点k8s高可用集群(三主两从一VIP)_第11张图片

kubeadm安装方式,所有的系统组件均以容器的方式运行并且在kube-system命名空间内,此时可以查看Pod状态:

kubectl get pods -n kube-system -o wide

发现coredns处于pending状态,是因为集群网络还未连通,无法相互访问。

搭建多主节点k8s高可用集群(三主两从一VIP)_第12张图片

Calico网络组件

(只在 master1节点 操作)【网络插件,用于连接其他节点】

补充:

calico网络插件是如何在不同的node节点之间通信,如何确保不同主机的通信

1、Calico 是一种基于 BGP 协议的容器网络插件,它使用 IP-in-IP 或 VXLAN 将容器节点连接到网络。Calico 可以在 Kubernetes 集群中提供高性能和高可靠性的容器网络,并且支持跨多个主机的容器通信。

2、Calico 通过创建一个虚拟网络层次结构,将每个节点上的容器连接到网络。每个节点上都运行了 Calico 节点代理,这个代理负责管理每个节点上的网络路由和策略。

3、当一个容器需要与另一个容器进行通信时,它会使用 Calico 的虚拟网络层次结构来查找目标容器的 IP 地址。然后,Calico 会根据 BGP 协议来选择最佳的路径来路由数据包。

4、通过 BGP 协议,Calico 可以确保容器在不同主机之间的通信。为了确保不同主机之间的通信,Calico 会在每个节点上创建一个虚拟路由器,并在每个路由器之间建立 BGP 对等连接。通过这些对等连接,每个节点上的路由器可以了解整个网络的拓扑,并决定最佳路径来路由数据包。

5、此外,Calico 还可以使用网络策略来控制容器之间的访问。通过定义网络策略,管理员可以限制容器之间的流量,并确保只有授权的容器才能相互通信。

1、拉取安装包

(安装包内包含:Calico组件、Metrics组件、Dashboard组件)

git clone https://github.com/dotbalo/k8s-ha-install.git
或者使用国内镜像下载
git clone https://kgithub.com/dotbalo/k8s-ha-install.git/
#拉取完成进入该目录
cd k8s-ha-install

#切换到manual-installation-v1.20.x分支
[root@k8s-master1 k8s-ha-install]# git checkout manual-installation-v1.20.x
2、修改配置文件

如果集群重新初始化了,里面的密钥内容也需要修改。

#进入calico目录
[root@k8s-master1 k8s-ha-install]# cd calico/
注意事项:
◎ 需要改的就只要第一行的ip
#将要修改的ip改为自己的ip,按照master节点顺序的改成自己的节点ip
[root@k8s-master1 calico]# sed -i 's#etcd_endpoints: "http://:"#etcd_endpoints: "https://172.16.12.111:2379,https://172.16.12.112:2379,https://172.16.12.113:2379"#g' calico-etcd.yaml

#设置临时环境变量ETCD_CA查看ca.crt文件并转化为base64格式取消换行符
[root@k8s-master1 calico]# ETCD_CA=`cat /etc/kubernetes/pki/etcd/ca.crt | base64 | tr -d '\n'`
#设置临时环境变量ETCD_CERT查看server.crt文件并转化为base64格式取消换行符
[root@k8s-master1 calico]# ETCD_CERT=`cat /etc/kubernetes/pki/etcd/server.crt | base64 | tr -d '\n'`
#设置临时环境变量ETCD_KEY查看server.key文件并转化为base64格式取消换行符
[root@k8s-master1 calico]# ETCD_KEY=`cat /etc/kubernetes/pki/etcd/server.key | base64 | tr -d '\n'`

#更换calico-etcd.yaml文件中的# etcd-key: null、# etcd-cert: null、# etcd-ca: null为指定值,临时的环境变量这这用。
[root@k8s-master1 calico]# sed -i "s/# etcd-key: null/etcd-key: ${ETCD_KEY}/g; s/# etcd-cert: null/etcd-cert: ${ETCD_CERT}/g; s/# etcd-ca: null/etcd-ca: ${ETCD_CA}/g" calico-etcd.yaml

#更换calico-etcd.yaml文件中的etcd_ca: ""#、etcd_cert: ""、etcd_key: "" 为指定值
[root@k8s-master1 calico]# sed -i 's#etcd_ca: ""#etcd_ca: "/calico-secrets/etcd-ca"#g; s#etcd_cert: ""#etcd_cert: "/calico-secrets/etcd-cert"#g; s#etcd_key: "" #etcd_key: "/calico-secrets/etcd-key" #g' calico-etcd.yaml

#设置临时环境变量POD_SUBNET从kubernetes配置文件中查找自己的网关
[root@k8s-master1 calico]# POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`

#注意下面的这个步骤是把calico-etcd.yaml文件里面的CALICO_IPV4POOL_CIDR下的网段改成自己的Pod网段(kubeadm-config.yaml),并打开注释,不用手动改,会用到上面的环境变量;
[root@k8s-master1 calico]# sed -i 's@# - name: CALICO_IPV4POOL_CIDR@- name: CALICO_IPV4POOL_CIDR@g; s@#   value: "192.168.0.0/16"@  value: '"${POD_SUBNET}"'@g' calico-etcd.yaml
3、启动
[root@k8s-maste1 calico]# kubectl apply -f calico-etcd.yaml

搭建多主节点k8s高可用集群(三主两从一VIP)_第13张图片

4、查看容器状态
[root@k8s-master1 calico]# kubectl get pods -n kube-system -o wide

搭建多主节点k8s高可用集群(三主两从一VIP)_第14张图片

5、查看节点网络连接状态
[root@k8s-master1 calico]# kubectl get nodes

搭建多主节点k8s高可用集群(三主两从一VIP)_第15张图片

四、集群测试

Metrics部署

将Master1节点的front-proxy-ca.crt复制到所有Node节点

#复制到node1节点上
[root@k8s-master1 ~]# scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node1:/etc/kubernetes/pki/front-proxy-ca.crt

#复制到node2节点上
[root@k8s-master1 ~]# scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node2:/etc/kubernetes/pki/front-proxy-ca.crt

安装metrics server

#进入上一步拉取的k8s-ha-install/metrics-server-0.4.x-kubeadm/目录
[root@k8s-master1 ~]# cd /root/k8s-ha-install/metrics-server-0.4.x-kubeadm/ 

#根据该目录下的yaml文件创建容器
[root@k8s-master1 metrics-server-0.4.x-kubeadm]# kubectl apply -f comp.yaml 

查看节点状态

搭建多主节点k8s高可用集群(三主两从一VIP)_第16张图片

nginx部署

编写yaml文件

vim nginx.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: nginx-test
  labels:
    name: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment1
  namespace: nginx-test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.0
        ports:
        - containerPort: 80
        name: nginx
--- 
apiVersion: v1
kind: Service
metadata:
  labels:
   app: nginx
  name: nginx-deployment1
  namespace: nginx-test
spec:
  ports:
  - port: 9000
    name: nginx-service80
    protocol: TCP
    targetPort: 80
    nodePort: 31090
  selector:
    app: nginx
  type: NodePort

搭建多主节点k8s高可用集群(三主两从一VIP)_第17张图片

访问vip:172.16.12.220:31090

搭建多主节点k8s高可用集群(三主两从一VIP)_第18张图片

master1断电关机

查看vip到达master2

搭建多主节点k8s高可用集群(三主两从一VIP)_第19张图片

打开浏览器无痕访问vip:172.16.12.220:31090

搭建多主节点k8s高可用集群(三主两从一VIP)_第20张图片

重新开机mster1节点

查看vip回到master1节点

搭建多主节点k8s高可用集群(三主两从一VIP)_第21张图片

再次打开浏览器无痕访问vip:172.16.12.220:31090

搭建多主节点k8s高可用集群(三主两从一VIP)_第22张图片
证明vip在实际应用中成功

操作借鉴云原生-K8s-2
加自己的理解与具体实践上的修改

你可能感兴趣的:(k8s,kubernetes,容器,云原生,nginx,docker)