Kubernetes 集群部署指南 (Rocky Linux 9.5)
以下是在三台 Rocky Linux 9.5 主机上部署 Kubernetes 集群的详细步骤。使用 kubeadm 工具来部署一个 1 master + 2 worker 的集群。
主机IP | 主机名 | 操作系统 | 角色 | CPU | 内存 | 硬盘 | Kubernetes组件 | 备注 |
---|---|---|---|---|---|---|---|---|
192.168.226.150 | k8s-master | Rocky Linux 9.5 | Master节点 | 2核 | 4GB | 30GB | kube-apiserver, kube-scheduler, kube-controller-manager, etcd | 控制平面节点 |
192.168.226.151 | k8s-node1 | Rocky Linux 9.5 | Worker节点 | 2核 | 4GB | 30GB | kubelet, kube-proxy, container runtime | 工作节点1 |
192.168.226.152 | k8s-node2 | Rocky Linux 9.5 | Worker节点 | 2核 | 4GB | 30GB | kubelet, kube-proxy, container runtime | 工作节点2 |
前置准备
所有节点通用配置 (在 150, 151, 152 上都执行)
设置主机名和 hosts 文件
# 在 192.168.226.150 上执行
hostnamectl set-hostname k8s-master && bash
# 在 192.168.226.151 上执行
hostnamectl set-hostname k8s-node1 && bash
# 在 192.168.226.152 上执行
hostnamectl set-hostname k8s-node2 && bash
# 所有节点编辑 /etc/hosts 文件,添加以下内容
cat >> /etc/hosts <<EOF
192.168.226.150 k8s-master
192.168.226.151 k8s-node1
192.168.226.152 k8s-node2
EOF
时间同步
# 安装 chrony
yum install -y chrony
# 备份原配置
cp /etc/chrony.conf /etc/chrony.conf.bak
# 配置使用中国国家授时中心服务器
sudo cat > /etc/chrony.conf <<EOF
server ntp.ntsc.ac.cn iburst
server cn.ntp.org.cn iburst
server ntp1.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
EOF
# 启动并设置开机自启
systemctl enable chronyd && sudo systemctl restart chronyd
# 查看同步状态
chronyc sources -v
chronyc tracking
# 添加定时任务
(crontab -l 2>/dev/null; echo "0 * * * * /usr/bin/chronyc makestep >/dev/null 2>&1") | crontab -
# 查看已配置的定时任务
crontab -l
关闭 SELinux 和防火墙
sed -i 's/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config
grep ^SELINUX= /etc/selinux/config # 应显示 "SELINUX=disabled"
systemctl stop firewalld
systemctl disable firewalld
# 建议执行完此步骤重启一次
reboot
关闭 swap
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
配置内核参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
配置 Docker CE 官方仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装 Docker CE
# 安装最新版本的 Docker CE
yum install -y docker-ce docker-ce-cli containerd.io
配置 Docker 并启动
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl enable docker && systemctl start docker
docker -v # 查看Docker版本
# Docker version 28.1.1, build 4eba377
启用Containerd 的 CRI 插件
# 备份原配置
mv /etc/containerd/config.toml /etc/containerd/config.toml.bak
# 生成默认配置并启用CRI插件
containerd config default | sudo tee /etc/containerd/config.toml
# 显式启用CRI(编辑配置文件)
sed -i 's/disabled_plugins.*/#disabled_plugins = []/' /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 替换镜像地址
sed -i 's|sandbox_image = .*|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"|' /etc/containerd/config.toml
# 重启服务
systemctl restart containerd
systemctl enable containerd
systemctl restart docker
添加 Kubernetes 仓库
cat <<EOF > /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
exclude=kubelet kubeadm kubectl
EOF
安装 kubelet, kubeadm 和 kubectl
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet
查看对应的版本号
# 查看 kubelet 版本
[root@k8s-master ~]# kubelet --version
Kubernetes v1.32.4
# 查看 kubeadm 版本
[root@k8s-master ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"32", GitVersion:"v1.32.4", GitCommit:"59526cd4867447956156ae3a602fcbac10a2c335", GitTreeState:"clean", BuildDate:"2025-04-22T16:02:27Z", GoVersion:"go1.23.6", Compiler:"gc", Platform:"linux/amd64"}
# 查看 kubectl 版本
[root@k8s-master ~]# kubectl version --client
Client Version: v1.32.4
Kustomize Version: v5.5.0
Master 节点配置 (仅在 192.168.226.150 上执行)
初始化 Kubernetes 集群
# 此步骤需要拉去镜像,需要等几分钟
kubeadm init \
--apiserver-advertise-address=192.168.226.150 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.32.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket unix:///var/run/containerd/containerd.sock
kubeadm init \
--apiserver-advertise-address=192.168.226.150 \ # Master节点API Server监听地址
--image-repository registry.aliyuncs.com/google_containers \ # 国内镜像仓库
--kubernetes-version v1.32.4 \ # 必须与已安装组件版本严格一致
--service-cidr=10.96.0.0/12 \ # Service网络CIDR(默认范围)
--pod-network-cidr=10.244.0.0/16 \ # Pod网络CIDR(需与CNI插件匹配)
--cri-socket unix:///var/run/containerd/containerd.sock # CRI运行时接口地址
给当前用户配置 kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
安装网络插件 (Calico)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
获取加入集群的命令
kubeadm token create --print-join-command
记下输出的 kubeadm join
命令,稍后在 worker 节点上使用。
Worker 节点配置 (在 192.168.226.151 和 192.168.226.152 上执行)
在每个 worker 节点上执行 master 节点初始化后输出的 kubeadm join
命令,例如:
kubeadm join 192.168.226.150:6443 --token 0x18ht.op2xhmpxg9dky92b --discovery-token-ca-cert-hash sha256:7be9e21e1deb5115f636dac684dae3a660d6a9ed0e5bf2a035fda5a0256e82fd
验证集群状态
回到 master 节点,执行以下命令验证集群状态:
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 23m v1.32.4
k8s-node1 Ready <none> 5m9s v1.32.4
k8s-node2 Ready <none> 5m3s v1.32.4
等待几分钟后,所有节点应显示为 Ready
状态。
给Node节点也配置 kubectl
# 192.168.226.151和192.168.226.152执行
mkdir -p $HOME/.kube
scp root@192.168.226.150:/etc/kubernetes/admin.conf ~/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
安装 Kubernetes Dashboard
安装 Kubernetes Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
创建 Dashboard 管理员用户
# 创建 ServiceAccount 的 YAML 配置
cat <<EOF | kubectl apply -f -
# 指定 Kubernetes API 版本
apiVersion: v1
# 定义资源类型为 ServiceAccount
kind: ServiceAccount
# 开始元数据定义
metadata:
# 设置 ServiceAccount 名称
name: admin-user
# 指定命名空间
namespace: kubernetes-dashboard
EOF
# 创建 ClusterRoleBinding 的 YAML 配置
cat <<EOF | kubectl apply -f -
# 指定 RBAC 授权 API 版本
apiVersion: rbac.authorization.k8s.io/v1
# 定义资源类型为 ClusterRoleBinding
kind: ClusterRoleBinding
# 开始元数据定义
metadata:
# 设置 ClusterRoleBinding 名称
name: admin-user
# 开始角色引用定义
roleRef:
# 指定 API 组
apiGroup: rbac.authorization.k8s.io
# 指定引用的角色类型
kind: ClusterRole
# 指定引用的角色名称
name: cluster-admin
# 开始绑定主体定义
subjects:
# 定义主体类型
- kind: ServiceAccount
# 指定主体名称
name: admin-user
# 指定主体命名空间
namespace: kubernetes-dashboard
EOF
创建传统Token Secret
# 创建token secret
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: admin-user-token
namespace: kubernetes-dashboard
annotations:
kubernetes.io/service-account.name: admin-user
type: kubernetes.io/service-account-token
EOF
访问 Dashboard
kubectl patch svc -n kubernetes-dashboard kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}'
# 获取token
kubectl -n kubernetes-dashboard create token admin-user
# 查看分配的端口
[root@k8s-master ~]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.101.86.20 <none> 8000/TCP 32s
kubernetes-dashboard NodePort 10.96.169.63 <none> 443:31351/TCP 32s
访问方式:https://任意K8S集群主机IP:端口
例如:https://192.168.226.150:31351/
备注:若看到不安全提示并无法弹出登陆页,键盘敲击 thisisunsafe
输入后会自动跳转登陆页
评论需开启科学上网!