200字
部署Kubernetes v1.32集群
2026-01-05
2026-01-05

部署Kubernetes v1.32集群

准备服务器环境

kubernetes的集群节点规划

主机名操作系统IP地址
k8s-masterdebian12 x64192.168.111.128
k8s-node1debian12 x64192.168.111.129
k8s-node2debian12 x64192.168.111.130

集群节点运行的组建

f1db784b9275aa722fabd7c4135e6e04.webp

系统初始化设置

关闭防火墙

[root@localhost ~]# systemctl stop nftables
[root@localhost ~]# systemctl disable nftables

关闭SELinux

#debian默认关闭SELinux

#rh系系统关闭SELinux
[root@localhost ~]# setenforce 0 #临时
[root@localhost ~]#  sed -i 's/enforcing/disabled/' /etc/selinux/config #永久

关闭Swap交换分区(Kubelet组建默认要求关闭)

[root@localhost ~]# swapoff -a 
[root@localhost ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab 

设置主机名

[root@localhost ~]# hostnamectl set-hostname  nodexxx

在master添加hosts

root@localhost ~]# cat >> /etc/hosts << EOF
192.168.111.128 k8s-master
192.168.111.129 k8s-node1
192.168.111.130 k8s-node2
EOF

配置内核参数

某些Kubernetes网络插件可能会用到网络桥接(Bridge)为了确保网络桥接的数据包经过Iptables/nftables处理 启用相关的内核参数:

[root@localhost ~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

替换apt源

[root@localhost ~]# cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份
timedatectl set-ntp true curl -o /etc/apt/sources.list https://mirrors.aliyun.com/sources.list/debian/sources.list.bookworm
[root@localhost ~]# apt update

时间同步

[root@localhost ~]# timedatectl set-ntp true

安装docker

在所有节点上安装并启动Docker

# 1. 装依赖
[root@localhost ~]# apt-get update
[root@localhost ~]# apt-get install -y ca-certificates curl gnupg lsb-release

# 2. 导入阿里云 Docker 官方 GPG 密钥
[root@localhost ~]# install -m 0755 -d /etc/apt/keyrings
[root@localhost ~]# curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
[root@localhost ~]# chmod a+r /etc/apt/keyrings/docker.gpg

# 3. 添加阿里云 Docker 源(Debian 12)
[root@localhost ~]# dist=$(lsb_release -cs)        # bookworm
[root@localhost ~]# echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian $dist stable" > /etc/apt/sources.list.d/docker.list

# 4. 安装指定版本(以 24.0.7 为例,可改成需要的号)
[root@localhost ~]# apt-get update
[root@localhost ~]# apt-get install -y docker-ce=5:24.0.7-1~debian.12~bookworm docker-ce-cli=5:24.0.7-1~debian.12~bookworm containerd.io

# 5. 写入 daemon.json(镜像加速 + systemd 驱动)
mkdir -p /etc/docker
[root@localhost ~]# cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors":["https://docker.ketches.cn","https://docker.1ms.run","https://hub1.nat.tf"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 6. 启动并设置开机自启
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start docker && systemctl enable docker

# 7. 验证
[root@localhost ~]# docker version && docker run --rm hello-world

安装cri-docker

在Kubernetes早期版本中,Docker作为默认容器运行时,并在Kubelet程序中开发了一个名为“Dockershim”的代理程序,负责Kubelet与Docker通信

cc5b7982bd1a24c97eb81426f462327b.webp

随着Kubernetes生态系统的发展,涌现出很多容器运行时,例如containerd、cri-o、rkt等,为了支持这些容器运行时,Kubernetes引入CRI(Container Runtime Interface,容器运行时接口)标准,使得第三方容器运行时只需要对接CRI即可与Kubernetes集成。

后来,在Kubernetes1.20版本发布同时宣布:为了优化核心代码,减少维护负担,将在1.24版本中正式移除“Dockershim”,而当时Docker又不支持CRI,这就意味着Kubernetes无法再Docker作为容器运行时。Docker官方为了解决这个问题,与Mirantis公司合作,开发了一个名为“cri-dockerd”的代理程序负责Kubelet与Docker通信。

083248c664b1f20ac7ae8fd48214c50b.webp

因此,从Kubernetes 1.24版本及更高版本开始,使用Docker作为容器运行时,需要安装cri-dockerd。可以在GitHub Releases页面(https://github.com/Mirantis/cri-dockerd/releases)找到适用于你系统平台版本的安装包,下载后上传到所有节点上并进行安装:

# 0. 准备:下载 Debian 版 cri-dockerd 包(示例 0.3.2)
root@localhost:~# wget https://mirrors.aliyun.com/docker-ce/linux/debian/pool/stable/amd64/cri-dockerd_0.3.2-3_amd64.deb
# 1. 安装 deb 包
root@localhost:~# dpkg -i cri-dockerd_0.3.2-3_amd64.deb
# 若提示缺少依赖,自动补装
root@localhost:~# apt-get install -f -y

安装完成后,修改Systemd服务文件指定依赖的Pause镜像为国内镜像地址:

root@localhost:~# vi /lib/systemd/system/cri-docker.service
# 找到 ExecStart 行,改成:
...
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
...

启动并设置开机启动:

root@localhost:~# systemctl daemon-reload
root@localhost:~# systemctl start cri-docker && systemctl enable cri-docker

确认状态:

root@localhost:~# systemctl status cri-docker
# 看到 active (running) 即完成

安装 Kubeadm和Kubelet

在所有节点上安装kubeadm、kubectl和kubelet组件。但这些软件包为包含在系统默认软件源中,需额外配置apt软件源,例如配置阿里云软件源:

root@localhost:~# cat > /etc/apt/sources.list.d/kubernetes.list << EOF
deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF

导入阿里云同步的Google公钥:

root@localhost:~# curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | gpg --dearmor -o /usr/share/keyrings/kubernetes-archive-keyring.gpg

安装指定版本kubeadm、kubectl和kubelet:

root@localhost:~# apt-get update
root@localhost:~# apt-get install -y kubeadm=1.32.0-00 kubectl=1.32.0-00 kubelet=1.32.0-00

kubeadm和kubectl仅是一个集群搭建工具和管理工具,不涉及启动。而kubelet是一个守护进程程序,由kubeadm在搭建过程中自动启动,这里设置开机启动即可:

root@localhost:~# systemctl enable kubelet

部署Master节点

在Master节点执行以下命令初始化Kubernetes管理节点:

root@localhost:~# kubeadm init \
  --apiserver-advertise-address=192.168.111.128 \
  --image-repository=registry.aliyuncs.com/google_containers \
  --kubernetes-version=v1.32.0 \
  --pod-network-cidr=10.244.0.0/16 \
  --service-cidr=10.96.0.0/12 \
  --cri-socket=unix:///var/run/cri-dockerd.sock \
  --ignore-preflight-errors=all

命令执行后,kubeadm会执行一系列任务,大概如下:

[preflight]:该阶段执行一系列检查,验证当前系统环境是否满足Kubernetes的安装要求,包括:
CPU和内存是否满足最低要求;
网络是否正常;
操作系统版本是否满足;
容器运行时是否可以连接;
内核参数是否正确配置;
下载所需的容器镜像。

[certs]:生成Kubernetes组件所需的HTTPS证书和秘钥,并存放到“/etc/kubernetes/pki”目录;

[kubeconfig]:生成kubeconfig文件,该文件包含API Server地址、客户端证书等信息,并存放到“/etc/kubernetes”目录。

[kubelet-start]:生成kubelet配置文件“/var/lib/kubelet/config.yaml”并启动kubelet服务。

[control-plane]:为kube-apiserver、kube-controller-manager和kube-scheduler创建静态Pod资源文件,并存储到“/etc/kubernetes/manifests”目录。

[etcd]:为etcd创建静态Pod资源文件,并存储到“/etc/kubernetes/manifests”目录。

[wait-control-plane]:等待kubelet从目录“/etc/kubernetes/manifest”中以静态Pod的形式启动Master组件。

[apiclient]:检查Master组件是否健康。

[upload-config]:将kubeadm配置存储到ConfigMap对象中。

[kubelet]:将kubelet配置存储到ConfigMap对象中。

[upload-certs]:提示用户跳过证书上传。

[mark-control-plane]:给Master节点添加标签和污点。

[bootstrap-token]:生成引导令牌,用于Node节点在加入集群时使用。

[kubelet-finalize]:更新kubelet配置文件(/etc/kubernetes/kubelet.conf)。

[addons]:安装CoreDNS和kube-proxy插件。

紧接着,输出初始化成功的信息:

9ed3c4daa5dfb2f69ed16b18dd6b3dcd.webp

根据上述提示,执行以下命令开始使用集群:

root@localhost:~# mkdir -p $HOME/.kube
root@localhost:~# sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
root@localhost:~# sudo chown $(id -u):$(id -g) $HOME/.kube/config

这些命令是将文件“/etc/kubernetes/admin.conf”复制到“$HOME/.kube/config”,以便kubectl根据该配置文件连接和管理Kubernetes集群。

部署Node节点

在两台工作节点执行上述返回的“kubeadm init”命令,并添加“--cri-socket”参数,以将这些工作节点加入到集群中:

root@localhost:~#  kubeadm join 192.168.111.128:6443 --token twrp53.v7dz7hjulwr4u10t --discovery-token-ca-cert-hash sha256:95341cb0152412e136b15176bec9daf9e728c504d7ee71a33a150b93e4634d17 --cri-socket=unix:///var/run/cri-dockerd.sock --ignore-preflight-errors=all

aa622edb4faf2e05087ae4003ca79e80.png

可以在Master节点执行“kubectl get nodes”命令查看节点,结果如下:

8eaf0b03cad719d6e635975927976f9e.png
两个工作节点已成功加入集群中。kubeadm默认根据主机名来设置节点名称,还可以添加“--node-name”参数自定义节点名称。

部署网络插件

在上述结果中,节点状态显示为“NotReady”,表示节点尚未准备就绪。这是由于kubelet服务未发现网络插件导致的,kubelet日志中也有相关说明(“network plugin is not ready”)。

Kubernetes网络插件主要用于实现集群内部Pod通信,它负责配置和管理Pod的网络。常见的网络插件包括Calico、Flannel、Cilium等,这里选择使用Calico作为Kubernetes网路插件,安装Calico网络插件:

root@localhost:~# kubectl create -f tigera-operator.yaml 
root@localhost:~# kubectl create -f custom-resources.yaml 

稍等一会,查看Pod对象:

root@localhost:~# kubectl get pods -n calico-system

0bac0313652affc6d6e61727a0193809.png

所有Pod的状态均显示为“Running”,说明Calico安装成功。再通过“kubectl get nodes”命令查看节点,状态转为“Ready”,表示节点准备就绪。

需要注意的是,Kubernetes考虑到安全性,“kubeadm join”命令中的Token有效期为24小时,过期后不可再使用。届时,可以通过“kubeadm token create --print-join-command”命令创建新的Token,以添加新的工作节点。

部署Dashboard

Dashboard是官方开发的一个Web管理系统,通过它可以管理集群资源、查看应用概览、查看容器日志和进入容器等操作。

下载Dashboard的资源文件:

root@localhost:~# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

将Service的类型设置为“NodePort”类型并指定访问端口,以便将其暴露到集群外部访问,修改如下:

root@localhost:~# vim recommended.yaml

7b0e3add6716f07d00a341d38afd9133.png

在集群中创建资源:

root@localhost:~# kubectl apply -f recommended.yaml

查看Pod对象:

root@localhost:~# kubectl get pods -n kubernetes-dashboard

8ccd7e7badfb1a4543259f6c6e54b0bd.png

所有Pod的状态都显示为“Running”,说明Dasboard安装成功。浏览器访问“https://<节点IP地址>:30001”,将看到登录界面。

304d39076edf5508db542db5941b36e0.png

root@localhost:~# kubectl create serviceaccount admin-user -n kubernetes-dashboard
#创建一个serviceaccount资源用户在kubernetes-dashboard名称空间下 名字是admin-user

root@localhost:~# kubectl create clusterrolebinding admin-user --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-user
#新建一个集群级角色绑定对象 对象名字叫admin-user 要绑定的角色是cluster-admin——K8s 内置的顶级管理员角色 绑定serviceaccount资源下的kubernetes-dashboard 命名空间下的 admin-user账号

根据服务账号创建Token:

root@localhost:~# kubectl create token admin-user -n kubernetes-dashboard

7dd6033db1f417133c59a0e9fcdb38e0.png

将输出的Token复制到输入框中,然后点击登录,进入到Dashboard首页。

db5b698907381a2d9680b7f2856bb569.png

9829782e202545cf0df74876d68565a0.png

到此已经安装完成

评论