1. 程式人生 > >kubeadm HA master(v1.11.0)叢集搭建指南(離線包 + 自動化指令碼 + ipvs + keepalived + calico)_Kubernetes中文社群

kubeadm HA master(v1.11.0)叢集搭建指南(離線包 + 自動化指令碼 + ipvs + keepalived + calico)_Kubernetes中文社群

0x00 文章楔子

本文旨在通過最簡易的方式指導讀者搭建HA kubernetes 1.11叢集

通過部署指令碼驅動kubeadm工具進行自動化部署,自動啟動keepalived負載均衡,calico網路外掛,並且開啟kube-proxy的IPVS模式。

本文中的自動化部署指令碼可以在Lentil1016/kubeadm-ha找到,歡迎Star/Fork/提issue和PR。

在我的環境上進行示例自動化部署的錄影可以在該連結檢視

0x01 Kubernetes叢集搭建

叢集結構摘要

叢集結構摘要

Master是叢集的管理者,負責監控應用執行狀態,維護應用執行,如釋出工作任務、重啟應用、部署升級應用等

Worker(節點),也被稱為Minion,即從屬主機,是Kubernetes叢集中的一臺工作機器。每一個節點都包含了Pod執行所需的必要服務,例如docker/kubelet/kube-proxy。

Kubernetes叢集的基本部署步驟:

  1. 所有節點安裝docker
  2. harbor節點安裝harbor
  3. 所有master和minion節點安裝kubelet kubeadm kubectl
  4. 初始化master節點,並啟動Calico容器
  5. 將worker節點join到叢集中

各個機器的主機資訊以及IP分佈如下:

  • Distribute: CentOS 7
  • Docker: 17.03.2-ce
  • Kernel: 4.4.152-1.el7.elrepo.x86_64
  • Kubernetes: 1.11.0
  • NetPlugin: Calico
  • Proxy-Mode: IPVS
  • Master-Mode: HA Master
  • DNS: CoreDNS
Host Name Role IP
harbor image registry 10.130.38.80
centos-7-x86-64-29-80 master-1 10.130.29.80
centos-7-x86-64-29-81 master-2 10.130.29.81
centos-7-x86-64-29-82 master-3 10.130.29.82
Virtual IP 10.130.29.83
node1 worker 10.130.38.105
node2 worker 10.130.38.106
node3 worker 10.130.38.107

進行系統配置

在所有機器上執行下面的指令碼,配置註記:

  • 關閉防火牆、selinux
  • 關閉系統的Swap,Kubernetes 1.8開始要求。
  • 關閉linux swap空間的swappiness
  • 配置L2網橋在轉發包時會被iptables的FORWARD規則所過濾,該配置被CNI外掛需要,更多資訊請參考Network Plugin Requirements
  • 開啟IPVS
# 所有主機:基本系統配置

# 關閉Selinux/firewalld
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
 
# 關閉交換分割槽
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
 
# 設定網橋包經IPTables,core檔案生成路徑
echo """
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
""" > /etc/sysctl.conf
sysctl -p
 
# 同步時間
yum install -y ntpdate
ntpdate -u ntp.api.bz
 
# 安裝4.18版本核心
# 由於最新穩定版4.19核心將nf_conntrack_ipv4更名為nf_conntrack,目前的kube-proxy不支援在4.19版本核心下開啟ipvs
# 詳情可以檢視:https://github.com/kubernetes/kubernetes/issues/70304
# 對於該問題的修復10月30日剛剛合併到程式碼主幹,所以目前還沒有包含此修復的kubernetes版本發出
# 讀者可以選擇安裝我提供的4.18版本核心,或者不開啟IPVS
# 4.18版本核心RPM下載連結:https://pan.baidu.com/s/1dCeozuMRQ96MBBjGpf0cjA 提取碼:3nqg
cd /path/to/kernel-ml.tgz/
tar -xzvf kernel-ml.tgz
rpm -Uvh kernel-ml/*
 
# 檢查預設核心版本為4.18,否則請調整預設啟動引數
grub2-editenv list
 
#重啟以更換核心
reboot
 
# 確認核心版本
uname -a
 
# 確認核心為4.18後,開啟IPVS
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
 
#!/bin/bash
ipvs_modules="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_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack_ipv4"
for kernel_module in \${ipvs_modules}; do
 /sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
 if [ $? -eq 0 ]; then
 /sbin/modprobe \${kernel_module}
 fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

Kubernetes要求叢集中所有機器具有不同的Mac地址、產品uuid、Hostname。可以使用如下命令檢視Mac和uuid

# 所有主機:檢查UUID和Mac

cat /sys/class/dmi/id/product_uuid
ip link

安裝配置Docker

Docker從1.13版本開始調整了預設的防火牆規則,禁用了iptables filter表中FOWARD鏈,這樣會引起Kubernetes叢集中跨Node的Pod無法通訊,因此docker安裝完成後,還需要手動修改iptables規則。

安裝私有映象庫

如果不能翻牆,需要使用本文提供的私有映象源,則還需要為docker做如下配置,將K8s官方映象庫的幾個域名設定為insecure-registry,然後設定hosts使它們指向私有源。

# 所有主機:http私有源配置

# 為Docker配置一下私有源
mkdir -p /etc/docker
echo -e '{\n"insecure-registries":["k8s.gcr.io", "gcr.io", "quay.io"]\n}' > /etc/docker/daemon.json
systemctl restart docker
 
# 此處應當修改為harbor所在機器的IP
HARBOR_HOST="10.130.38.80"
# 設定Hosts
yes | cp /etc/hosts /etc/hosts_bak
cat /etc/hosts_bak|grep -vE '(gcr.io|harbor.io|quay.io)' > /etc/hosts
echo """
$HARBOR_HOST gcr.io harbor.io k8s.gcr.io quay.io """ >> /etc/hosts

下載連結:https://pan.baidu.com/s/17PV_VRYIbfmPz1qiiR_yGg 密碼:newp,隨後將該檔案放置到harbor機器上,並在harbor主機上載入、啟動該映象

# harbor:啟動私有映象庫

docker load -i /path/to/k8s-repo-1.11.0
docker run --restart=always -d -p 80:5000 --name repo harbor.io:1180/system/k8s-repo:v1.11.0

該映象庫中包含如下映象,全部來源於官方映象站。

映象列表

安裝配置kubernetes

基本安裝

首先下載連結:https://pan.baidu.com/s/1tOIFgnexs25XWHxitLmmVQ 密碼:lqth,並放置在k8s各個master和worker主機上

# master & worker:安裝kubernetes

yum install -y socat keepalived ipvsadm
cd /path/to/downloaded/file
tar -xzvf k8s-v1.11.0-rpms.tgz
cd k8s-v1.11.0
rpm -ivh *
systemctl enable kubelet
kubeadm version -o short

配置免密碼登陸

# master-1:生成ssh金鑰對

ssh-keygen
# 三次回車後,金鑰生成完成
cat ~/.ssh/id_rsa.pub
# 得到該機器的公鑰如下圖

將該公鑰複製,並分別登陸到master-1 master-2 master-3的root使用者,將它令起一行貼上到 ~/.ssh/authorized_keys 檔案中,包括master-1自己

複製完成後,從master-1上分別登陸master-1 master-2 master-3測試是否可以免密碼登陸(請不要跳過這一步),可以的話便可以繼續執行下一步

部署HA Master

HA Master的部署過程已經自動化,請在master-1上執行如下命令,並注意修改IP和Hostname

# 部署HA master

cd ~/
 
# 建立叢集資訊檔案
echo """
CP0_IP=10.130.29.80
CP0_HOSTNAME=centos-7-x86-64-29-80
CP1_IP=10.130.29.81
CP1_HOSTNAME=centos-7-x86-64-29-81
CP2_IP=10.130.29.82
CP2_HOSTNAME=centos-7-x86-64-29-82
VIP=10.130.29.83
NET_IF=eth0
CIDR=172.168.0.0/16
""" > ./cluster-info
 
bash -c "$(curl -fsSL https://raw.githubusercontent.com/Lentil1016/kubeadm-ha/1.11.0/kubeha-gen.sh)"
# 該步驟將可能持續2到10分鐘,在該指令碼進行安裝部署前,將有一次對安裝資訊進行檢查確認的機會

可以在該連結檢視我在自己的環境上安裝全過程的錄影,安裝結束後會打印出如下的資訊,最後一行為加入叢集的命令,其中加入叢集的IP已經被更換為了高可用的VIP。

加入work node

現在可以將各節點入編到叢集中。join command是由kubeadm動態生成的,其基本形式如下

# worker:將worker編入叢集
kubeadm join --token fae76b.88ae6b2ad052b67f 10.130.29.83:6443 --discovery-token-ca-cert-hash sha256:9ed673962fd437dc556ccab07d02d718da01cf5db1b6eeaf443ecadd891a73e8

其中包含了節點入編叢集所需要攜帶的驗證token,以防止外部惡意的節點進入叢集。每個token自生成起24小時後過期。屆時如果需要加入新的節點,則需要重新生成新的join token,請使用下面的命令生成,注意改寫IP:

# master-1:生成指向VIP的Join Command
kubeadm token create --print-join-command|sed 's/${LOCAL_IP}/${VIP}/g'

隨後到worker節點執行剛剛生成的join command即可將該節點編入叢集。

至此,HA master Kubernetes 叢集搭建完畢