实验目的
本实验旨在通过 Kubeadm 工具快速部署一个 Kubernetes 1.28.2 集群,包含 1 个 Master 节点和 2 个 Worker 节点,并验证集群的基本功能。实验涉及以下关键步骤:
-
环境准备:配置主机名、关闭防火墙、禁用 SELinux、设置时区、关闭 Swap 等。
-
安装 Docker:使用高版本 Docker(27.3.1)并配置镜像加速。
-
安装 CRI-Docker:解决 Kubernetes 1.28+ 对 Docker 的支持问题。
-
部署 Kubernetes:通过
kubeadm
初始化 Master 节点并加入 Worker 节点。 -
安装网络插件:使用 Flannel 提供 Pod 网络通信。
拓扑图
主机名 | ip | 硬件最低要求 |
master | 10.1.1.85 | 2核,2G |
node1 | 10.1.1.86 | 1核,1G |
node2 | 10.1.1.79 | 1核,1G |
配置步骤
前期准备(三台机子都需要,所以可以克隆)
(1)修改主机名
hostnamectl set-hostname xxx
exec bash
为了避免做dns,在/etc/hosts 文件中记录主机名
(2)关闭防火墙,安装iptables
systemctl stop firewalld
systemctl disable firewalld
(3)安装iptables
yum -y install iptables-services
各节点启动
systemctl start iptables
清空规则
iptables -F
开机启动
systemctl enable iptables
(4)禁用selinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
(5) 设置时区
timedatectl set-timezone Asia/Shanghai
(6)关闭 swap 分区
swapoff -a
sed -i 's:/dev/mapper/rl-swap:#/dev/mapper/rl-swap:g' /etc/fstab
(7) 安装 ipvs
yum install -y ipvsadm ipset
(8)加载 bridge
yum install -y epel-release
yum install -y bridge-utils
modprobe br_netfilter
echo 'br_netfilter' >> /etc/modules-load.d/bridge.conf
echo 'net.bridge.bridge-nf-call-iptables=1' >> /etc/sysctl.conf
echo 'net.bridge.bridge-nf-call-ip6tables=1' >> /etc/sysctl.conf
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p
(9)添加 docker-ce yum 源
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
(10)安装docker(27.3.1)
yum -y install docker-ce
注:不一定是这个版本,只是提醒一下,我们安装的docker 是高版本;
如果下面不想使用cri-docker ,安装的docker 版本不要高于20.10,因为kubeadm-1.23.6 不支持太高的版本;
(11) 配置 daemon.json 重要的是配置源
配置docker守护进程,创建docker服务目录
cat > /etc/docker/daemon.json << EOF { "data-root": "/data/docker", "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "100" }, "registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.hcp.cloud", "https://docker.unsee.tech", "https://docker.ipanel.live", "http://mirrors.ustc.edu.cn", "https://docker.chenby.cn", "http://mirror.azure.cn", "https://dockerpull.org", "https://dockerhub.icu", "https://hub.rat.dev" ] } EOF |
mkdir -p /etc/systemd/system/docker.service.d
(12) 重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
(13)上传CRI-Docker插件
(或者通过命令下载wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri dockerd-0.3.9.amd64.tgz)
下面是我的飞书资源下载链接
(14)解压CRI-Dockerd插件,将解压后的cri-dockerd可执行文件复制到/usr/bin/目录,并设置执行权限
tar -xf cri-dockerd-0.3.9.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/bin/
chmod +x /usr/bin/cri-dockerd
(15)配置CRI-Docker服务文件
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.service [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.8 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 |
(16)添加 cri-docker 套接字,创建CRI-Docker socket文件
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket [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 EOF |
(17)重新加载systemd守护进程,启用CRI-Docker服务,启动该服务,并检查服务是否处于活动状态。
systemctl daemon-reload
systemctl enable cri-docker
systemctl start cri-docker
systemctl is-active cri-docker
(18)添加 kubeadm yum 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF |
(19)安装kubernetes 1.28.2
yum install -y kubelet-1.28.2 kubectl-1.28.2 kubeadm-1.28.2 这个只是告知怎么在安装的过程中选择版本
yum -y install kubelet kubeadm kubeadm
systemctl enable kubelet.service
kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点 或初始化为 master 后才可启动成功。
以上的内容三台都要做;所以偷懒的办法就是,做好一台克隆2个,改ip,改主机名就行。
在master节点的操作
(1)生成默认的初始化配置文件init-config.yaml
kubeadm config print init-defaults > init-config.yaml
(2)编辑配置文件
vi init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 10.1.1.85 bindPort: 6443 nodeRegistration: criSocket: unix:///var/run/cri-dockerd.sock imagePullPolicy: IfNotPresent name: master taints: null --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} etcd: local: dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: 1.28.2 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 podSubnet: 10.244.0.0/16 scheduler: {} |
(3)列出初始化集群所需的镜像并拉取
kubeadm config images list --config=init-config.yaml
kubeadm config images pull --config=init-config.yaml
注:如果下载镜像失败,尝试手动下载;举例如下:
ctr -n k8s.io images pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.0
(4)初始化K8S集群
kubeadm init --config=init-config.yaml
(5)创建.kube目录,复制管理员配置文件,修改文件权限
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
(6)将各节点加入到集群(注意要修改成自己的节点信息,初始化集群时可以看到)
kubeadm join 10.1.1.85:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:15612baa3473388167c8ff2ca2ff06474909c9f1329d84e68f2966299347a62c \
--cri-socket unix:///var/run/cri-dockerd.sock
(7)查看集群中的节点状态
kubectl get nodes
(8)上传flannel网络插件(也可以用下面的命令下载)
(9)部署Pod网络
wget -L https://github.com/flannel-io/flannel/releases/latest/download/kube flannel.yml
kubectl apply -f kube-flannel.yml
(使用kubectl get nodes查看集群中的节点状态,确认所有节点都已加入并处于Ready状态。使用kubectl get pods -n kube-system查看kube-system命名空间下的Pod状态,确认所有Pod都在运行
kubectl get nodes -o wide
kubectl get pod -n kube-system
至此,通过Kubeadm快速安装Kubernetes集群已经完成。
实验结论
本实验通过标准化流程完成了 Kubernetes 集群的快速部署,验证了集群的基本功能(节点管理、网络通信)。实验过程中遇到的典型问题(如运行时兼容性、镜像拉取)通过替换组件和配置镜像源解决,为后续深入学习 Kubernetes 运维和开发奠定了基础。