Kubernetes安装与集群构建详细过程

发布于:2025-04-14 ⋅ 阅读:(27) ⋅ 点赞:(0)

目录

一、环境准备

1、服务器准备

2、网段规划

二、安装Kubernetes软件

1、操作系统设置

2、安装容器运行时

3、安装Kubernetes软件

三、构建Kubernetes集群

1、Control Plane控制平面

2、Node工作节点

3、部署CNI网络插件Calico


序:

    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情况


网站公告

今日签到

点亮在社区的每一天
去签到