集群規劃
操作系統:CentOS7 內核版本:5.4+(需升級)
組件 | 版本 | 說明 |
---|---|---|
操作系統內核 | 5.4+ | RPM方式升級 |
docker | 26.1.4 | yum安裝 |
cri-docker | 0.3.16 | 二進制安裝 |
kubeadm | 1.30.11 | yum安裝 |
kubealet | 1.30.11 | yum安裝 |
kubectl | 1.30.11 | yum安裝 |
kubectl | 1.30.11 | yum安裝 |
kubernetes | 1.30.11 | kubeadm部署 |
flannel | 1.6.2 | CNI插件 |
kubernetes-dashboad | 7.6.5 | helm安裝 |
metric-server | 0.7.2 |
網絡規劃
- 虛擬機NAT地址
子網IP 子網掩碼 網關 192.168.85.0 255.255.255.0 192.168.85.1 - K8S集群網絡
Pod子網 Service子網 10.240.0.0/16 10.140.0.0/16 - K8S集群節點
節點名稱 節點IP master101 192.168.85.101 node102 192.168.85.102 node103 192.168.85.103
創建虛擬機
使用VMWare先創建一個虛擬機,虛擬機的網絡配置使用網橋,需要提前配置好網絡配置,如:網段、掩碼、網關。這部分教程比較多,可自行搜索。唯一需要注意的一點就是NAT網絡的設置,需要注意子網、掩碼、網關的地址,在后續的操作系統中用于配置節點的網絡。
系統配置
配置網絡
操作系統安裝好之后,第一步就是先配置好網絡,網絡連通之后才能繼續后續的步驟。在這個集群里,我們通常會把IP設置為靜態IP方便管理。
[root@master101 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO="static" # 必須為static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33 # 網卡名稱
UUID=07ba6f88-2fce-4fd9-9b95-4da163097f7a
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.85.101 # 靜態IP 需要在虛擬機的NET地址網段內
GATEWAY=192.168.85.1 # 網關 需要與虛擬機的NET地址的網關一致
NETMASK=255.255.255.0 # 掩碼 需要與虛擬機的NET地址的掩碼一致
IPV6_PRIVACY=no #
DNS1=8.8.8.8 # DNS可以有多個,也可以使用其他穩定的DNS
PREFIX=24
重新啟動下網絡,并檢查下IP是否是與配置文件一致
[root@master101 ~]# systemctl restart network
[root@master101 ~]# ifconfig
關閉防火墻
[root@master101 ~]# systemctl disable firewalld
[root@master101 ~]# systemctl stop firewalld
[root@master101 ~]# systemctl status firewalld
[root@master101 ~]# systemctl restart network
同步時鐘
[root@master101 ~]# timedatectl set-timezone 'Asia/Shanghai'
[root@master101 ~]# ntpdate ntp1.aliyun.com
[root@master101 ~]# date
[root@master101 ~]# cat >> /etc/crontab << EOF
* * * * root /usr/sbin/ntpdate ntp1.aliyun.com && /sbin/hwclock -w
EOF
升級內核
Kubernetes 1.30 默認要求容器運行時(containerd/CRI-O)啟用 ?cgroups v2,而完整支持該功能需要 Linux 5.4+ 內核。目前使用的docker,沒有修改使用到cgroupV2。
- 查看系統的內核版本
[root@master101 ~]# uname -r 3.10.0-693.el7.x86_64
- 使用yum升級內核
沒有找到預期的內核版本,所以換種另外的方式,使用RPM來安裝。[root@master101 ~]# cat <<EOF > /etc/yum.repos.d/elrepo.repo [elrepo] name=elrepo baseurl=https://mirrors.aliyun.com/elrepo/archive/kernel/el7/x86_64 gpgcheck=0 enabled=1 EOF [root@master101 ~]# yum clean all && yum makecache [root@master101 ~]# yum list --showduplicate kernel* 已加載插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile 已安裝的軟件包 kernel.x86_64 3.10.0-693.el7 @anaconda kernel-devel.x86_64 3.10.0-693.el7 @anaconda kernel-headers.x86_64 3.10.0-693.el7 @anaconda kernel-tools.x86_64 3.10.0-693.el7 @anaconda kernel-tools-libs.x86_64 3.10.0-693.el7 @anaconda
- RPM升級內核
下載內核包
安裝[root@master101 ~]# mkdir kernel-rpm [root@master101 ~]# cd kernel-rpm [root@master101 kernel-rpm]# wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64.rpm [root@master101 kernel-rpm]# wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-headers-5.4.226-1.el7.elrepo.x86_64.rpm [root@master101 kernel-rpm]# wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.226-1.el7.elrepo.x86_64.rpm
查看內核啟動版本[root@master101 kernel-rpm]# rpm -ivh kernel-lt-5.4.226-1.el7.elrepo.x86_64.rpm [root@master101 kernel-rpm]# rpm -ivh kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64.rpm
設置內核啟動順序,默認啟動高版本的內核[root@master101 kernel-rpm]# rpm -qa | grep kernel kernel-tools-libs-3.10.0-693.el7.x86_64 kernel-headers-3.10.0-693.el7.x86_64 kernel-lt-5.4.226-1.el7.elrepo.x86_64 abrt-addon-kerneloops-2.1.11-48.el7.centos.x86_64 kernel-lt-devel-5.4.226-1.el7.elrepo.x86_64 kernel-3.10.0-693.el7.x86_64 kernel-devel-3.10.0-693.el7.x86_64 kernel-tools-3.10.0-693.el7.x86_64
CentOS7.9升級3.10內核至5.4[root@master101 ~]# cat /etc/grub2.cfg | grep menuentry|awk -F "\'" '$1=="menuentry " {print i++ " : " $2}' [root@master101 ~]# grub2-set-default 0 [root@master101 ~]# reboot [root@master101 ~]# uname -r 5.4.226-1.el7.elrepo.x86_64
配置內核參數
禁止使用swap分區
[root@master101 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
[root@master101 ~]# setenforce 0
[root@master101 ~]# swapoff -a
將橋接的lPv4流量傳遞到iptables的鏈
[root@master101 ~]# cat > /etc/sysctl.d/k8s.conf << EOF
vm.swappiness=0
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@master101 ~]# sysctl -p /etc/sysctl.d/k8s.conf
vm.swappiness = 0
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@master101 ~]# sysctl --system
配置ipvs功能
[root@master101 ~]# yum install ipset ipvsadm -y
[root@master101 ~]# 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
[root@master101 ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
[root@master101 ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
[root@master101 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack_ipv4 15053 2
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
nf_conntrack 139264 6 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
安裝Docker以及cri-dockerd
安裝Docker
[root@master101 ~]# yum remove docker*
[root@master101 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@master101 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@master101 ~]# yum install -y docker-ce
[root@master101 ~]# docker -v
Docker version 26.1.4, build 5650f9b
配置國內的鏡像源,一般可以去阿里云注冊一個賬戶,免費使用它的鏡像加速。當然也可以使用其他常用的加速地址。不過更推薦阿里云的,因為比較穩定。
[root@localhost ~]# cat >> /etc/docker/daemon.json << EOF
{"registry-mirrors": ["https://29wbjzyc.mirror.aliyuncs.com","https://registry.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn"],"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF[root@master101 ~]# systemctl daemon-reload
[root@master101 ~]# systemctl restart docker
先拉取下后續安裝K8S所需的鏡像,順便驗證下docker是否正常。
[root@master101 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ghcr.io/flannel-io/flannel-cni-plugin v1.6.2-flannel1 55ce2385d9d8 6 weeks ago 10.7MB
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kubernetesui/dashboard-api 1.8.1 9446b3f1c3ba 6 months ago 46.9MB
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kong 3.8.0 8ed1b48bc959 6 months ago 375MB
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kubernetesui/dashboard-web 1.4.0 65bdf9576e48 9 months ago 181MB
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kubernetesui/dashboard-auth 1.1.3 19b0f210f0dc 11 months ago 40.1MB
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kubernetesui/dashboard-metrics-scraper 1.1.1 e3e259695944 12 months ago 35.3MB
安裝cri-dockerd
[root@master101 ~]# mkdir k8s && cd k8s
[root@master101 k8s]# wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16.amd64.tgz
[root@master101 k8s]# ls
cri-dockerd-0.3.16.amd64.tgz
[root@master101 k8s]# tar xvf cri-dockerd-0.3.16.amd64.tgz
cri-dockerd/
cri-dockerd/cri-dockerd
[root@master101 k8s]# ls
cri-dockerd cri-dockerd-0.3.16.amd64.tgz
[root@master101 k8s]# cp cri-dockerd/cri-dockerd /usr/bin/
[root@master101 k8s]# cri-dockerd --version
cri-dockerd 0.3.16 (7119864)
配置 cri-docker 服務
# 配置 cri-docker 服務
[root@master101 k8s]# cat > /usr/lib/systemd/system/cri-docker.service <<EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process[Install]
WantedBy=multi-user.target
EOF# 配置 cri-docker socket
[root@master101 k8s]# cat > /usr/lib/systemd/system/cri-docker.socket <<EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker[Install]
WantedBy=sockets.target
重新啟動并且設置開機自啟動
[root@master101 k8s]# systemctl daemon-reload
[root@master101 k8s]# systemctl enable cri-docker --now
安裝 kubeadm、kubelet、kubectl
通過阿里云的鏡像站來完成加速下載 kubeadm、kubelet、kubectl。需要注意的是由于 Kubernetes 官方變更了倉庫的存儲路徑以及使用方式,如果需要使用 1.28 及以上版本,需要使用新版配置方法進行配置。詳情參見阿里云開發者社區-鏡像站-kubernetes。
[root@master101 ~]# cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key
EOF[root@master101 ~]# yum --disablerepo="*" --enablerepo="kubernetes" list available
[root@master101 ~]# yum -y install kubeadm kubelet kubectl# 如果無法啟動則需要排查下,可能因為開啟了swap
[root@master101 ~]# systemctl status kubelet
[root@master101 ~]# systemctl start kubelet
[root@master101 ~]# systemctl enable kubelet
注意:如果kubelet啟動失敗,大概率是系統開啟了swap分區,這時候是需要關閉的。
[root@master101 ~]# swapon --show
NAME TYPE SIZE USED PRIO
/dev/dm-1 partition 2G 524K -2
[root@master101 ~]# cat /etc/fstab | grep swap
/dev/mapper/centos-swap swap swap defaults 0 0
[root@master101 ~]# vim /etc/fstab
[root@master101 ~]# cat /etc/fstab | grep swap
#/dev/mapper/centos-swap swap swap defaults 0 0
[root@master101 ~]# swapoff -a
克隆機器
目前為止,我們在master101上配置了k8s集群部署所需的關鍵配置,也完成了docker和k8s容器運行時的安裝,拉取了后續集群部署所需的鏡像。 拉取鏡像其實可以放到后續的步驟去完成,只是我比較懶,我更希望通過克隆虛擬機的方式將所有資源都拷貝到集群的各個節點上。這樣可以避免多次下載。后面直接將master101當成模板機克隆出兩臺機器node102以及node103,當然熟悉的朋友也可以自行再次新建虛擬機完成。這里的克隆我就不再演示了,比較簡單,沒什么門檻,只是克隆的時候需要注意是完整克隆。
網絡配置
由于兩臺虛擬機都是通過master101克隆出來的,所以克隆出來的node102,、node103與master101的IP地址還有主機名都是一樣的,因此我們需要修改IP地址和主機名。先單獨開啟node102,或者將master101和node103的網絡斷開,這樣node102就可以正常使用網絡通信了。
需要注意UUID是否與master101一致,如果一致則需要重新修改,UUID在我們的網絡集群中必須保證唯一性。設置完IP之后,我們再修改下主機名方便我們更好的區分。
[root@master101 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep -E 'IPADDR|UUID'
UUID=1ebe2b03-dd7d-4df7-87e9-1dbc00c33252
IPADDR=192.168.85.101
[root@master101 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@master101 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep -E 'IPADDR|UUID'
UUID=1ebe2b03-dd7d-4df7-87e9-1dbc00c33252
IPADDR=192.168.85.102
[root@master101 ~]# hostnamectl set-hostname node102
[root@master101 ~]# systemctl restart network
如果我們使用shell遠程連接的可能需要重新使用node102的IP完成登錄。按照此步驟我們開啟node103并完成相關的配置。
[root@master101 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep -E 'IPADDR|UUID'
UUID=1ebe2b03-dd7d-4df7-87e9-1dbc00c33259
IPADDR=192.168.85.101
[root@master101 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@master101 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep -E 'IPADDR|UUID'
UUID=1ebe2b03-dd7d-4df7-87e9-1dbc00c33259
IPADDR=192.168.85.103
[root@master101 ~]# hostnamectl set-hostname node103
[root@master101 ~]# systemctl restart network
在三臺主機上都添加下集群節點的主機名信息,注意是三個節點都執行
[root@master101 ~]# cat >> /etc/hosts <<EOF
> 192.168.85.101 master101 master101
> 192.168.85.102 node102 node102
> 192.168.85.103 node103 node103
> EOF
免密登錄
所有主機均修改ssh配置運行公鑰驗證免密登錄,先打開公鑰驗證開關,注意三個主機都需要執行。
[root@master101 ~]# cat /etc/ssh/sshd_config | grep -e AuthorizedKeysFile -e PubkeyAuthentication
#PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
[root@master101 ~]# vim /etc/ssh/sshd_config
[root@master101 ~]# cat /etc/ssh/sshd_config | grep -e AuthorizedKeysFile -e PubkeyAuthentication
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
生成以RSA算法生成的秘鑰對,執行命令時不輸入任何信息直接回車,保持默認就行。三個節點均需要執行。
[root@master101 ~]# ssh-keygen -t rsa
[root@master101 .ssh]# pwd
/root/.ssh
[root@master101 .ssh]# ls
id_rsa id_rsa.pub
在master101上將每個節點的公鑰復制
[root@master101 .ssh]# cat id_rsa.pub >> authorized_keys
[root@master101 .ssh]# ssh master101 # 自己遠程自己,測試下
[root@master101 ~]# ssh root@node102 cat ~/.ssh/id_rsa.pub>> authorized_keys
[root@master101 ~]# ssh root@node103 cat ~/.ssh/id_rsa.pub>> authorized_keys
[root@master101 ~]# scp authorized_keys root@node102:/root/.ssh/
[root@master101 ~]# scp authorized_keys root@node103:/root/.ssh/
[root@master101 ~]# scp known_hosts root@node102:/root/.ssh/
[root@master101 ~]# scp known_hosts root@node103:/root/.ssh/
Part1結束語
截止到目前為止,我們已經完成了k8s集群部署的所有準備工作,接下來就是使用kubeadm來完成集群的部署。具體步驟在Part2:基于國內源完成Kubernetes集群部署。