一、架構圖
如下圖所示:
二、環境信息
1、部署規劃
主機名 | K8S版本 | 系統版本 | 內核版本 | IP地址 | 備注 |
---|---|---|---|---|---|
k8s-master-63 | 1.24.16 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.63 | master節點 + etcd節點 |
k8s-master-64 | 1.24.16 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.64 | master節點 + etcd節點 |
k8s-master-65 | 1.24.16 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.65 | master節點 + etcd節點 |
k8s-worker-66 | 1.24.16 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.66 | worker節點 |
- | - | - | - | 192.168.1.146 | vip |
k8s-lb-01 | - | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.185 | Nginx + keepalived |
k8s-lb-02 | - | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.205 | Nginx + keepalived |
2、集群網段
宿主機 | 集群Pod網段 | 集群Service網段 |
---|---|---|
192.168.1.0/24 | 10.48.0.0/16 | 10.96.0.0/16 |
說明:Kubernetes高可用集群基于kubeadm工具部署,其中etcd集群采用二進制方式部署。由于測試機器數量有限,etcd服務部署在master節點上,你可以根據自己需要,使用單獨的主機部署etcd集群服務。
三、安裝和配置先決條件
3.1、主機名設置
說明:分別在對應的節點IP上設置主機名。
root@lolaage-virtual-machine:~# hostnamectl set-hostname k8s-master-63
root@lolaage-virtual-machine:~# hostnamectl set-hostname k8s-master-64
root@lolaage-virtual-machine:~# hostnamectl set-hostname k8s-master-65
root@lolaage-virtual-machine:~# hostnamectl set-hostname k8s-worker-66
root@lolaage-virtual-machine:~# hostnamectl set-hostname k8s-lb-01
root@lolaage-virtual-machine:~# hostnamectl set-hostname k8s-lb-02
3.2、配置主機hosts
說明:以下操作無論是master節點和worker節點均需要執行。
root@lolaage-virtual-machine:~# vim /etc/hosts
192.168.1.63 k8s-master-63
192.168.1.64 k8s-master-64
192.168.1.65 k8s-master-65
192.168.1.66 k8s-worker-66
3.3、關閉防火墻
說明:以下操作無論是master節點、worker節點、kube-lb節點均需要執行。
root@lolaage-virtual-machine:~# ufw disable && systemctl stop ufw && systemctl disable ufw
3.4、關閉swap分區
說明:以下操作無論是master節點、worker節點、kube-lb節點均需要執行。
root@lolaage-virtual-machine:~# swapoff -a
root@lolaage-virtual-machine:~# sed -i '/swap/ s/^/#/' /etc/fstab
3.5、時間時區同步
說明:以下操作無論是master節點、worker節點、kube-lb節點均需要執行。
1、設置時區為Asia/Shanghai,如果已經是則請忽略
root@k8s-master-65:~# timedatectlLocal time: 五 2023-03-31 14:11:36 CSTUniversal time: 五 2023-03-31 06:11:36 UTCRTC time: 五 2023-03-31 06:11:36 Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes NTP service: active RTC in local TZ: no
2、使用chrony同步時間
root@k8s-master-63:~# apt install chrony -y
root@k8s-master-63:~# vim /etc/chrony/chrony.conf
server ntp.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp1.aliyun.com minpoll 4 maxpoll 10 iburst
#pool ntp.ubuntu.com iburst maxsources 4
#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
#pool 2.ubuntu.pool.ntp.org iburst maxsources 2root@k8s-master-63:~# systemctl enable chronyd.service
root@k8s-master-63:~# systemctl restart chronyd.service
root@k8s-master-63:~# systemctl status chronyd.service
阿里云NTP服務器地址列表,狀態檢測如下所示:
chrony客戶端上的一些常用命令:
# 1、查看可用的時間同步源
chronyc sources -v
# 2、查看時間同步源的狀態
chronyc sourcestats -v
# 3、對客戶端系統時間進行強制同步
chronyc -a makestep
3.6、修改內核參數
說明:以下操作無論是master節點、worker節點均需要執行。
說明:有一些ipv4的流量不能走iptables鏈,因為linux內核是一個過濾器,所有流量都會經過他,然后再匹配是否可進入當前應用進程去處理,所以會導致流量丟失。配置k8s.conf文件,如下所示:
# 1、加載br_netfilter和overlay模塊
root@k8s-master-63:~# cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
root@k8s-master-63:~# modprobe overlay
root@k8s-master-63:~# modprobe br_netfilter
# 2、設置所需的sysctl參數,參數在重新啟動后保持不變
root@k8s-master-63:~# cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 3、應用sysctl參數而不重新啟動
root@k8s-master-63:~# sysctl --system
3.7、啟用IPVS模式
說明:以下操作無論是master節點、worker節點節點均需要執行。
# kube-proxy開啟ipvs的前提需要加載以下的內核模塊
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
注意:如果出現modprobe: FATAL: Module nf_conntrack_ipv4 not found in directory /lib/modules/5.15.0-69-generic錯誤,這是因為使用了高內核,當前內核版本為5.15.0-69-generic,在高版本內核已經把nf_conntrack_ipv4替換為nf_conntrack了。
# 1、安裝ipvs
root@k8s-master-63:~# apt -y install ipvsadm ipset sysstat conntrack
# 2、加載內核模塊腳本
root@k8s-master-63:~# cat > /etc/profile.d/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# 3、賦予權限
root@k8s-master-63:~# chmod 755 /etc/profile.d/ipvs.modules
# 4、執行加載模塊腳本
root@k8s-master-63:~# bash /etc/profile.d/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
四、安裝etcd集群
4.1、生成etcd集群相關證書
說明:手動創建證書比較麻煩,這里采用了etcd證書一鍵生成工具來創建etcd相關證書,可以在任意一節點主機上生成etcd集群相關證書。
操作步驟如下圖所示:
1、有一些ipv4的流量不能走iptables鏈,因為linux內核是一個過濾器,所有流量都會經過他,然后再匹配是否可進入當前應用進程去處理,所以會導致流量丟失。配置k8s.conf文件,如下所示:
2、其中ca-key.pem、ca.pem、apiserver-etcd-client.pem、apiserver-etcd-client-key.pem文件是kube-apiserver連接etcd所需證書。這4個證書文件必須要上傳到 所有master節點上,需提前手動創建好證書存放目錄。其中ca-key.pem、ca.pem建議目錄為/etc/kubernetes/pki/etcd,apiserver-etcd-client.pem、apiserver-etcd-client-key.pem建議目錄為 /etc/kubernetes/pki
3、其中ca-key.pem、ca.pem、healthcheck-client-key.pem、healthcheck-client.pem、peer-key.pem、peer.pem、server-key.pem、server.pem是etcd集群所需要證書。這8個證書文件必須要上傳到 所有etcd節點上。這8個證書文件建議目錄為/etc/kubernetes/pki/etcd。
4、如果某一個節點如k8s-master-63節點,它即為master節點,也是etcd節點,則證書文件列表如下所示:
5、這里就默認在k8s-master-63(即192.168.1.63)節點上生成相關證書,并將證書分別復制到etcd各個節點相應目錄及master節點相關目錄下,其中證書目錄需提前創建好,當前K8S集群環境apiserver節點和etcd節點為同一主機,所以拷貝完之后證書文件列表如上圖所示,這里就以k8s-master-63(即192.168.1.63)節點展示,其它節點也跟這個一樣。
證書文件 | 秘鑰文件 | 建議路徑 | 節點 | 說明 |
---|---|---|---|---|
ca.pem | ca-key.pem | /etc/kubernetes/pki/etcd | etcd所在節點 | etcd集群ca根證書 |
peer.pem | peer-key.pem | /etc/kubernetes/pki/etcd | etcd所在節點 | etcd集群peer證書 |
server.pem | server-key.pem | /etc/kubernetes/pki/etcd | etcd所在節點 | etcd集群server證書 |
healthcheck-client.pem | healthcheck-client-key.pem | /etc/kubernetes/pki/etcd | etcd所在節點 | etcd集群client證書 |
apiserver-etcd-client.pem | apiserver-etcd-client-key.pem | /etc/kubernetes/pki | apiserver所在節點 | apiserver連接etcd客戶端證書 |
4.2、二進制安裝etcd集群
4.2.1、下載軟件包
說明:以下操作須在etcd所有節點操作。
wget https://github.com/etcd-io/etcd/releases/download/v3.5.6/etcd-v3.5.6-linux-amd64.tar.gz
tar axf etcd-v3.5.6-linux-amd64.tar.gz
mv etcd-v3.5.6-linux-amd64/etcd* /usr/bin
4.2.2、創建Service文件
說明:以下操作只需在etcd01節點操作。
1、etcd01節點etcd.service文件如下所示: |
root@k8s-master-63:~# cat /etc/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos[Service]
Type=notify
WorkingDirectory=/var/lib/etcd
ExecStart=/usr/bin/etcd \--name=etcd01 \--cert-file=/etc/kubernetes/pki/etcd/server.pem \--key-file=/etc/kubernetes/pki/etcd/server-key.pem \--peer-cert-file=/etc/kubernetes/pki/etcd/peer.pem \--peer-key-file=/etc/kubernetes/pki/etcd/peer-key.pem \--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.pem \--peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.pem \--initial-advertise-peer-urls=https://192.168.1.63:2380 \--listen-peer-urls=https://192.168.1.63:2380 \--listen-client-urls=https://192.168.1.63:2379,http://127.0.0.1:2379 \--advertise-client-urls