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

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

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

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

1 配置yum源

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

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

wget -O /etc/yum.repos.d/epel.repo //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 //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

參考鏈接

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

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

//www.toutiao.com/article/7105957860210819623/

//i4t.com/5451.html

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

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