溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何用lvs和keepalived部署kubernetes集群

發(fā)布時間:2020-06-04 15:05:35 來源:億速云 閱讀:393 作者:Leah 欄目:系統(tǒng)運維

這篇文章主要為大家詳細介紹了用lvs和keepalived部署kubernetes集群的方法,圖文詳解容易學(xué)習(xí),內(nèi)容較長建議跟著步驟一步步實現(xiàn),感興趣的小伙伴們可以參考一下。

一、部署環(huán)境

1.1 主機列表

主機名Centos版本ipdocker versionflannel versionKeepalived version主機配置備注
lvs-keepalived017.6.1810172.27.34.28//v1.3.54C4Glvs-keepalived
lvs-keepalived017.6.1810172.27.34.29//v1.3.54C4Glvs-keepalived
master017.6.1810172.27.34.3518.09.9v0.11.0/4C4Gcontrol plane
master027.6.1810172.27.34.3618.09.9v0.11.0/4C4Gcontrol plane
master037.6.1810172.27.34.3718.09.9v0.11.0/4C4Gcontrol plane
work017.6.1810172.27.34.16118.09.9//4C4Gworker nodes
work027.6.1810172.27.34.16218.09.9//4C4Gworker nodes
work037.6.1810172.27.34.16318.09.9//4C4Gworker nodes
VIP7.6.1810172.27.34.222//v1.3.54C4G在lvs-keepalived兩臺主機上浮動
client7.6.1810172.27.34.85///4C4Gclient

共有9臺服務(wù)器,2臺為lvs-keepalived集群,3臺control plane集群,3臺work集群,1臺client。

1.2 k8s 版本

主機名kubelet versionkubeadm versionkubectl version備注
master01v1.16.4v1.16.4v1.16.4kubectl選裝
master02v1.16.4v1.16.4v1.16.4kubectl選裝
master03v1.16.4v1.16.4v1.16.4kubectl選裝
work01v1.16.4v1.16.4v1.16.4kubectl選裝
work02v1.16.4v1.16.4v1.16.4kubectl選裝
work03v1.16.4v1.16.4v1.16.4kubectl選裝
client//v1.16.4client

二、高可用架構(gòu)

1. 架構(gòu)圖

本文采用kubeadm方式搭建高可用k8s集群,k8s集群的高可用實際是k8s各核心組件的高可用,這里使用集群模式(針對apiserver來講),架構(gòu)如下:

如何用lvs和keepalived部署kubernetes集群

2. 集群模式高可用架構(gòu)說明

核心組件高可用模式高可用實現(xiàn)方式
apiserver集群lvs+keepalived
controller-manager主備leader election
scheduler主備leader election
etcd集群kubeadm
  • apiserver  通過lvs-keepalived實現(xiàn)高可用,vip將請求分發(fā)至各個control plane節(jié)點的apiserver組件;
  • controller-manager  k8s內(nèi)部通過選舉方式產(chǎn)生領(lǐng)導(dǎo)者(由--leader-elect 選型控制,默認(rèn)為true),同一時刻集群內(nèi)只有一個controller-manager組件運行;
  • scheduler  k8s內(nèi)部通過選舉方式產(chǎn)生領(lǐng)導(dǎo)者(由--leader-elect 選型控制,默認(rèn)為true),同一時刻集群內(nèi)只有一個scheduler組件運行;
  • etcd  通過運行kubeadm方式自動創(chuàng)建集群來實現(xiàn)高可用,部署的節(jié)點數(shù)為奇數(shù),3節(jié)點方式最多容忍一臺機器宕機。

三、Centos7.6安裝

本文所有的服務(wù)器都為Centos7.6,Centos7.6安裝詳見:Centos7.6操作系統(tǒng)安裝及優(yōu)化全紀(jì)錄

安裝Centos時已經(jīng)禁用了防火墻和selinux并設(shè)置了阿里源。

四、k8s集群安裝準(zhǔn)備工作

control plane和work節(jié)點都執(zhí)行本部分操作,以master01為例記錄搭建過程。

1. 配置主機名

1.1 修改主機名

[root@centos7 ~]# hostnamectl set-hostname master01
[root@centos7 ~]# more /etc/hostname             
master01

退出重新登陸即可顯示新設(shè)置的主機名master01,各服務(wù)器修改為對應(yīng)的主機名。

1.2 修改hosts文件

[root@master01 ~]# cat >> /etc/hosts << EOF
172.27.34.35    master01
172.27.34.36   master02
172.27.34.37    master03
172.27.34.161   work01 
172.27.34.162   work02
172.27.34.163   work03
EOF

如何用lvs和keepalived部署kubernetes集群

2. 驗證mac地址uuid

[root@master01 ~]# cat /sys/class/net/ens160/address
[root@master01 ~]# cat /sys/class/dmi/id/product_uuid

如何用lvs和keepalived部署kubernetes集群

保證各節(jié)點mac和uuid唯一

3. 禁用swap

3.1 臨時禁用

[root@master01 ~]# swapoff -a

3.2 永久禁用

若需要重啟后也生效,在禁用swap后還需修改配置文件/etc/fstab,注釋swap

[root@master01 ~]# sed -i.bak '/swap/s/^/#/' /etc/fstab

如何用lvs和keepalived部署kubernetes集群

4. 內(nèi)核參數(shù)修改

本文的k8s網(wǎng)絡(luò)使用flannel,該網(wǎng)絡(luò)需要設(shè)置內(nèi)核參數(shù)bridge-nf-call-iptables=1,修改這個參數(shù)需要系統(tǒng)有br_netfilter模塊。

4.1 br_netfilter模塊加載

查看br_netfilter模塊:

[root@master01 ~]# lsmod |grep br_netfilter

如果系統(tǒng)沒有br_netfilter模塊則執(zhí)行下面的新增命令,如有則忽略。

臨時新增br_netfilter模塊:

[root@master01 ~]# modprobe br_netfilter

該方式重啟后會失效

永久新增br_netfilter模塊:

[root@master01 ~]# cat > /etc/rc.sysinit << EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF
[root@master01 ~]# cat > /etc/sysconfig/modules/br_netfilter.modules << EOF
modprobe br_netfilter
EOF
[root@master01 ~]# chmod 755 /etc/sysconfig/modules/br_netfilter.modules

如何用lvs和keepalived部署kubernetes集群

4.2 內(nèi)核參數(shù)臨時修改

[root@master01 ~]# sysctl net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-iptables = 1
[root@master01 ~]# sysctl net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-ip6tables = 1

4.3 內(nèi)核參數(shù)永久修改

[root@master01 ~]# cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@master01 ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

如何用lvs和keepalived部署kubernetes集群

5. 設(shè)置kubernetes源

5.1 新增kubernetes源

[root@master01 ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  • [] 中括號中的是repository id,唯一,用來標(biāo)識不同倉庫
  • name  倉庫名稱,自定義
  • baseurl 倉庫地址
  • enable 是否啟用該倉庫,默認(rèn)為1表示啟用
  • gpgcheck 是否驗證從該倉庫獲得程序包的合法性,1為驗證
  • repo_gpgcheck 是否驗證元數(shù)據(jù)的合法性 元數(shù)據(jù)就是程序包列表,1為驗證
  • gpgkey=URL 數(shù)字簽名的公鑰文件所在位置,如果gpgcheck值為1,此處就需要指定gpgkey文件的位置,如果gpgcheck值為0就不需要此項了

5.2 更新緩存

[root@master01 ~]# yum clean all
[root@master01 ~]# yum -y makecache

6. 免密登錄

配置master01到master02、master03免密登錄,本步驟只在master01上執(zhí)行。

6.1 創(chuàng)建秘鑰

[root@master01 ~]# ssh-keygen -t rsa

如何用lvs和keepalived部署kubernetes集群

6.2 將秘鑰同步至master02/master03

[root@master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.27.34.35
[root@master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.27.34.36

如何用lvs和keepalived部署kubernetes集群

如何用lvs和keepalived部署kubernetes集群

6.3 免密登陸測試

[root@master01 ~]# ssh 172.27.34.36
[root@master01 ~]# ssh master03

如何用lvs和keepalived部署kubernetes集群

master01可以直接登錄master02和master03,不需要輸入密碼。

7. 服務(wù)器重啟

重啟各control plane和work節(jié)點。

五、Docker安裝

control plane和work節(jié)點都執(zhí)行本部分操作。

1. 安裝依賴包

[root@master01 ~]# yum install -y yum-utils   device-mapper-persistent-data   lvm2

如何用lvs和keepalived部署kubernetes集群

2. 設(shè)置Docker源

[root@master01 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

如何用lvs和keepalived部署kubernetes集群

3. 安裝Docker CE

3.1 docker安裝版本查看

[root@master01 ~]# yum list docker-ce --showduplicates | sort -r

如何用lvs和keepalived部署kubernetes集群

3.2 安裝docker

[root@master01 ~]# yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y

如何用lvs和keepalived部署kubernetes集群
指定安裝的docker版本為18.09.9

4. 啟動Docker

[root@master01 ~]# systemctl start docker
[root@master01 ~]# systemctl enable docker

如何用lvs和keepalived部署kubernetes集群

5. 命令補全

5.1 安裝bash-completion

[root@master01 ~]# yum -y install bash-completion

5.2 加載bash-completion

[root@master01 ~]# source /etc/profile.d/bash_completion.sh

如何用lvs和keepalived部署kubernetes集群

6. 鏡像加速

由于Docker Hub的服務(wù)器在國外,下載鏡像會比較慢,可以配置鏡像加速器。主要的加速器有:Docker官方提供的中國registry mirror、阿里云加速器、DaoCloud 加速器,本文以阿里加速器配置為例。

6.1 登陸阿里云容器模塊

登陸地址為:https://cr.console.aliyun.com ,未注冊的可以先注冊阿里云賬戶

如何用lvs和keepalived部署kubernetes集群

6.2 配置鏡像加速器

配置daemon.json文件

[root@master01 ~]# mkdir -p /etc/docker
[root@master01 ~]# tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"]
}
EOF

重啟服務(wù)

[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl restart docker

如何用lvs和keepalived部署kubernetes集群

加速器配置完成

7. 驗證

[root@master01 ~]# docker --version
[root@master01 ~]# docker run hello-world

如何用lvs和keepalived部署kubernetes集群

通過查詢docker版本和運行容器hello-world來驗證docker是否安裝成功。

8. 修改Cgroup Driver

8.1 修改daemon.json

修改daemon.json,新增‘"exec-opts": ["native.cgroupdriver=systemd"’

[root@master01 ~]# more /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}

8.2 重新加載docker

[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl restart docker

修改cgroupdriver是為了消除告警:
[WARNING IsDockerSystemdCheck]: detected   "cgroupfs" as the Docker cgroup driver. The recommended driver is   "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/

六、k8s安裝

control plane和work節(jié)點都執(zhí)行本部分操作

1. 版本查看

[root@master01 ~]# yum list kubelet --showduplicates | sort -r

如何用lvs和keepalived部署kubernetes集群

本文安裝的kubelet版本是1.16.4,該版本支持的docker版本為1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09。

2. 安裝kubelet、kubeadm和kubectl

2.1 安裝三個包

[root@master01 ~]# yum install -y kubelet-1.16.4 kubeadm-1.16.4 kubectl-1.16.4

如何用lvs和keepalived部署kubernetes集群

2.2 安裝包說明

  • kubelet  運行在集群所有節(jié)點上,用于啟動Pod和容器等對象的工具
  • kubeadm  用于初始化集群,啟動集群的命令工具
  • kubectl  用于和集群通信的命令行,通過kubectl可以部署和管理應(yīng)用,查看各種資源,創(chuàng)建、刪除和更新各種組件

2.3 啟動kubelet

啟動kubelet并設(shè)置開機啟動

[root@master01 ~]# systemctl enable kubelet && systemctl start kubelet

2.4 kubectl命令補全

[root@master01 ~]# echo "source <(kubectl completion bash)" >> ~/.bash_profile
[root@master01 ~]# source .bash_profile 

3. 下載鏡像

3.1 鏡像下載的腳本

Kubernetes幾乎所有的安裝組件和Docker鏡像都放在goolge自己的網(wǎng)站上,直接訪問可能會有網(wǎng)絡(luò)問題,這里的解決辦法是從阿里云鏡像倉庫下載鏡像,拉取到本地以后改回默認(rèn)的鏡像tag。本文通過運行image.sh腳本方式拉取鏡像。

[root@master01 ~]# more image.sh 
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/loong576
version=v1.16.4
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
  docker pull $url/$imagename
  docker tag $url/$imagename k8s.gcr.io/$imagename
  docker rmi -f $url/$imagename
done

url為阿里云鏡像倉庫地址,version為安裝的kubernetes版本。

3.2 下載鏡像

運行腳本image.sh,下載指定版本的鏡像

[root@master01 ~]# ./image.sh
[root@master01 ~]# docker images

如何用lvs和keepalived部署kubernetes集群

七、初始化Master

master01節(jié)點執(zhí)行本部分操作。

1. kubeadm.conf

[root@master01 ~]# more kubeadm-config.yaml 
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.16.4
apiServer:
  certSANs:    #填寫所有kube-apiserver節(jié)點的hostname、IP、VIP
  - master01
  - master02
  - master03
  - work01
  - work02
  - work03
  - 172.27.34.35
  - 172.27.34.36
  - 172.27.34.37
  - 172.27.34.161
  - 172.27.34.162
  - 172.27.34.163
  - 172.27.34.222
controlPlaneEndpoint: "172.27.34.222:6443"
networking:
  podSubnet: "10.244.0.0/16"

如何用lvs和keepalived部署kubernetes集群

kubeadm.conf為初始化的配置文件

2. master01起虛ip

在master01上起虛ip:172.27.34.222

[root@master01 ~]# ifconfig ens160:2 172.27.34.222 netmask 255.255.255.0 up

如何用lvs和keepalived部署kubernetes集群

起虛ip目的是為了執(zhí)行master01的初始化,待初始化完成后去掉該虛ip

3. master初始化

[root@master01 ~]# kubeadm init --config=kubeadm-config.yaml

如何用lvs和keepalived部署kubernetes集群

記錄kubeadm join的輸出,后面需要這個命令將work節(jié)點和其他control plane節(jié)點加入集群中。

You can now join any number of control-plane nodes by copying certificate authorities 
and service account keys on each node and then running the following as root:

  kubeadm join 172.27.34.222:6443 --token lw90fv.j1lease5jhzj9ih3 \
    --discovery-token-ca-cert-hash sha256:79575e7a39eac086e121364f79e58a33f9c9de2a4e9162ad81d0abd1958b24f4 \
    --control-plane       

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.27.34.222:6443 --token lw90fv.j1lease5jhzj9ih3 \
    --discovery-token-ca-cert-hash sha256:79575e7a39eac086e121364f79e58a33f9c9de2a4e9162ad81d0abd1958b24f4 

初始化失敗:

如果初始化失敗,可執(zhí)行kubeadm reset后重新初始化

[root@master01 ~]# kubeadm reset
[root@master01 ~]# rm -rf $HOME/.kube/config

如何用lvs和keepalived部署kubernetes集群

4. 加載環(huán)境變量

[root@master01 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@master01 ~]# source .bash_profile

本文所有操作都在root用戶下執(zhí)行,若為非root用戶,則執(zhí)行如下操作:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

5. 安裝flannel網(wǎng)絡(luò)

在master01上新建flannel網(wǎng)絡(luò)

[root@master01 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

如何用lvs和keepalived部署kubernetes集群

由于網(wǎng)絡(luò)原因,可能會安裝失敗,可以在文末直接下載kube-flannel.yml文件,然后再執(zhí)行apply

八、control plane節(jié)點加入k8s集群

1. 證書分發(fā)

1.1 master01分發(fā)證書

在master01上運行腳本cert-main-master.sh,將證書分發(fā)至master02和master03

[root@master01 ~]# ll|grep cert-main-master.sh 
-rwxr--r--  1 root root     638 1月  16 10:25 cert-main-master.sh
[root@master01 ~]# more cert-main-master.sh
USER=root # customizable
CONTROL_PLANE_IPS="172.27.34.36 172.27.34.37"
for host in ${CONTROL_PLANE_IPS}; do
    scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:
    scp /etc/kubernetes/pki/ca.key "${USER}"@$host:
    scp /etc/kubernetes/pki/sa.key "${USER}"@$host:
    scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:
    scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:
    scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:
    scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt
    # Quote this line if you are using external etcd
    scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key
done

如何用lvs和keepalived部署kubernetes集群

1.2 master02移動證書至指定目錄

在master02上運行腳本cert-other-master.sh,將證書移至指定目錄

[root@master02 ~]# more cert-other-master.sh 
USER=root # customizable
mkdir -p /etc/kubernetes/pki/etcd
mv /${USER}/ca.crt /etc/kubernetes/pki/
mv /${USER}/ca.key /etc/kubernetes/pki/
mv /${USER}/sa.pub /etc/kubernetes/pki/
mv /${USER}/sa.key /etc/kubernetes/pki/
mv /${USER}/front-proxy-ca.crt /etc/kubernetes/pki/
mv /${USER}/front-proxy-ca.key /etc/kubernetes/pki/
mv /${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
# Quote this line if you are using external etcd
mv /${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key
[root@master02 ~]# ./cert-other-master.sh 

如何用lvs和keepalived部署kubernetes集群

1.3 master03移動證書至指定目錄

在master03上也運行腳本cert-other-master.sh

[root@master03 ~]# pwd
/root
[root@master03 ~]# ll|grep cert-other-master.sh 
-rwxr--r--  1 root root  484 1月  16 10:30 cert-other-master.sh
[root@master03 ~]# ./cert-other-master.sh 

2. master02加入k8s集群

[root@master03 ~]# kubeadm join 172.27.34.222:6443 --token lw90fv.j1lease5jhzj9ih3     --discovery-token-ca-cert-hash sha256:79575e7a39eac086e121364f79e58a33f9c9de2a4e9162ad81d0abd1958b24f4     --control-plane

運行初始化master生成的control plane節(jié)點加入集群的命令

如何用lvs和keepalived部署kubernetes集群

3. master03加入k8s集群

[root@master03 ~]# kubeadm join 172.27.34.222:6443 --token 0p7rzn.fdanprq4y8na36jh     --discovery-token-ca-cert-hash sha256:fc7a828208d554329645044633159e9dc46b0597daf66769988fee8f3fc0636b     --control-plane

如何用lvs和keepalived部署kubernetes集群

4. 加載環(huán)境變量

master02和master03加載環(huán)境變量

[root@master02 ~]# scp master01:/etc/kubernetes/admin.conf /etc/kubernetes/
[root@master02 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@master02 ~]# source .bash_profile 
[root@master03 ~]# scp master01:/etc/kubernetes/admin.conf /etc/kubernetes/
[root@master03 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@master03 ~]# source .bash_profile 

如何用lvs和keepalived部署kubernetes集群

該步操作是為了在master02和master03上也能執(zhí)行kubectl命令。

5. k8s集群節(jié)點查看

[root@master01 ~]# kubectl get nodes
[root@master01 ~]# kubectl get po -o wide -n kube-system 

如何用lvs和keepalived部署kubernetes集群發(fā)現(xiàn)master01和master03下載flannel異常,分別在master01和master03上手動下載該鏡像后正常。

[root@master01 ~]# docker pull  registry.cn-hangzhou.aliyuncs.com/loong576/flannel:v0.11.0-amd64
[root@master03 ~]# docker pull  registry.cn-hangzhou.aliyuncs.com/loong576/flannel:v0.11.0-amd64

如何用lvs和keepalived部署kubernetes集群

九、work節(jié)點加入k8s集群

1. work01加入k8s集群

[root@work01 ~]# kubeadm join 172.27.34.222:6443 --token lw90fv.j1lease5jhzj9ih3     --discovery-token-ca-cert-hash sha256:79575e7a39eac086e121364f79e58a33f9c9de2a4e9162ad81d0abd1958b24f4

運行初始化master生成的work節(jié)點加入集群的命令

如何用lvs和keepalived部署kubernetes集群

2. work02加入k8s集群

[root@work02 ~]# kubeadm join 172.27.34.222:6443 --token lw90fv.j1lease5jhzj9ih3     --discovery-token-ca-cert-hash sha256:79575e7a39eac086e121364f79e58a33f9c9de2a4e9162ad81d0abd1958b24f4

如何用lvs和keepalived部署kubernetes集群

3. work03加入k8s集群

[root@work03 ~]# kubeadm join 172.27.34.222:6443 --token lw90fv.j1lease5jhzj9ih3     --discovery-token-ca-cert-hash sha256:79575e7a39eac086e121364f79e58a33f9c9de2a4e9162ad81d0abd1958b24f4

如何用lvs和keepalived部署kubernetes集群

4. k8s集群各節(jié)點查看

[root@master01 ~]# kubectl get nodes
[root@master01 ~]# kubectl get po -o wide -n kube-system 

如何用lvs和keepalived部署kubernetes集群

十、ipvs安裝

lvs-keepalived01和lvs-keepalived02都執(zhí)行本操作。

1. 安裝ipvs

LVS無需安裝,安裝的是管理工具,第一種叫ipvsadm,第二種叫keepalive。ipvsadm是通過命令行管理,而keepalive讀取配置文件管理。

[root@lvs-keepalived01 ~]# yum -y install ipvsadm

如何用lvs和keepalived部署kubernetes集群

2. 加載ipvsadm模塊

把ipvsadm模塊加載進系統(tǒng)

[root@lvs-keepalived01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lvs-keepalived01 ~]# lsmod | grep ip_vs
ip_vs                 145497  0 
nf_conntrack          133095  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

如何用lvs和keepalived部署kubernetes集群

lvs相關(guān)實踐詳見:LVS+Keepalived+Nginx負載均衡搭建測試

十一、keepalived安裝

lvs-keepalived01和lvs-keepalived02都執(zhí)行本操作。

1. keepalived安裝

[root@lvs-keepalived01 ~]# yum -y install keepalived

如何用lvs和keepalived部署kubernetes集群

2. keepalived配置

lvs-keepalived01配置如下:

[root@lvs-keepalived01 ~]# more /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id lvs-keepalived01   #router_id 機器標(biāo)識,通常為hostname,但不一定非得是hostname。故障發(fā)生時,郵件通知會用到。
}
vrrp_instance VI_1 {            #vrrp實例定義部分
    state MASTER                #設(shè)置lvs的狀態(tài),MASTER和BACKUP兩種,必須大寫 
    interface ens160            #設(shè)置對外服務(wù)的接口
    virtual_router_id 100       #設(shè)置虛擬路由標(biāo)示,這個標(biāo)示是一個數(shù)字,同一個vrrp實例使用唯一標(biāo)示 
    priority 100                #定義優(yōu)先級,數(shù)字越大優(yōu)先級越高,在一個vrrp——instance下,master的優(yōu)先級必須大于backup
    advert_int 1                #設(shè)定master與backup負載均衡器之間同步檢查的時間間隔,單位是秒
    authentication {            #設(shè)置驗證類型和密碼
        auth_type PASS          #主要有PASS和AH兩種
        auth_pass 1111          #驗證密碼,同一個vrrp_instance下MASTER和BACKUP密碼必須相同
    }
    virtual_ipaddress {         #設(shè)置虛擬ip地址,可以設(shè)置多個,每行一個
        172.27.34.222
    }
}
virtual_server 172.27.34.222 6443 {  #設(shè)置虛擬服務(wù)器,需要指定虛擬ip和服務(wù)端口
    delay_loop 6                     #健康檢查時間間隔
    lb_algo wrr                      #負載均衡調(diào)度算法
    lb_kind DR                       #負載均衡轉(zhuǎn)發(fā)規(guī)則
    #persistence_timeout 50          #設(shè)置會話保持時間,對動態(tài)網(wǎng)頁非常有用
    protocol TCP                     #指定轉(zhuǎn)發(fā)協(xié)議類型,有TCP和UDP兩種
    real_server 172.27.34.35 6443 {  #配置服務(wù)器節(jié)點1,需要指定real server的真實IP地址和端口
    weight 10                        #設(shè)置權(quán)重,數(shù)字越大權(quán)重越高
    TCP_CHECK {                      #realserver的狀態(tài)監(jiān)測設(shè)置部分單位秒
       connect_timeout 10            #連接超時為10秒
       retry 3                       #重連次數(shù)
       delay_before_retry 3          #重試間隔
       connect_port 6443             #連接端口為6443,要和上面的保持一致
       }
    }
    real_server 172.27.34.36 6443 {  #配置服務(wù)器節(jié)點1,需要指定real server的真實IP地址和端口
    weight 10                        #設(shè)置權(quán)重,數(shù)字越大權(quán)重越高
    TCP_CHECK {                      #realserver的狀態(tài)監(jiān)測設(shè)置部分單位秒
       connect_timeout 10            #連接超時為10秒
       retry 3                       #重連次數(shù)
       delay_before_retry 3          #重試間隔
       connect_port 6443             #連接端口為6443,要和上面的保持一致
       }
    }
    real_server 172.27.34.37 6443 {  #配置服務(wù)器節(jié)點1,需要指定real server的真實IP地址和端口
    weight 10                        #設(shè)置權(quán)重,數(shù)字越大權(quán)重越高
    TCP_CHECK {                      #realserver的狀態(tài)監(jiān)測設(shè)置部分單位秒
       connect_timeout 10            #連接超時為10秒
       retry 3                       #重連次數(shù)
       delay_before_retry 3          #重試間隔
       connect_port 6443             #連接端口為6443,要和上面的保持一致
       }
    }
}

lvs-keepalived02配置如下:

[root@lvs-keepalived02 ~]# more /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id lvs-keepalived02   #router_id 機器標(biāo)識,通常為hostname,但不一定非得是hostname。故障發(fā)生時,郵件通知會用到。
}
vrrp_instance VI_1 {            #vrrp實例定義部分
    state BACKUP                #設(shè)置lvs的狀態(tài),MASTER和BACKUP兩種,必須大寫 
    interface ens160            #設(shè)置對外服務(wù)的接口
    virtual_router_id 100       #設(shè)置虛擬路由標(biāo)示,這個標(biāo)示是一個數(shù)字,同一個vrrp實例使用唯一標(biāo)示 
    priority 90                 #定義優(yōu)先級,數(shù)字越大優(yōu)先級越高,在一個vrrp——instance下,master的優(yōu)先級必須大于backup
    advert_int 1                #設(shè)定master與backup負載均衡器之間同步檢查的時間間隔,單位是秒
    authentication {            #設(shè)置驗證類型和密碼
        auth_type PASS          #主要有PASS和AH兩種
        auth_pass 1111          #驗證密碼,同一個vrrp_instance下MASTER和BACKUP密碼必須相同
    }
    virtual_ipaddress {         #設(shè)置虛擬ip地址,可以設(shè)置多個,每行一個
        172.27.34.222
    }
}
virtual_server 172.27.34.222 6443 {  #設(shè)置虛擬服務(wù)器,需要指定虛擬ip和服務(wù)端口
    delay_loop 6                     #健康檢查時間間隔
    lb_algo wrr                      #負載均衡調(diào)度算法
    lb_kind DR                       #負載均衡轉(zhuǎn)發(fā)規(guī)則
    #persistence_timeout 50          #設(shè)置會話保持時間,對動態(tài)網(wǎng)頁非常有用
    protocol TCP                     #指定轉(zhuǎn)發(fā)協(xié)議類型,有TCP和UDP兩種
    real_server 172.27.34.35 6443 {  #配置服務(wù)器節(jié)點1,需要指定real server的真實IP地址和端口
    weight 10                        #設(shè)置權(quán)重,數(shù)字越大權(quán)重越高
    TCP_CHECK {                      #realserver的狀態(tài)監(jiān)測設(shè)置部分單位秒
       connect_timeout 10            #連接超時為10秒
       retry 3                       #重連次數(shù)
       delay_before_retry 3          #重試間隔
       connect_port 6443             #連接端口為6443,要和上面的保持一致
       }
    }
    real_server 172.27.34.36 6443 {  #配置服務(wù)器節(jié)點1,需要指定real server的真實IP地址和端口
    weight 10                        #設(shè)置權(quán)重,數(shù)字越大權(quán)重越高
    TCP_CHECK {                      #realserver的狀態(tài)監(jiān)測設(shè)置部分單位秒
       connect_timeout 10            #連接超時為10秒
       retry 3                       #重連次數(shù)
       delay_before_retry 3          #重試間隔
       connect_port 6443             #連接端口為6443,要和上面的保持一致
       }
    }
    real_server 172.27.34.37 6443 {  #配置服務(wù)器節(jié)點1,需要指定real server的真實IP地址和端口
    weight 10                        #設(shè)置權(quán)重,數(shù)字越大權(quán)重越高
    TCP_CHECK {                      #realserver的狀態(tài)監(jiān)測設(shè)置部分單位秒
       connect_timeout 10            #連接超時為10秒
       retry 3                       #重連次數(shù)
       delay_before_retry 3          #重試間隔
       connect_port 6443             #連接端口為6443,要和上面的保持一致
       }
    }
}

3. master01上去掉vip

[root@master01 ~]# ifconfig ens160:2 172.27.34.222 netmask 255.255.255.0 down

如何用lvs和keepalived部署kubernetes集群

master01上去掉初始化使用的ip 172.27.34.222

4. 啟動keepalived

lvs-keepalived01和lvs-keepalived02都啟動keepalived并設(shè)置為開機啟動

[root@lvs-keepalived01 ~]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service
[root@lvs-keepalived01 ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.

5. vip查看

[root@lvs-keepalived01 ~]# ip a

如何用lvs和keepalived部署kubernetes集群

此時vip在lvs-keepalived01上

十二、control plane節(jié)點配置

control plane都執(zhí)行本操作。

1. 新建realserver.sh

打開control plane所在服務(wù)器的“路由”功能、關(guān)閉“ARP查詢”功能并設(shè)置回環(huán)ip,三臺control plane配置相同,如下:

[root@master01 ~]# cd /etc/rc.d/init.d/
[root@master01 init.d]# more realserver.sh 
#!/bin/bash
    SNS_VIP=172.27.34.222
    case "$1" in
    start)
        ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
        /sbin/route add -host $SNS_VIP dev lo:0
        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
        sysctl -p >/dev/null 2>&1
        echo "RealServer Start OK"
        ;;
    stop)
        ifconfig lo:0 down
        route del $SNS_VIP >/dev/null 2>&1
        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
        echo "RealServer Stoped"
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
    esac
    exit 0

此腳本用于control plane節(jié)點綁定 VIP ,并抑制響應(yīng) VIP 的 ARP 請求。這樣做的目的是為了不讓關(guān)于 VIP 的 ARP 廣播時,節(jié)點服務(wù)器應(yīng)答( 因為control plane節(jié)點都綁定了 VIP ,如果不做設(shè)置它們會應(yīng)答,就會亂套 )。

2 運行realserver.sh腳本

在所有control plane節(jié)點執(zhí)行realserver.sh腳本:

[root@master01 init.d]# chmod u+x realserver.sh 
[root@master01 init.d]# /etc/rc.d/init.d/realserver.sh start
RealServer Start OK

給realserver.sh腳本授予執(zhí)行權(quán)限并運行realserver.sh腳本

如何用lvs和keepalived部署kubernetes集群

3. realserver.sh開啟啟動

[root@master01 init.d]# sed -i '$a /etc/rc.d/init.d/realserver.sh start' /etc/rc.d/rc.local
[root@master01 init.d]# chmod u+x /etc/rc.d/rc.local 

十三、client配置

1. 設(shè)置kubernetes源

1.1 新增kubernetes源

[root@client ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

如何用lvs和keepalived部署kubernetes集群

1.2 更新緩存

[root@client ~]# yum clean all
[root@client ~]# yum -y makecache

2. 安裝kubectl

[root@client ~]# yum install -y kubectl-1.16.4

如何用lvs和keepalived部署kubernetes集群

安裝版本與集群版本保持一致

3. 命令補全

3.1 安裝bash-completion

[root@client ~]# yum -y install bash-completion

3.2 加載bash-completion

[root@client ~]# source /etc/profile.d/bash_completion.sh

如何用lvs和keepalived部署kubernetes集群

3.3 拷貝admin.conf

[root@client ~]# mkdir -p /etc/kubernetes
[root@client ~]# scp 172.27.34.35:/etc/kubernetes/admin.conf /etc/kubernetes/
[root@client ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@client ~]# source .bash_profile 

3.4 加載環(huán)境變量

[root@master01 ~]# echo "source <(kubectl completion bash)" >> ~/.bash_profile
[root@master01 ~]# source .bash_profile 

4. kubectl測試

[root@client ~]# kubectl get nodes 
[root@client ~]# kubectl get cs
[root@client ~]# kubectl cluster-info 
[root@client ~]# kubectl get po -o wide -n kube-system 

如何用lvs和keepalived部署kubernetes集群

十四、Dashboard搭建

本節(jié)內(nèi)容都在client節(jié)點完成。

1. 下載yaml

[root@client ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

如果連接超時,可以多試幾次。recommended.yaml已上傳,也可以在文末下載。

2. 配置yaml

2.1 修改鏡像地址

[root@client ~]# sed -i 's/kubernetesui/registry.cn-hangzhou.aliyuncs.com\/loong576/g' recommended.yaml

由于默認(rèn)的鏡像倉庫網(wǎng)絡(luò)訪問不通,故改成阿里鏡像

2.2 外網(wǎng)訪問

[root@client ~]# sed -i '/targetPort: 8443/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' recommended.yaml

配置NodePort,外部通過https://NodeIp:NodePort 訪問Dashboard,此時端口為30001

2.3 新增管理員帳號

[root@client ~]# cat >> recommended.yaml << EOF
---
# ------------------- dashboard-admin ------------------- #
apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: dashboard-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin

如何用lvs和keepalived部署kubernetes集群

創(chuàng)建超級管理員的賬號用于登錄Dashboard

3. 部署訪問

3.1 部署Dashboard

[root@client ~]# kubectl apply -f recommended.yaml

如何用lvs和keepalived部署kubernetes集群

3.2 狀態(tài)查看

[root@client ~]# kubectl get all -n kubernetes-dashboard 

如何用lvs和keepalived部署kubernetes集群

3.3 令牌查看

[root@client ~]# kubectl describe secrets -n kubernetes-dashboard dashboard-admin

如何用lvs和keepalived部署kubernetes集群
令牌為:

eyJhbGciOiJSUzI1NiIsImtpZCI6Ii1SOU1pNGswQnJCVUtCaks2TlBnMGxUdGRSdTlPS0s0MjNjUkdlNzFRVXMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tbXRuZ3giLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNWVjOTdkNzItZTgwZi00MDE2LTk2NTEtZDhkMTYwOGJkODViIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.WJPzxkAGYjtq556d3HuXNh7g0sDYm2h7U_FsPDvvfhquYSccPGJ1UzX-lKxhPYyCegc603D7yFCc9zQOzpONttkue3rGdOz8KePOAHCUX7Xp_yTcJg15BPxQDDny6Lebu0fFXh_fpbU2_35nG28lRjiwKG3mV3O5uHdX5nk500RBmLkw3F054ww66hgFBfTH2HVDi1jOlAKWC0xatdxuqp2JkMqiBCZ_8Zwhi66EQYAMT1xu8Sn5-ur_6QsgaNNYhCeNxqHUiEFIZdLNu8QAnsKJJuhxxXd2KhIF6dwMvvOPG1djKCKSyNRn-SGILDucu1_6FoBG1DiNcIr90cPAtA

3.4 訪問

請使用火狐瀏覽器訪問:https://control plane ip:30001,即https://172.27.34.35/36/37:30001/
如何用lvs和keepalived部署kubernetes集群

如何用lvs和keepalived部署kubernetes集群

接受風(fēng)險
如何用lvs和keepalived部署kubernetes集群
通過令牌方式登錄
如何用lvs和keepalived部署kubernetes集群

登錄的首頁顯示

如何用lvs和keepalived部署kubernetes集群

切換到命名空間kubernetes-dashboard,查看資源。

Dashboard提供了可以實現(xiàn)集群管理、工作負載、服務(wù)發(fā)現(xiàn)和負載均衡、存儲、字典配置、日志視圖等功能。

為了豐富dashboard的統(tǒng)計數(shù)據(jù)和圖表,可以安裝heapster組件。heapster組件實踐詳見:k8s實踐(十一):heapster+influxdb+grafana實現(xiàn)kubernetes集群監(jiān)

十五、k8s集群高可用測試

1. 組件所在節(jié)點查看

通過ipvsadm查看apiserver所在節(jié)點,通過leader-elect查看scheduler和controller-manager所在節(jié)點:

1.1 apiserver節(jié)點查看

在lvs-keepalived01上執(zhí)行ipvsadm查看apiserver轉(zhuǎn)發(fā)到的服務(wù)器

[root@lvs-keepalived01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.27.34.222:6443 wrr
  -> 172.27.34.35:6443            Route   10     2          0         
  -> 172.27.34.36:6443            Route   10     2          0         
  -> 172.27.34.37:6443            Route   10     2          0  

如何用lvs和keepalived部署kubernetes集群

1.2 controller-manager和scheduler節(jié)點查看

在client節(jié)點上查看controller-manager和scheduler組件所在節(jié)點

[root@client ~]# kubectl get endpoints kube-controller-manager -n kube-system -o yaml |grep holderIdentity
    control-plane.alpha.kubernetes.io/leader: '{"holderIdentity":"master01_0a2bcea9-d17e-405b-8b28-5059ca434144","leaseDurationSeconds":15,"acquireTime":"2020-01-19T03:07:51Z","renewTime":"2020-01-19T04:40:20Z","leaderTransitions":2}'
[root@client ~]# kubectl get endpoints kube-scheduler -n kube-system -o yaml |grep holderIdentity
    control-plane.alpha.kubernetes.io/leader: '{"holderIdentity":"master01_c284cee8-57cf-46e7-a578-6c0a10aedb37","leaseDurationSeconds":15,"acquireTime":"2020-01-19T03:07:51Z","renewTime":"2020-01-19T04:40:30Z","leaderTransitions":2}'

如何用lvs和keepalived部署kubernetes集群

組件名所在節(jié)點
apiservermaster01、master02、master03
controller-managermaster01
schedulermaster01

2. master01關(guān)機

2.1 關(guān)閉master01

關(guān)閉master01,模擬宕機

[root@master01 ~]# init 0

2.2 apiserver組件節(jié)點查看

lvs-keepalived01上查看apiserver節(jié)點鏈接情況

[root@lvs-keepalived01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.27.34.222:6443 wrr
  -> 172.27.34.36:6443            Route   10     4          0         
  -> 172.27.34.37:6443            Route   10     2          0 

如何用lvs和keepalived部署kubernetes集群

發(fā)現(xiàn)master01的apiserver被移除集群,即訪問172.27.34.222:64443時不會被調(diào)度到master01

2.3 controller-manager和scheduler組件節(jié)點查看

client節(jié)點上再次運行查看controller-manager和scheduler命令

[root@client ~]# kubectl get endpoints kube-controller-manager -n kube-system -o yaml |grep holderIdentity
    control-plane.alpha.kubernetes.io/leader: '{"holderIdentity":"master03_9481b109-f236-432a-a2cb-8d0c27417396","leaseDurationSeconds":15,"acquireTime":"2020-01-19T04:42:22Z","renewTime":"2020-01-19T04:45:45Z","leaderTransitions":3}'
[root@client ~]# kubectl get endpoints kube-scheduler -n kube-system -o yaml |grep holderIdentity
    control-plane.alpha.kubernetes.io/leader: '{"holderIdentity":"master03_6d84981b-3ab9-4a00-a86a-47bd2f5c7729","leaseDurationSeconds":15,"acquireTime":"2020-01-19T04:42:23Z","renewTime":"2020-01-19T04:45:48Z","leaderTransitions":3}'
[root@client ~]# 

如何用lvs和keepalived部署kubernetes集群

controller-manager和scheduler都被切換到master03節(jié)點

組件名所在節(jié)點
apiservermaster02、master03
controller-managermaster03
schedulermaster03

2.4 集群功能性測試

所有功能性測試都在client節(jié)點完成。

2.4.1 查詢
[root@client ~]# kubectl get nodes
NAME       STATUS     ROLES    AGE   VERSION
master01   NotReady   master   22h   v1.16.4
master02   Ready      master   22h   v1.16.4
master03   Ready      master   22h   v1.16.4
work01     Ready      <none>   22h   v1.16.4
work02     Ready      <none>   22h   v1.16.4
work03     Ready      <none>   22h   v1.16.4

如何用lvs和keepalived部署kubernetes集群

master01狀態(tài)為NotReady

2.4.2 新建pod
[root@client ~]# more nginx-master.yaml 
apiVersion: apps/v1             #描述文件遵循extensions/v1beta1版本的Kubernetes API
kind: Deployment                #創(chuàng)建資源類型為Deployment
metadata:                       #該資源元數(shù)據(jù)
  name: nginx-master            #Deployment名稱
spec:                           #Deployment的規(guī)格說明
  selector:
    matchLabels:
      app: nginx 
  replicas: 3                   #指定副本數(shù)為3
  template:                     #定義Pod的模板
    metadata:                   #定義Pod的元數(shù)據(jù)
      labels:                   #定義label(標(biāo)簽)
        app: nginx              #label的key和value分別為app和nginx
    spec:                       #Pod的規(guī)格說明
      containers:               
      - name: nginx             #容器的名稱
        image: nginx:latest     #創(chuàng)建容器所使用的鏡像
[root@client ~]# kubectl apply -f nginx-master.yaml 
deployment.apps/nginx-master created
[root@client ~]# kubectl get po -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx-master-75b7bfdb6b-9d66p   1/1     Running   0          20s   10.244.3.6   work01   <none>           <none>
nginx-master-75b7bfdb6b-h5bql   1/1     Running   0          20s   10.244.5.5   work03   <none>           <none>
nginx-master-75b7bfdb6b-zmc68   1/1     Running   0          20s   10.244.4.5   work02   <none>           <none>

如何用lvs和keepalived部署kubernetes集群

以新建pod nginx為例測試集群是否能正常對外提供服務(wù)。

2.5 結(jié)論

在3節(jié)點的k8s集群中,當(dāng)有一個control plane節(jié)點宕機時,集群各項功能不受影響。

3. master02關(guān)機

在master01處于關(guān)閉狀態(tài)下,繼續(xù)關(guān)閉master02,測試集群還能否正常對外服務(wù)。

3.1 關(guān)閉master02

[root@master02 ~]# init 0

3.2 apiserver組件節(jié)點查看

[root@lvs-keepalived01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.27.34.222:6443 wrr
  -> 172.27.34.37:6443            Route   10     6          20 

如何用lvs和keepalived部署kubernetes集群

此時對集群的訪問都轉(zhuǎn)到master03

3.3 集群功能測試

[root@client ~]# kubectl get nodes
The connection to the server 172.27.34.222:6443 was refused - did you specify the right host or port?

3.4 結(jié)論

在3節(jié)點的k8s集群中,當(dāng)有兩個control plane節(jié)點同時宕機時,etcd集群崩潰,整個k8s集群也不能正常對外服務(wù)。

十六、lvs-keepalived集群高可用測試

1. 高可用測試前檢查

1.1 k8s集群檢查

[root@client ~]# kubectl get nodes
NAME       STATUS   ROLES    AGE    VERSION
master01   Ready    master   161m   v1.16.4
master02   Ready    master   144m   v1.16.4
master03   Ready    master   142m   v1.16.4
work01     Ready    <none>   137m   v1.16.4
work02     Ready    <none>   135m   v1.16.4
work03     Ready    <none>   134m   v1.16.4

集群內(nèi)個節(jié)點運行正常

1.2 vip查看

[root@lvs-keepalived01 ~]# ip a|grep 222
    inet 172.27.34.222/32 scope global ens160

發(fā)現(xiàn)vip運行在lvs-keepalived01上

1.3 鏈接情況

lvs-keepalived01:

[root@lvs-keepalived01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.27.34.222:6443 wrr
  -> 172.27.34.35:6443            Route   10     6          0         
  -> 172.27.34.36:6443            Route   10     0          0         
  -> 172.27.34.37:6443            Route   10     38         0  

lvs-keepalived02:

[root@lvs-keepalived02 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.27.34.222:6443 wrr
  -> 172.27.34.35:6443            Route   10     0          0         
  -> 172.27.34.36:6443            Route   10     0          0         
  -> 172.27.34.37:6443            Route   10     0          0  

2. lvs-keepalived01關(guān)機

關(guān)閉lvs-keepalived01,模擬宕機

[root@lvs-keepalived01 ~]# init 0

2.1 k8s集群檢查

[root@client ~]# kubectl get nodes
NAME       STATUS   ROLES    AGE    VERSION
master01   Ready    master   166m   v1.16.4
master02   Ready    master   148m   v1.16.4
master03   Ready    master   146m   v1.16.4
work01     Ready    <none>   141m   v1.16.4
work02     Ready    <none>   139m   v1.16.4
work03     Ready    <none>   138m   v1.16.4

集群內(nèi)個節(jié)點運行正常

2.2 vip查看

[root@lvs-keepalived02 ~]# ip a|grep 222
    inet 172.27.34.222/32 scope global ens160

發(fā)現(xiàn)vip已漂移至lvs-keepalived02

2.3 鏈接情況

lvs-keepalived02:

[root@lvs-keepalived02 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.27.34.222:6443 wrr
  -> 172.27.34.35:6443            Route   10     1          0         
  -> 172.27.34.36:6443            Route   10     4          0         
  -> 172.27.34.37:6443            Route   10     1          0  

2.4 集群功能性測試

[root@client ~]# kubectl delete -f nginx-master.yaml 
deployment.apps "nginx-master" deleted
[root@client ~]# kubectl get po -o wide
NAME                            READY   STATUS        RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx-master-75b7bfdb6b-9d66p   0/1     Terminating   0          20m   10.244.3.6   work01   <none>           <none>
nginx-master-75b7bfdb6b-h5bql   0/1     Terminating   0          20m   10.244.5.5   work03   <none>           <none>
nginx-master-75b7bfdb6b-zmc68   0/1     Terminating   0          20m   10.244.4.5   work02   <none>           <none>
[root@client ~]# kubectl get po -o wide
No resources found in default namespace.

如何用lvs和keepalived部署kubernetes集群

刪除之前新建的pod nginx,成功刪除。

2.5 結(jié)論

當(dāng)lvs-keepalived集群有一臺宕機時,對k8s集群無影響,仍能正常對外提供服務(wù)。

以上就是用lvs和keepalived部署kubernetes集群的步驟,內(nèi)容較為全面,而且我也相信有相當(dāng)?shù)囊恍┕ぞ呖赡苁俏覀內(nèi)粘9ぷ骺赡軙姷交蛴玫降摹Mㄟ^這篇文章,希望你能收獲更多。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI