背景介绍
Kubernetes(简称K8s)是一个开源的、用于自动化容器化应用程序部署、扩展和管理的系统。随着技术的不断发展,Kubernetes的版本也在不断更新,但网上大部分的Kubernetes安装教程仍然停留在较旧的版本上。这些教程中,容器运行时通常是以Docker为例,镜像源则多使用已经关闭的阿里云等国内镜像地址,且ServiceAccount的Secret通常是自动生成的。
然而,在最新的Kubernetes版本中,这些方面都发生了显著的变化。首先,从Kubernetes 1.20版本开始,官方已经逐步放弃对Docker的支持,默认容器运行时已经改为了containerd。这一变化旨在提高性能和安全性,因为containerd更轻量级,并且与Kubernetes集成更紧密。其次,由于各种原因,国内的一些镜像地址,包括阿里云、腾讯云以及各大高校提供的镜像源,已经全部关闭,这给国内用户在使用Kubernetes时带来了一定的不便。最后,在Kubernetes v1.24.0更新之后,创建ServiceAccount时不会自动生成Secret,需要手动创建,这一变更也需要注意。
因此,本文将详细介绍如何在最新的Kubernetes版本中,从零开始部署一个Kubernetes集群,并特别注意上述变化点。
准备开始
- 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。
- 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。
- 控制平面机器需要 CPU 2 核心或更多。
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
- 开启机器上的某些端口。请参见这里了解更多详细信息。
- 交换分区的配置。kubelet 的默认行为是在节点上检测到交换内存时无法启动。 更多细节参阅交换内存管理。
- 如果 kubelet 未被正确配置使用交换分区,则你必须禁用交换分区。 例如,
sudo swapoff -a
将暂时禁用交换分区。要使此更改在重启后保持不变,请确保在如/etc/fstab
、systemd.swap
等配置文件中禁用交换分区,具体取决于你的系统如何配置。
- 如果 kubelet 未被正确配置使用交换分区,则你必须禁用交换分区。 例如,
步骤详解
步骤1: 设置主机名和hosts文件
#查看本机hostname
hostname
若有重复的主机名使用下面命令进行修改
假设我们有以下三台机器:
- k8s-master: 172.16.196.23
- k8s-node1: 172.16.196.24
- k8s-node2: 172.16.196.25
在每台机器上修改主机名,并更新/etc/hosts
文件,使各节点可以相互通信。
# 在k8s-master上执行
hostnamectl set-hostname k8s-master
# 在k8s-node1上执行
hostnamectl set-hostname k8s-node1
# 在k8s-node2上执行
hostnamectl set-hostname k8s-node2
步骤2: 关闭swap分区
Kubernetes不支持开启swap分区的系统。关闭swap并注释掉/etc/fstab
中的swap条目以防止重启后swap重新启用。
swapoff -a # 临时禁用
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久禁用
步骤3: 添加Kubernetes仓库
创建一个名为 kubernetes.repo
的文件在 /etc/yum.repos.d/
目录下,并添加官方的Kubernetes YUM仓库。
cat <<EOF | sudo 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
步骤4: 安装Kubernetes三大件:kubeadm、kubelet 和 kubectl
在每台机器上安装以下的软件包:
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
如果要安装以前的版本,可以直接指定版本号,例如
sudo yum install