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叢集的基本部署步驟:
- 所有節點安裝docker
- harbor節點安裝harbor
- 所有master和minion節點安裝kubelet kubeadm kubectl
- 初始化master節點,並啟動Calico容器
- 將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 # 安裝docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo yum makecache fast yum install -y docker-ce # 編輯systemctl的Docker啟動檔案 sed -i "13i ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT" /usr/lib/systemd/system/docker.service # 啟動docker systemctl daemon-reload systemctl enable docker systemctl start docker
安裝私有映象庫
如果不能翻牆,需要使用本文提供的私有映象源,則還需要為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 叢集搭建完畢