集群规划
操作系统: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集群部署。