通过kube-vip实现K8S集群高可用及Service LB

kube-vip 简介:

kube-vip 是一个云原生的开源项目,运行在群集之内,旨在简化为 Kubernetes 集群提供高可用及负载均衡服务。

kube-vip 为 Kubernetes 集群提供虚拟 IP实现高可用和负载均衡器,用于控制平面(用于构建高可用集群)和 Kubernetes 服务类型,而无需依赖LoadBalancer任何外部硬件或软件。

与传统高可用+负载均衡机制相比较(如nginx/haproxy+keepalived),它属于云原生的高可用以及负载均衡机制,运行在群集之内,配置也更简单。

一、k8s集群节点准备(所有主机

实验环境

软件列表及软件版本:

CentOS7.9,docker-ce,cri-dockerd,k8s集群1.28.2

1、配置主机名

hostnamectl set-hostname xxx

2、配置主机名与IP地址解析

sed -i '$a\192.168.10.11 master1' /etc/hosts

sed -i '$a\192.168.10.12 master2' /etc/hosts

sed -i '$a\192.168.10.13 master3' /etc/hosts

sed -i '$a\192.168.10.14 worker1' /etc/hosts

sed -i '$a\192.168.10.15 worker2' /etc/hosts

sed -i '$a\192.168.10.16 lb.kubetest.com' /etc/hosts

cat /etc/hosts

3、关闭防火墙和selinux

systemctl disable --now firewalld

setenforce 0

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

4、下载阿里源

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

yum clean all && yum makecache

5、同步时间

ntpdate time1.aliyun.com

6、配置内核路由转发及网桥过滤

添加网桥过滤及内核转发配置文件

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

vm.swappiness = 0

EOF

加载br_netfilter模块

modprobe br_netfilter

查看是否加载

lsmod | grep br_netfilter

sysctl --system

7、安装ipset及ipvsadm

安装ipset及ipvsadm

yum -y install ipset ipvsadm

配置ipvsadm模块加载方式,添加需要加载的模块

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

EOF

授权、运行、检查是否加载

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

8、关闭SWAP分区

swapoff -a

sed -i '/swap/s/^/#/' /etc/fstab

cat /etc/fstab

9、配置ssh免密登录

每台生成密钥并进行拷贝

ssh-keygen

ssh-copy-id root@192.168.10.xx

二、etcd集群部署

本次在master1、master2、master3上进行etcd集群部署(此次使用k8s集群外部署)

1、在k8s集群三个master节点上安装etcd

下载或上传etcd-v3.5.0-linux-amd64.tar.gz包到/root目录

下载方法:wget https://github.com/coreos/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz

tar xf etcd-v3.5.0-linux-amd64.tar.gz

cd etcd-v3.5.0-linux-amd64/

mv etcd* /usr/local/bin

2、生成etcd配置相关文件

master1

tee /usr/lib/systemd/system/etcd.service <<-'EOF'

[Unit]

Description=Etcd Server

After=network.target

[Service]

Type=notify

ExecStart=/usr/local/bin/etcd \

--name=master1 \

--data-dir=/var/lib/etcd/default.etcd \

--listen-peer-urls=http://192.168.10.11:2380 \

--listen-client-urls=http://192.168.10.11:2379,http://127.0.0.1:2379 \

--advertise-client-urls=http://192.168.10.11:2379 \

--initial-advertise-peer-urls=http://192.168.10.11:2380 \

--initial-cluster=master1=http://192.168.10.11:2380,master2=http://192.168.10.12:2380,master3=http://192.168.10.13:2380 \

--initial-cluster-token=smartgo \

--initial-cluster-state=new

Restart=on-failure

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

EOF

master2

tee /usr/lib/systemd/system/etcd.service <<-'EOF'

[Unit]

Description=Etcd Server

After=network.target

[Service]

Type=notify

ExecStart=/usr/local/bin/etcd \

--name=master2 \

--data-dir=/var/lib/etcd/default.etcd \

--listen-peer-urls=http://192.168.10.12:2380 \

--listen-client-urls=http://192.168.10.12:2379,http://127.0.0.1:2379 \

--advertise-client-urls=http://192.168.10.12:2379 \

--initial-advertise-peer-urls=http://192.168.10.12:2380 \

--initial-cluster=master1=http://192.168.10.11:2380,master2=http://192.168.10.12:2380,master3=http://192.168.10.13:2380 \

--initial-cluster-token=smartgo \

--initial-cluster-state=new

Restart=on-failure

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

EOF

master3

tee /usr/lib/systemd/system/etcd.service <<-'EOF'

[Unit]

Description=Etcd Server

After=network.target

[Service]

Type=notify

ExecStart=/usr/local/bin/etcd \

--name=master3 \

--data-dir=/var/lib/etcd/default.etcd \

--listen-peer-urls=http://192.168.10.13:2380 \

--listen-client-urls=http://192.168.10.13:2379,http://127.0.0.1:2379 \

--advertise-client-urls=http://192.168.10.13:2379 \

--initial-advertise-peer-urls=http://192.168.10.13:2380 \

--initial-cluster=master1=http://192.168.10.11:2380,master2=http://192.168.10.12:2380,master3=http://192.168.10.13:2380 \

--initial-cluster-token=smartgo \

--initial-cluster-state=new

Restart=on-failure

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

EOF

3、在k8s集群三个master节点上启动etcd

尽量同时执行,启动间隔时间不要太长

systemctl enable --now etcd

4、检查etcd集群是否正常

etcdctl member list

etcdctl endpoint health

三、容器运行时 Docker准备(所有节点

1、docker安装

(1)Docker安装YUM源准备

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

(2)Docker安装

yum -y install docker-ce

(3)启动Docker服务

systemctl enable --now docker

(4)修改cgroup方式

在/etc/docker/daemon.json添加如下内容(/etc/docker/daemon.json 默认没有此文件,需要单独创建

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

{

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

}

EOF

systemctl restart docker

2、cri-dockerd安装

下载或上传cri-dockerd-0.3.8-3.el7.x86_64.rpm包到/root目录

下载方法:wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8-3.el7.x86_64.rpm

yum -y install cri-dockerd-0.3.8-3.el7.x86_64.rpm

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

添加:

--pod-infra-container-image=registry.k8s.io/pause:3.9

systemctl enable --now cri-docker

四、K8S集群软件准备(所有节点

1、K8S软件YUM源准备

cat > /etc/yum.repos.d/k8s.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

2、K8S软件安装

(1)软件安装

查看指定版本

yum list kubeadm.x86_64 --showduplicates | sort -r

yum list kubelet.x86_64 --showduplicates | sort -r

yum list kubectl.x86_64 --showduplicates | sort -r

安装指定版本

yum -y install kubeadm-1.28.2-0 kubelet-1.28.2-0 kubectl-1.28.2-0

(2)kubelet配置

为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。

vim /etc/sysconfig/kubelet

添加:

"--cgroup-driver=systemd"

设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动

systemctl enable kubelet

五、kube-vip准备(三个master节点上)

export VIP=192.168.10.16

export INTERFACE=ens33

export KVVERSION=v0.6.4

docker run -it --rm --net=host ghcr.io/kube-vip/kube-vip:$KVVERSION manifest pod \

--interface $INTERFACE \

--address $VIP \

--controlplane \

--services \

--arp \

--enableLoadBalancer \

--leaderElection | tee /etc/kubernetes/manifests/kube-vip.yaml

查看是否生成kube-vip.yaml文件

cat /etc/kubernetes/manifests/kube-vip.yaml

六、K8S集群初始化

1、k8s集群容器镜像准备(所有节点

查看v1.28.2版本相关镜像

kubeadm config images list --kubernetes-version=v1.28.2

上传k8s-1.28.2.tar包到/root目录并导入本地镜像库

docker load -i k8s-1.28.2.tar

2、K8S集群初始化配置文件准备(master1

(1)查看不同 kind默认配置

kubeadm config print init-defaults --component-configs KubeletConfiguration

kubeadm config print init-defaults --component-configs InitConfiguration

kubeadm config print init-defaults --component-configs ClusterConfiguration

(2)生成配置文件样例 kubeadm-config.yaml

kubeadm config print init-defaults --component-configs KubeProxyConfiguration > kubeadm-config.yaml

修改 kubeadm-config.yaml,内容参考下面的配置,也可以直接复制生成新的kubeadm-config.yaml

vim kubeadm-config.yaml

添加修改:

  certSANs:

  - lb.kubetest.com

  - master1

  - master2

  - master3

  - worker1 

  - worker2

  - 192.168.10.11

  - 192.168.10.12

  - 192.168.10.13

  - 192.168.10.14

  - 192.168.10.15

controlPlaneEndpoint: lb.kubetest.com:6443

etcd:

  external:

    endpoints:

      - http://192.168.10.11:2379

      - http://192.168.10.12:2379

      - http://192.168.10.13:2379

  podSubnet: 10.244.0.0/16

(3)使用初始化配置文件初始化集群第一个master节点

kubeadm init --config kubeadm-config.yaml --upload-certs --v=9

--upload-certs:上传证书

--v=9:显示详细的信息

(4)准备kubectl配置文件(master1)

mkdir -p $HOME/.kube

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

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

(5)加入其它K8S集群master节点(master2、master3)

kubeadm join lb.kubetest.com:6443 --token abcdef.0123456789abcdef \

         --discovery-token-ca-cert-hash sha256:caaf7f1add4172f2eaae58dbab46c86fed8118807b7e4378f16d580702858bd2 \

         --control-plane --certificate-key ad29c2f507d364303ff24292ff377a094ff8aa432b1f8ab00bf83790464da779 --cri-socket unix:///var/run/cri-dockerd.sock

mkdir -p $HOME/.kube

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

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

(6)加入worker节点(worker1、worker2)

kubeadm join lb.kubetest.com:6443 --token abcdef.0123456789abcdef \

         --discovery-token-ca-cert-hash sha256:caaf7f1add4172f2eaae58dbab46c86fed8118807b7e4378f16d580702858bd2 --cri-socket unix:///var/run/cri-dockerd.sock

master1

kubectl get nodes

(7)网络插件calico部署及验证(master1)

应用operator资源清单文件

从网络路径应用

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml

上传tigera-operator.yaml包到/root目录

kubectl create -f tigera-operator.yaml

通过自定义资源方式安装

wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml

上传custom-resources.yaml包到/root目录

修改custom-resources.yaml,修改为使用kubeadm init ----pod-network-cidr对应的IP地址段

vim custom-resources.yaml

修改:

应用资源清单文件

上传calico_v3.25.1.tar、calico-apiserver.tar、calico-typha.tar包到/root目录并导入镜像(所有节点

docker load -i calico_v3.25.1.tar

docker load -i calico-apiserver.tar

docker load -i calico-typha.tar

master1

kubectl create -f custom-resources.yaml

监视calico-sysem命名空间中pod运行情况

kubectl get pods -n calico-system

kubectl get nodes

此时可验证,群集master中的leader故障时(如关机),集群地址vip漂移到其他master节点,群集仍可用。

七、使用kube-vip实现Service LB(master1)

1、指定LB注解或使用loadBalancerIP

当 kube-vip 启动后,将在所有匹配类型为 loadBalancer 的服务上启用一个名为 watcher 的监听器。

只有在填充了 metadata.annotations["kube-vip.io/loadbalancerIPs"] 或 spec.loadBalancerIP 的情况下,watcher 才会发布一个 Kubernetes service。

mkdir kubevip

cd kubevip/

vim nginx.yaml

添加:

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nginx-deployment

  labels:

    app: nginx

spec:

  replicas: 1

  selector:

    matchLabels:

      app: nginx

  template:

    metadata:

      labels:

        app: nginx

    spec:

      containers:

      - name: nginx

        image: nginx:latest

        imagePullPolicy: IfNotPresent

        ports:

        - containerPort: 80

---

apiVersion: v1

kind: Service

metadata:

  name: nginx

spec:

  type: LoadBalancer

  loadBalancerIP: 192.168.10.200

  selector:

    app: nginx

  ports:

    - port: 80

      targetPort: 80

上传nginx-latest.tar镜像文件并导入(worker1、worker2

docker load -i nginx-latest.tar

master1

kubectl apply -f nginx.yaml

kubectl get pods

kubectl get svc

curl 192.168.10.200

使用浏览器访问192.168.10.200

kubectl delete -f nginx.yaml

vim nginx.yaml

删除添加:

  annotations:

    kube-vip.io/loadbalancerIPs: "192.168.10.210"

kubectl apply -f nginx.yaml

kubectl get svc

curl 192.168.10.210

使用浏览器访问192.168.10.210

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值