目录
序:
Kubernetes 简称K8s,其集群由控制平面(也称为Control Plane主控或者主节点)和一个或多个Node工作节点组成,集群结构如下图(来自官网):
由于网上文章存在安装Kubernetes不够规范情况,例如有些文章安装了不必要的docker ce导致与其存在依赖耦合,或者有些文章所用Kubernetes版本老旧;或者命令选项没有参考最新的官网文档建议等。
本文以2025年最新发布Kubernetes v1.32.3为例,完整展示安装与集群构建过程。
一、环境准备
1、服务器准备
机器实际IP及hostname | 硬件配置及操作系统 | 机器用途 | 备注 |
---|---|---|---|
192.168.43.100 k8s-cp1 |
CPU2核;内存3GB CentOS 7.9 64bit 内核:已升至5.4.278 |
Kubernetes Control控制平面 |
也称主控(之前称Master主节点) 最低要求:CPU≥2核,MEM≥2GB 生产环境推荐3~5台,不要单机 |
192.168.43.201 k8s-wn01 |
CPU1核;内存3GB CentOS 7.9 64bit 内核:已升至5.4.278 |
Kubernetes Node工作节点 |
Work Node工作节点也称为Node节点 最低要求:CPU≥1核,MEM≥2GB |
192.168.43.202 k8s-wn02 |
CPU1核;内存3GB CentOS 7.9 64bit 内核:已升至5.4.278 |
Kubernetes Node工作节点 |
Work Node工作节点也称为Node节点 最低要求:CPU≥1核,MEM≥2GB |
注①:Linux内核升级方法参见:CentOS Linux升级内核kernel方法-CSDN博客
注②:确保各机器的IP、hostname、MAC地址、/sys/class/dmi/id/product_uui值均是不同的。
2、网段规划
网段 | 用途 | 备注 |
---|---|---|
192.168.43.0/24 | 集群Cluster节点间网段 Kubernetes的Control控制平面与Node工作节点之间的通讯网段 |
各个节点机器实际IP既在此网段中 |
10.244.0.0/16 | Pod网段 Kubernetes的Pod地址段 |
在kubeadm init命令中通过选项--pod-network-cidr设定。 |
10.96.0.0/12 | Service网段 Kubernetes的Service的虚拟IP段 |
在kubeadm init命令中通过选项--service-cidr设定。默认:"10.96.0.0/12" |
二、安装Kubernetes软件
1、操作系统设置
1、检查各Linux机器的IP地址与主机名是否正确(所有机器均需执行)
#检查操作系统
hostname; hostname -i
#若hostname不正确,可以通过以下命令设置。注意:每个节点的名字须不同
sudo hostnamectl set-hostname k8s-cp1
2、关闭SELinux(所有机器均需执行)
#将SELinux设置为permissive模式(相当于将其禁用),但重启后会恢复原状
sudo setenforce 0
#永久关闭
sudo sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
3、关闭Linux防火墙(所有机器均需执行)
#立即关闭Linux防火墙,并禁止下次开启自启
sudo systemctl disable --now firewalld
4、(可选)时间同步(所有机器均需执行)
#手工时间同步。 也可另配置为自动同步
sudo ntpdate ntp.aliyun.com
5、禁用Linux的swap交换区(所有机器均需执行)
因为:若节点开启了swap交换区,默认情况kubelet会启动失败(也可以保持swap开启,并通过在kubelet 配置文件中添加 failSwapOn: false,
或在命令行选项--fail-swap-on设置为false 来为了允许 Pod 使用交换区,避免启动失败)。
#立即禁用swap交换区,立即生效
sudo swapoff -a
#确认是否已无swap交换区
free -m
#永久禁用swap交换区。以root用户编辑vim /etc/fstab文件。注释掉带swap的那行
#/dev/mapper/vg_centos-swap swap swap defaults 0 0
5、查看当前Linux使用cgroup版本(所有机器均需执行)
cgroup是Linux内核提供的重要机制。在Linux中,各类容器化技术均使用cgroup实现资源限制。 cgroup有两个版本v1和v2。
Kubernetes对cgroup的v1和v2均能适配,因此v1和v2任选一种即可。高版本Kubernetes使用v1时,运行会有警告提示建议please migrate to cgroups v2,但不影响使用,可忽略提示。
#查看操作内核可支持的cgroup版本范围
#若输出为包含“cgroup”字样的一行,则表示只支持cgroup v1
#若输出为既又“cgroup”和“cgroup2”字样的两行,则表示既支持cgroup v1也支持v2
grep cgroup /proc/filesystems
#查看操作内核当前正使用的cgroup版本
#若输出为tmpfs,则表示当前正使用v1版。
#若输出为cgroup2fs,则表示当前正使用v2版。
stat -fc %T /sys/fs/cgroup/
2、安装容器运行时
Kubernetes通常选择containerd作为容器运行时。通常有两类方式安装containerd:
- 安装纯containerd容器运行时(推荐);
- 也可以:通过安装Docker Engine和cri-dockerd垫片(不推荐)
这些概念可参阅:区分CRI、OCI、containerd、Docker、CRI-O、runc等名词概念-CSDN博客
下文,以安装纯containerd容器运行时 为例进行说明
1、配置容器运行时所需的yum仓(所有机器均需执行)
# docker-ce和containerd都使用这个仓
# 因官方提供https://download.docker.com/linux/centos/docker-ce.repo的比较慢,因此以下改配置为国内阿里源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2、安装containerd并查看结果(所有机器均需执行)
#安装containerd
yum install -y containerd
#查看安装结果
containerd --help
3、修改或生成containerd配置文件(所有机器均需执行)
#在安装containerd时会自动生成/etc/containerd/config.toml配置文件
#但安装时生成的该文件中:配置了disabled_plugins = ["cri"],禁用cri方式访问,使得Kubernetes无法访问该运行时。
#因此通过以下命令重新生成并覆盖该配置文件
containerd config default > /etc/containerd/config.toml
3、containerd配置文件的镜像源(所有机器均需执行)
在/etc/containerd/config.toml配置文件中sandbox_image = "registry.k8s.io/pause:3.10"。因国内无法访问,所以需要修改国内源。修改该行内容后结果如下:
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6" |
在/etc/containerd/config.toml配置文件中搜索plugins."io.containerd.grpc.v1.cri".registry.mirrors并在这行内容下增加四行国内源mirrors配置:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint=["docker.m.daocloud.io", "docker.m.daocloud.io", "docker.m.daocloud.io"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"] endpoint=["registry.aliyuncs.com/google_containers"] |
增加四行配置后的结果如下红框(注意排版对齐):
4、启动containerd容器运行时(所有机器均需执行)
#立即运行容器运行时,并允许下次开启自启
systemctl enable --now containerd
3、安装Kubernetes软件
Kubernetes的Control控制平面与各个Node工作节点共同组成Kubernetes集群。Kubernetes主要有三类软件包:
软件包 | 用途简介 | 安装目标位置 |
---|---|---|
kubectl |
用于Kubernetes各个资源管理和控制,功能非常丰富。 是日常操作的主要工具 |
控制平面节点 |
kubelet |
它作为 “节点代理”部署在每个工作节点上。 在集群中每个工作节点上用来启动 Pod 和容器等 |
工作节点 |
kubeadm |
一个便捷的集群构建工具。 例如:初始化控制平面、节点并加入集群、升级Kubernetes版本等 |
工作节点 |
注:也可以每台机器(无论控制平面和工作节点)都安装以上三类软件包。
1、添加 Kubernetes 的yum仓(所有机器均需执行)
# 此操作会覆盖/etc/yum.repos.d/kubernetes.repo中现存的所有配置
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
EOF
特别注意:官网文档提供yum仓配置文件中还有exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni。 若repo文件中存在此设置,则后续在执行yum命令行时则必须带上--disableexcludes=kubernetes选项。 以上,已去掉exclude设置。
2、查看kubeadm可用版本:
sudo yum list --showduplicates --disableexcludes=kubernetes | grep kubeadm
3、在Control控制平面节点上,安装 kubeadm、kubectl和kubelet,并启用 kubelet 以确保它在启动时自动启动 :
sudo yum install -y kubeadm kubectl kubelet --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
#安装完毕后,查看软件版本号
kubeadm version
kubectl version
kubelet --version
注:kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。通过命令journalctl -xefu kubelet查看kubelet服务日志,此时会报:读取kubelet的config.yaml文件错误,这是正常的,待本节点加入集群后就不会再报此错误。
4、在各个Node工作节点上,安装 kubeadm 和 kubelet,并启用 kubelet 以确保它在启动时自动启动(在两台工作节点机器上执行):
sudo yum install -y kubeadm kubelet --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
#安装完毕后,查看软件版本号
kubeadm version
kubelet --version
注:kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。通过命令journalctl -xefu kubelet查看kubelet服务日志,此时会报:读取kubelet的config.yaml文件错误,这是正常的,待本节点加入集群后就不会再报此错误。
三、构建Kubernetes集群
1、Control Plane控制平面
1、在Kubernetes的Control控制平面上,执行初始化Kubernetes 控制平面节点:
# 初始化控制平面
# --apiserver-advertise-address:API 服务器所公布的其正在监听的IP地址。既控制平面节点IP。
# --control-plane-endpoint:为控制平面指定一个稳定的IP地址或DNS名称。适合控制节点有多个的场景。
# --image-repository:指定镜像源。默认值为“registry.k8s.io”,因在中国无法访问,因此需要改为国内源。
# --kubernetes-version:为控制平面选择一个特定的Kubernetes版本。默认值:"stable-1"
# --pod-network-cidr: 指定Pod网段。如果设置了这个参数,控制平面将会为每一个工作节点自动分配CIDR。
# --service-cidr:指定Service网段,Service的虚拟IP段
# --cri-socket:要连接的CRI Unix套接字的路径。如果为空,则kubeadm将尝试自动检测此值;仅当安装了多个CRI或具有非标准CRI套接字时,才显示通过此选项指定
kubeadm init \
--apiserver-advertise-address=192.168.43.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.32.3 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12
出现内容中含有“Your Kubernetes control-plane has initialized successfully!”这句话,则表示初始化成功:
2、在Kubernetes的Control控制平面上,根据初始化控制平面时的输出日志的提示的命令:
# 场景A:在控制平面节点上,若需普通用户也可以执行kubernetes相关命令。
# 则以该普通用户执行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 场景B:在控制平面节点上,需以root用户执行kubernetes相关命令。
# 则以root用户执行以下命令:
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" > ~/.bash_profile
source ~/.bash_profile
执行完毕后,才能成功使用例如kubectl get nodes等命令。
备注:以上init初始化会自动将控制平面节点以ROLES=control-plane的身份加入至集群中,因此,初始化后在控制平面节点机器上通过命令journalctl -xefu kubelet查看kubelet服务日志:不再报读取kubelet的config.yaml文件错误。
3、(推荐)配置命令行自动补全,便于日常操作:
# 利用kubectl completion生成Shell补全脚本内容,加载至用户Shell环境,实现自动补全
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
2、Node工作节点
4、在各个Node工作节点上执行以下命令,根据初始化控制平面时的输出日志的提示的命令,以root用户在工作节点上分别执行,将其加入至集群中(在两台工作节点机器上执行):
# 此命令来源于:初始化控制平面时的输出日志。
# join默认以工作节点身份加入集群。如指定选项--control-plane则表示以控制平面身份加入集群
# 以root用户,在工作节点上分别执行:
kubeadm join 192.168.43.100:6443 --token gve5bo.vfr5vj9axq2b6p0t \
--discovery-token-ca-cert-hash sha256:a656037572cf667fd1fc3f5f9d056b78436f3f3fc433869c63f3e0cf53eb348b
5、在Kubernetes的Control控制平面上,执行以下命令获取集群种当前各节点信息:
# 其中-o选项指定wide,以显示更多信息列
kubectl get nodes -owide
其中:get nodes各节点STATUS的状态刚开始时NotReady,最后变成Ready。
3、部署CNI网络插件Calico
对于Container Network Interface (CNI)有多种实现提供者,比如Flannel、Calico等。由于Calico比较出色,功能丰富,使用广泛。因此这里选择Calico作为CNI网络插件。
安装Calico有多种方式:Operator方式、Manifest方式、helm方式等,任选一种即可。 下面以Manifest方式为例进行安装过程说明。
1、在Kubernetes的Control控制平面上,下载清单文件calico.yaml,并将镜像源改为国内源:
#下载清单文件
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.29.3/manifests/calico.yaml
#将清单文件中默认的镜像源修改为国内源
sed -i 's/docker.io/docker.m.daocloud.io/' calico.yaml
2、在Kubernetes的Control控制平面上,编辑清单文件vim calico.yaml,将其中CALICO_IPV4POOL_CIDR配置注释放开,且网段值需要Kubernetes集群的pod-network-cid网段一致,修改后如下图:
3、在Kubernetes的Control控制平面上,apply清单文件calico.yaml:
kubectl apply -f calico.yaml
注:如果重装Calico,则需要先kubectl delete -f calico.yaml并清理环境:sudo rm -rf /etc/cni/net.d /var/lib/calico
执行完apply会自动下载容器镜像进行部署,约1~2分钟后,可以看到以下pods情况