前言
春暖花開的五月,疫情基本過去,值得慶賀,在這美好的日子里我們來實戰一下 K8S 的高可用負載均衡集群吧,
更新歷史
- 2020 年 05月 07 日 - 初稿 - 左程立
- 原文地址 - https://blog.zuolinux.com/2020/05/07/k8s-cluster-on-centos7.html
平臺環境
軟體資訊
- CentOS Linux release 7.7.1908 (Kernel 3.10.0-1062.18.1.el7.x86_64)
- Docker CE 18.09.9
- Kubernetes v1.18.2
- Calico v3.8
- Keepalived v1.3.5
- HAproxy v1.5.18
硬體資訊
| 主機名 | ip |
|---|---|
| master01 | 192.168.10.12 |
| master02 | 192.168.10.13 |
| master03 | 192.168.10.14 |
| work01 | 192.168.10.15 |
| work02 | 192.168.10.16 |
| work03 | 192.168.10.17 |
| VIP | 192.168.10.19 |
集群配置
初始化
master/worker 均執行
# cat >> /etc/hosts << EOF
192.168.10.12 master01
192.168.10.13 master02
192.168.10.14 master03
192.168.10.15 work01
192.168.10.16 work02
192.168.10.17 work03
EOF
# 關閉防火墻
systemctl stop firewalld
systemctl disable firewalld
# 關閉 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 關閉 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
# 安裝wget
yum install wget -y
# 備份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 阿里云yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo# 獲取阿里云epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo# 清理快取并創建新的快取
yum clean all && yum makecache
# 更新
yum update -y
#同步時間
timedatectl
timedatectl set-ntp true
安裝 Docker
master/worker 均安裝
# 安裝 Docker CE
# 設定倉庫
# 安裝所需包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 新增 Docker 安裝源
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安裝 Docker CE.
yum install -y containerd.io \
docker-ce-18.09.9 \
docker-ce-cli-18.09.9
# 啟動 Docker 并添加開機啟動
systemctl start docker
systemctl enable docker
#將Docker 的 Cgroup Driver 修改為 systemd
#修改為國內源
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"registry-mirrors":[
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# Restart docker.
systemctl daemon-reload
systemctl restart docker
安裝 kubeadm、kubelet 、kubectl
master/worker 節點均執行
# 配置K8S的yum源,最好使用官方源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 增加配置
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 加載
sysctl --system
# 安裝當前日期最新穩定版(v1.18.2) kubelet、 kubeadm 、kubectl
yum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2 --disableexcludes=kubernetes
# 啟動并設定 kubelet 開機啟動
systemctl start kubelet
systemctl enable kubelet
HAProxy 實作 apiserver 負載均衡集群
所有 master 節點執行
yum install haproxy-1.5.18 -y
cat > /etc/haproxy/haproxy.cfg <<EOF
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
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend k8s-api
mode tcp
option tcplog
bind *:16443
default_backend k8s-api
backend k8s-api
mode tcp
balance roundrobin
server master01 192.168.10.12:6443 check
server master02 192.168.10.13:6443 check
server master03 192.168.10.14:6443 check
EOF
所有 master 節點啟動 HAProxy
systemctl start haproxy
systemctl enable haproxy
Keepalived實作 apiserver 高可用集群
所有 master 節點執行
yum -y install keepalived psmisc
master01 上 keepalived 的配置:
# cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
router_id master01
script_user root
enable_script_security
}
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight 10
}
vrrp_instance VI_1 {
state MASTER
interface ens192
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.19
}
track_script {
check_haproxy
}
}
EOF
master02 上 keepalived 的配置:
# cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
router_id master02
script_user root
enable_script_security
}
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight 10
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
virtual_router_id 50
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.19
}
track_script {
check_haproxy
}
}
EOF
master03 上 keepalived 的配置:
# cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
router_id master03
script_user root
enable_script_security
}
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight 10
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
virtual_router_id 50
priority 96
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.19
}
track_script {
check_haproxy
}
}
EOF
所有 master 節點執行
service keepalived start
systemctl enable keepalived
注意
- vrrp_script 中引數 weight 一定要大于 master 和 backup 的 priority 的相差值
- vrrp_instance 中引數 nopreempt 可以防止 master 恢復后自動回切
創建 K8S 集群
在初始化之前,需要先設定 hosts 決議
MASTER_IP 為 VIP 的地址
APISERVER_NAME 為 VIP 的域名
export MASTER_IP=192.168.10.19
export APISERVER_NAME=k8s.api
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
在 master01 上執行 kubeadm init 進行初始化
kubeadm init \
--apiserver-advertise-address 0.0.0.0 \
--apiserver-bind-port 6443 \
--cert-dir /etc/kubernetes/pki \
--control-plane-endpoint k8s.api \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version 1.18.2 \
--pod-network-cidr 192.10.0.0/16 \
--service-cidr 192.20.0.0/16 \
--service-dns-domain cluster.local \
--upload-certs
注意保存結果中兩行 kubeadm join 開頭內容,用于添加其他 master、worker 節點到集群中,
加載環境變數
master01 上執行,用于管理集群
如果在root用戶下
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source .bash_profile
如果非root用戶下
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安裝 Pod 網路組件
master01 上執行
# 獲取組態檔
mkdir calico && cd calico
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
# 修改組態檔
vi calico.yaml
# 找到 192.168.0.0/16 ,修改為 192.10.0.0/16
# 部署 Pod 網路組件
kubectl apply -f calico.yaml
實時查看 pod 的狀態
watch kubectl get pods --all-namespaces -o wide
添加其他 master 節點到K8S集群
在其他 master 節點執行
使用 master01 上 kubeadm init 的執行結果中包含 join 的指令資訊
埠由 6443 修改為 16443
export MASTER_IP=192.168.10.19
export APISERVER_NAME=k8s.api
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
kubeadm join k8s.api:16443 --token ztjux9.2tau56zck212j9ra \
--discovery-token-ca-cert-hash sha256:a2b552266902fb5f6620330fc1a6638a9cdd6fec3408edba1082e6c8389ac517 \
--control-plane --certificate-key 961494e7d0a9de0219e2b0dc8bdaa9ca334ecf093a6c5f648aa34040ad39b61a
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source .bash_profile
將所有 Worker 節點添加到K8S集群
在worker 節點執行
使用 master01 上 kubeadm init 的執行結果中包含 join 的指令資訊
埠由 6443 修改為 16443
export MASTER_IP=192.168.10.19
export APISERVER_NAME=k8s.api
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
kubeadm join k8s.api:16443 --token ztjux9.2tau56zck212j9ra \
--discovery-token-ca-cert-hash sha256:a2b552266902fb5f6620330fc1a6638a9cdd6fec3408edba1082e6c8389ac517
master01 上查看集群
watch kubectl get nodes -o wide
全部為 Ready 說明集群安裝成功,
破壞性測驗
- 把 master01 的 haproxy 停掉
- 把 master01 機器關機
可以看到 VIP 可以漂移到 master02 上
然后可以在 master02 做同樣操作觀察 VIP 是否可以漂到 master03 上
結束語
今天主要是實戰搭建了 K8S 高可用負載均衡集群,是我實際操作的記錄,
那么你有沒有發現有個地方其實可以進一步的優化,
送你一碗雞湯喝
- 問題遇到的越早越好,如果你沒有遇到問題,說明你的問題更大,
參考文章
https://wsgzao.github.io/post/keepalived
https://www.kubernetes.org.cn/7315.html
聯系我
微信公眾號:zuolinux_com

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/180090.html
標籤:其他
上一篇:[資料結構] 單鏈表
