基於Kubernetes v1.24.0的叢集搭建(二)

2022-06-15 15:00:31

上一篇文章主要是介紹了,每臺虛擬機器器的環境設定。接下來我們開始有關K8S的相關部署。

另外補充一下上一篇文章中的K8S的change​log連結:

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md

1 設定yum源

所有節點都需要執行此操作

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum clean all

yum makecache

2 br_netfilter和ip_conntrack模組設定

  • 所有節點都需要執行此操作
  • 載入 br_netfilter 模組以啟用核心 ipv4 轉發,1.20+強依賴該模組
  • ip_conntrack 模組來記錄iptables 網路包的狀態,並把每條記錄儲存到table 裡
modprobe br_netfilter
modprobe ip_conntrack

這裡為了防止bridge-nf-call-ip6tables和bridge-nf-call-iptables無法啟動,需要設定br_netfilter開機自動啟動。

  1. 新建 /etc/rc.sysinit 檔案
cat >>/etc/rc.sysinit<<EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF


2. 新建br_netfilter.modules和ip_conntrack.modules

echo "modprobe br_netfilter" >/etc/sysconfig/modules/br_netfilter.modules
echo "modprobe ip_conntrack" >/etc/sysconfig/modules/ip_conntrack.modules

3 設定核心轉發及網橋過濾

新增網橋過濾及核心轉發組態檔

cat <<EOF >/etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
EOF

net.bridge.bridge-nf-call-ip6tables:是否在 ip6tables 鏈中過濾 IPv6 包

net.bridge.bridge-nf-call-iptables:是否在 iptables 鏈中過濾 IPv4 包

執行如下命令,使設定生效

$ sysctl -p /etc/sysctl.d/k8s.conf 

4 安裝ipset及ipvs

所有主機都需要操作

4.1 安裝ipset

ipset是iptables的擴充套件,它允許你建立匹配整個地址集合的規則。而不像普通的iptables鏈只能單IP匹配, ip集合儲存在帶索引的資料結構中,這種結構即時集合比較大也可以進行高效的查詢,除了一些常用的情況,比如阻止一些危險主機存取本機,從而減少系統資源佔用或網路擁塞,IPsets也具備一些新防火牆設計方法,並簡化了設定。

yum install ipset -y

4.2 安裝ipvs

IPVS (IP Virtual Server)是基於Netfilter的、作為linux核心的一部分實現傳輸層負載均衡的技術。

IPVS整合在LVS(Linux Virtual Server)中,它在主機中執行,並在真實伺服器叢集前充當負載均衡器。IPVS可以將對TCP/UDP服務的請求轉發給後端的真實伺服器,因此IPVS天然支援Kubernetes Service。

隨著kubernetes使用量的增長,其資源的可延伸性變得越來越重要。特別是對於使用kubernetes執行大型工作負載的開發人員或者公司來說,service的可延伸性至關重要。

kube-proxy是為service構建路由規則的模組,之前依賴iptables來實現主要service型別的支援,比如(ClusterIP和NodePort)。但是iptables很難支援上萬級的service,因為iptables純粹是為防火牆而設計的,並且底層資料結構是核心規則的列表。

kubernetes早在1.6版本就已經有能力支援5000多節點,這樣基於iptables的kube-proxy就成為叢集擴容到5000節點的瓶頸。舉例來說,如果在一個5000節點的叢集,我們建立2000個service,並且每個service有10個pod,那麼我們就會在每個節點上有至少20000條iptables規則,這會導致核心非常繁忙。

基於IPVS的叢集內負載均衡就可以完美地解決這個問題。IPVS是專門為負載均衡設計的,並且底層使用雜湊表這種非常高效的資料結構,幾乎可以允許無限擴容。

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

4.3 安裝ipvsadm

為了便於檢視ipvs的代理規則,最好安裝一下管理工具ipvsadm。

yum install -y ipset ipvsadm

5 containerd

5.1 安裝containerd

containerd-{version}-linux-amd64.tar.gz 只包含containerd

cri-containerd-cni-{version}-linux-amd64.tar.gz 裡面包含了systemd組態檔,containerd以及cni、runc等相關工具包,接下來我們將使用本包進行安裝

開啟github containerd releases,檢視最新包,這裡的最新版本是1.6.6

但是開啟containerd.io,卻發現最新版本是1.6.4

後面我在下載1.6.6版本的時候,老是報Connection refused

但是下載1.6.4的時候,卻十分的順利,不知道是為什麼,但是並不影響我們的部署,所以接下來我們直接使用1.6.4.

wget https://github.com/containerd/containerd/releases/download/v1.6.4/cri-containerd-cni-1.6.4-linux-amd64.tar.gz

然後我們把壓縮包解壓到系統的根目錄中

tar zxvf cri-containerd-cni-1.6.4-linux-amd64.tar.gz -C /

5.2 設定containerd

mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

設定容器的cgroup驅動為systemd

替換預設pause映象地址

設定開機啟動

systemctl enable containerd --now

測試安裝結果

crictl version

參考連結

http://www.manongjc.com/detail/25-lioggelnywerjyf.html

https://www.kubernetes.org.cn/1904.html

https://www.toutiao.com/article/7105957860210819623/

https://i4t.com/5451.html

https://blog.frognew.com/2022/05/kubeadm-install-kubernetes-1.24.html

https://learn.lianglianglee.com/專欄/Kubernetes 實踐入門指南/07 容器引擎 containerd 落地實踐.md