kubeadm部署k8s 1.26.0版本高可用集群

1.前言

本次搭建使用centos7.9系统,并且使用haproxy+keepalived作为高可用架构软件,haproxy实现k8s集群管理节点apiserver服务的负载均衡以实现集群的高可用功能,keepalived保障了hapxoy的高可用,容器引擎使用docker,需要额外引入cri-docker服务,且使用集群内置的etcd服务,并配置etcd的高可用集群,kubernetes使用版本为1.26.0

2.集群信息

主机名称IPPORTSERVICE
k8s-master0110.1.60.11916443、6443kubeadm、kubectl、kubelet、docker、cri-docker、keepalived、haproxy、etcd
k8s-master0210.1.60.12016443、6443kubeadm、kubectl、kubelet、docker、cri-docker、keepalived、haproxy、etcd
k8s-master0310.1.60.12116443、6443kubeadm、kubectl、kubelet、docker、cri-docker、keepalived、haproxy、etcd
k8s-node0110.1.60.122kubeadm、kubectl、kubelet、docker、cri-docker
k8s-node0210.1.60.123kubeadm、kubectl、kubelet、docker、cri-docker

3.系统基础环境配置(所有主机均要配置)

3.1关闭防火墙

systemctl stop firewalld && systemctl disable firewalld

3.2关闭selinux服务

setenforce 0  #临时关闭

sed -i 's/enforcing/disabled/' /etc/selinux/config #永久关闭

3.3关闭系统交换分区

swapoff -a #临时关闭

sed -ri 's/.*swap.*/#&/' /etc/fstab  #永久关闭

3.4设置主机名称(每台主机名称不一样按照表格上的主机名填)

hostnamectl set-hostname k8s-master01

3.5编辑hosts文件

cat > /etc/hosts << EOF

10.1.60.119 k8s-master01

10.1.60.120 k8s-master01

10.1.60.121 k8s-master01

10.1.60.122 k8s-node01

10.1.60.123 k8s-node02

10.1.60.124 k8s-mastervip

EOF

3.6配置时间同步

yum -y install chrony

systemctl strat chronyd && systemctl enbale chronyd

3.7配置ipvs

cat > /etc/sysconfig/modules/ipvs.modules <<EOF

#!/bin/bash

modprobe -- ip_vs

modprobe -- ip_vs_rr

modprobe -- ip_vs_wrr

modprobe -- ip_vs_sh

modprobe -- nf_conntrack_ipv4

EOF

#授权并生效ipvs配置

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules

yum install -y ipset ipvsadm

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf

overlay

br_netfilter

EOF

sudo modprobe overlay && sudo modprobe br_netfilter

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

cat > /etc/sysctl.d/k8s.conf << EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

EOF

 sysctl --system  #配置生效

4.安装docker服务

4.1下载docker yum源

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

 4.2安装docker服务

yum -y install docker-ce

4.3启用docker并配置开机启动

systemctl start docker && systemctl enable docker

4.4配置docker镜像加速

cat > /etc/docker/daemon.json << EOF

{
  "registry-mirrors": ["https://sudzwtcw.mirror.aliyuncs.com"],

  "exec-opts": ["native.cgroupdriver=systemd"]

}

EOF

4.5重启docker服务

systemctl restart docker

4.6下载cri-dockerd rpm包

 wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1-3.el7.x86_64.rpm

4.7安装rpm包

rpm -ivh cri-dockerd-0.3.1-3.el7.x86_64.rpm

4.8配置cri-docker服务依赖镜像地址

vi /usr/lib/systemd/system/cri-docker.service

注释以下配置项
#ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://
新增以下配置项
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7

4.9加载配置项服务,并配置cri-docker开机自启

systemctl daemon-reload

systemctl start cri-docker && systemctl enable cri-docker

5.安装k8s管理软件

5.1配置k8s yum源

cat > /etc/yum.repos.d/kubernetes.repo << EOF

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=0

repo_gpgcheck=0

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

5.2安装k8s管理软件

yum -y install kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0

systemctl enable kubelet

至此k8s基础环境已经配置完成,以上所有操作每台主机都要执行,也可以配置好一台主机后将环境复制,再更改一下即可

6.配置所有主机互相免密登录

ssh-keygen   #一路按回车键即可

ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.60.120   #将公钥拷贝到120主机上,实现免密登录

ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.60.121

ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.60.122

ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.60.123

#其余主机也按照上面的免密配置
7.配置haproxy服务(只在三台master主机上执行)

7.1安装haproxy服务

yum -y install haproxy

7.2备份haproxy配置文件

cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

7.3编辑haproxy配置文件

vi /etc/haproxy/haproxy.cfg

global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats


defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 1
    timeout http-request    10s
    timeout queue           20s
    timeout connect         5s
    timeout client          20s
    timeout server          20s
    timeout http-keep-alive 10s
    timeout check           10s
#    maxconn                 3000


#frontend  main *:5000
#    acl url_static       path_beg       -i /static /images /javascript /stylesheets
#    acl url_static       path_end       -i .jpg .gif .png .css .js
#
#    use_backend static          if url_static
#    default_backend             app
#

frontend apiserver
    bind *:16443   #配置负载均衡监听端口
    mode tcp
    option tcplog
    default_backend apiserver   #调用backend配置


backend apiserver
    option httpchk GET /healthz
    http-check expect status 200
    mode tcp
    option ssl-hello-chk
    balance   roundrobin
        server  k8s-master01 10.1.60.119:6443 check   #配置apiserver的端口
        server  k8s-master02 10.1.60.120:6443 check
        server  k8s-master03 10.1.60.121:6443 check

 三台master节点haproxy的配置文件都一样

7.4启动haproxy服务并配置开机启动

systemctl start haproxy && systemctl enable haproxy

7.5查看haproxy配置是否生效

netstat -tlpn

8.配置keepalived服务 (只在三台master主机上执行)

8.1安装keepalived服务

yum -y install keepalived

8.2备份keepalived配置文件

cp /etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf.bak

8.3编辑keepalived配置文件

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   script_user root
   enable_script_security
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id k8s-master01
  #vrrp_skip_check_adv_addr
  #vrrp_strict
  #vrrp_garp_interval 0
  #vrrp_gna_interval 0
}

vrrp_script check_haproxy {
   script "/etc/keepalived/check-haproxy.sh"
   interval 3
   weight -2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 53
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.1.60.124/24
    }
    track_script {
        check_haproxy
    }
}

这是119 master节点的配置文件,另外两个文件只需要修改以下内容即可,其余内容都和上面的配置文件一致

另外两个节点中只需要修改上面119 master配置文件中的以下三项即可

120 master

router_id k8s-master02

state BACKUP

priority 90

121 master

router_id k8s-master03

state BACKUP

priority 80

 8.4编辑keepalived配置文件中的监控脚本

vi /etc/keepalived/check-haproxy.sh

#!/bin/bash
a=`netstat -tlpn |grep :16443|grep -v grep|wc -l`
if [ $a -eq 0 ]; then
   systemctl start haproxy
   sleep 3
   if [ $a -eq 0 ]; then
      systemctl stop keepalived
   fi
fi

8.5给脚本授权

chmod +x /etc/keepalived/check-haproxy.sh

8.6启动keepalived服务并配置开机自启

systemctl start keepalived && systemctl enable keepalived

8.7在119 master节点查看虚拟ip是否生效

ip add

9. 初始化k8s集群(只在119节点上执行)

kubeadm init --control-plane-endpoint=10.1.60.124:16443 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.26.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock --upload-certs

--control-plane-endpoint: 指定 Kubernetes 控制平面的 IP 地址和端口号,这个 IP 地址是集群中某个节点的 IP 地址,这个节点将会成为 Kubernetes 控制平面的主节点,填写虚拟的vip地址和haproxy的负载均衡端口

--image-repository:指定 Kubernetes 组件镜像所在的仓库地址。这里使用的是阿里云的镜像仓库,这样可以加速 Kubernetes 组件的下载和安装

--kubernetes-version: 指定 Kubernetes 的版本号,这里使用的是 v1.26.0 版本

--service-cidr: 指定 Kubernetes Service 的 IP 地址段。这个 IP 地址段用于分配给 Service,用于 Service 之间的通信

--pod-network-cidr: 指定 Kubernetes Pod 的 IP 地址段。这个 IP 地址段用于分配给 Pod,用于 Pod 之间的通信

--cri-socket: 指定容器运行时的 Socket 文件路径,这里使用的是 Docker 的 CRI

--upload-certs: 上传控制平面证书。这个参数会在初始化控制平面节点时自动生成证书,并将证书上传到 etcd 中,以确保集群的安全性

集群初始化完成后会输出一部分内容需要按照提示执行,我这里忘记截图了,执行的内容为以下步骤,需要执行完后节点才生效

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

export KUBECONFIG=/etc/kubernetes/admin.conf

执行完后查看节点状态

kubectl get nodes

此时已经可以查看到master节点,但是状态还是notready,这是因为还没有安装网络插件

10.将另外两个控制节点加入集群

10.1在120 master节点上新建以下目录

mkdir -p /etc/kubernetes/pki/etcd/

10.2在119 master节点上执行以下命令拷贝证书到120 master节点上

scp /etc/kubernetes/pki/ca.crt root@10.1.60.120:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/ca.key root@10.1.60.120:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/sa.key root@10.1.60.120:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/sa.pub root@10.1.60.120:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/front-proxy-ca.crt root@10.1.60.120:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/front-proxy-ca.key root@10.1.60.120:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/etcd/ca.crt root@10.1.60.120:/etc/kubernetes/pki/etcd/

scp /etc/kubernetes/pki/etcd/ca.key root@10.1.60.120:/etc/kubernetes/pki/etcd/

10.3在119 master查看加入集群的token

kubeadm token create --print-join-command

10.4在120 master执行以上输出的token并增加一些参数加入集群

kubeadm join 10.1.60.124:16443 --token zj1hy1.ufpwaj7wxhymdw3a --discovery-token-ca-cert-hash sha256:9636d912ddb2a9b1bdae085906c11f6839bcf060f8b9924132f6d82b8aaefecd --control-plane --cri-socket unix:///var/run/cri-dockerd.sock

--control-plane:是以控制节点的身份加入集群,不增加此参数是以工作节点的身份加入集群

--cri-socket:指定容器引擎

10.5执行加入集群后的目录创建(执行完上一步的命令后会输出提示)

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

export KUBECONFIG=/etc/kubernetes/admin.conf

10.6执行以下命令查看是否加入成功

kubectl get nodes

剩下的121 master节点重复以上的步骤加入集群即可

11.将工作节点加入集群

11.1在任意master节点上执行以下命令查看加入集群的token

kubeadm token create --print-join-command

11.2执行master节点生成的token并增加一些参数加入集群

kubeadm join 10.1.60.124:16443 --token zj1hy1.ufpwaj7wxhymdw3a --discovery-token-ca-cert-hash sha256:9636d912ddb2a9b1bdae085906c11f6839bcf060f8b9924132f6d82b8aaefecd  --cri-socket unix:///var/run/cri-dockerd.sock

可以看到控制节点加入集群和工作节点加入集群的区别就是有无--control-plane参数

11.3在任意master节点上执行以下命令查看集群信息

kubectl get nodes

每个node节点都执行以上步骤即可加入集群

12.安装网络插件

下载flannel的yaml文件

wget https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml

使用此yaml文件

kubectl create -f kube-flannel.yml

等flannel容器都运行,可通过以下命令查看

kubectl get pods -n kube-flannel

flannel都启动后查看集群状态就可以看到都已经是ready了

kubectl get nodes
13.配置etcd为高可用

13.1编辑etcd yaml文件(每台master节点均需执行)

vi /etc/kubernetes/manifests/etcd.yaml

更改以下配置项 
- --initial-cluster=k8s-master01=https://10.1.60.119:2380
更改为以下内容
- --initial-cluster=k8s-master01=https://10.1.60.119:2380,k8s-master02=https://10.1.60.120:2380,k8s-master03=https://10.1.60.121:2380

13.2重启kubelet服务(每台master节点均需执行)

systemctl restart kubelet

13.3运行etcd容器(在任意控制节点执行)

docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.4-0 etcdctl --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt member list

13.4查看etcd集群状态

docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.4-0 etcdctl --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt --endpoints=https://10.1.60.119:2379,https://10.1.60.120:2379,https://10.1.60.121:2379 endpoint health --cluster

 docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.4-0 etcdctl -w table --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt --endpoints=https://10.1.60.119:2379,https://10.1.60.120:2379,https://10.1.60.121:2379 endpoint status --cluster

至此k8s高可用集群配置完成 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值