0


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

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

一、前期环境准备

安装要求

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

服务器配置

高可用集群(三主两从一VIP)主机名ip地址配置需要用到的服务备注主k8s-master1172.16.12.1112C/2G/20Gkubeadm,docker,keepalived,haproxy主k8s-master2172.16.12.1122C/2G/20Gkubeadm,docker,keepalived,haproxy主k8s-master3172.16.12.1132C/2G/20Gkubeadm,docker,keepalived,haproxy从k8s-node1172.16.12.1142C/2G/20Gkubeadm,docker从k8s-node2172.16.12.1152C/2G/20Gkubeadm,dockerVIPk8s-vip172.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节点:

规则端口范围作用使用者TCP6443*Kubernetes API serveAllTCP2379-2380etcd server client APIkube-apiserver, etcdTCP10250Kubelet APISelf, Control planeTCP10251kube-schedulerSelfTCP10252kube-controller-managerSelf

node节点:

规则端口范围作用使用者TCP10252Kubelet APISelf, Control planeTCP30000-32767NodePort 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#永久关闭selinuxsed-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 -yinstall 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--nowdocker
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=1gpgchech=0repo_gpgcheck=0gpgkey=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组合结构
在这里插入图片描述

操作步骤

1、安装

yum安装 keepalived 和 haproxy

yum -yinstall 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/basherr=0forkin$(seq13);docheck_code=$(pgrep haproxy)if[[$check_code==""]];thenerr=$(expr $err + 1)sleep1continueelseerr=0breakfidoneif[[$err!="0"]];thenecho"systemctl stop keepalived"
    /usr/bin/systemctl stop keepalived
    exit1elseexit0fi#给监测脚本添加执行权限[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

image-20230904224331108

image-20230904224410255

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

image-20230904224544596

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

image-20230904224645068

④、启动master1节点

vip自动回到master1节点

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

image-20230904224811070

三、初始化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:6443nodeRegistration: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:16443controllerManager:{}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

image-20230903233951745

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

image-20230904111540518

6、加入集群

Token过期后生成新的token:

kubeadm token create --print-join-command

Master需要生成–certificate-key

kubeadm init phase upload-certs --upload-certs

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

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

image-20230903234907811

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

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

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

image-20230903234919319

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

cat<<EOF>> /root/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF#让其生效source /root/.bashrc

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

kubectl get nodes

image-20230903234738565

kubeadm安装方式,所有的系统组件均以容器的方式运行并且在

kube-system

命名空间内,此时可以查看Pod状态:

kubectl get pods -n kube-system -o wide

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

image-20230903235040377

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_IP>:<ETCD_PORT>"#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

image-20230903235958084

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

image-20230904003903428

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

image-20230904001651414

四、集群测试

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 

查看节点状态

image-20230904160921364

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:3selector:matchLabels:app: nginx
  template:metadata:labels:app: nginx
    spec:containers:-image: nginx:1.14.0
        ports:-containerPort:80name: nginx
---apiVersion: v1
kind: Service
metadata:labels:app: nginx
  name: nginx-deployment1
  namespace: nginx-test
spec:ports:-port:9000name: nginx-service80
    protocol: TCP
    targetPort:80nodePort:31090selector:app: nginx
  type: NodePort

image-20230905231333383

访问vip:172.16.12.220:31090

image-20230905231418039

master1断电关机

查看vip到达master2

image-20230905231544195

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

image-20230905231619609

重新开机mster1节点

查看vip回到master1节点

image-20230905231746073

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

image-20230905231834592
证明vip在实际应用中成功

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


本文转载自: https://blog.csdn.net/weixin_53667818/article/details/132702544
版权归原作者 小菜_c 所有, 如有侵权,请联系我们删除。

“搭建多主节点k8s高可用集群(三主两从一VIP)”的评论:

还没有评论