Rocky Linux 9.2 Kubernetes 部署完整指南
Rocky Linux 9.2 Kubernetes 部署完整指南
📋 环境信息
- 操作系统:Rocky Linux 9.2 (Minimal)
- 网络模式:NAT(访问外网)+ 仅主机(集群内部通信)
- 节点规划:
- Master:192.168.80.100(主机名 k8s-master)
- Worker1:192.168.80.110(主机名 k8s-worker1)
- Worker2:192.168.80.120(主机名 k8s-worker2)
- Kubernetes版本:v1.28.2
- 容器运行时:containerd (v2.3.3)
- 网络插件:Calico v3.28.0
- Dashboard版本:v2.7.0
一、系统初始化(所有节点执行)
1.1 设置主机名
# Masterhostnamectl set-hostname k8s-master&&bash# Worker1hostnamectl set-hostname k8s-worker1&&bash# Worker2hostnamectl set-hostname k8s-worker2&&bash1.2 配置 hosts 解析
cat>>/etc/hosts<<EOF 192.168.80.100 k8s-master 192.168.80.110 k8s-worker1 192.168.80.120 k8s-worker2 EOF1.3 设置免密登录(Master操作)
ssh-ssh-keygen#一路回车ssh-copy-id k8s-master ssh-copy-id k8s-worker1 ssh-copy-id k8s-worker21.4 更换国内 YUM 源(阿里云)
sed-e's|^mirrorlist=|#mirrorlist=|g'\-e's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g'\-i.bak/etc/yum.repos.d/[Rr]ocky*.repo dnf makecache1.5 关闭防火墙与 SELinux
systemctl disable--nowfirewalld setenforce0sed-i's/^SELINUX=enforcing$/SELINUX=disabled/'/etc/selinux/config1.6 关闭 Swap
swapoff-ased-ri's/.*swap.*/#&/'/etc/fstab1.7 加载内核模块
cat<<EOF|tee/etc/modules-load.d/k8s.confoverlay br_netfilter EOFmodprobe overlay modprobe br_netfilter1.8 配置内核参数
cat<<EOF|tee/etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOFsysctl--system1.9 配置时间同步(Chrony)
dnfinstall-ychronysed-i's/^pool.*/#&/'/etc/chrony.confecho"pool ntp1.aliyun.com iburst">>/etc/chrony.conf systemctl restart chronyd systemctlenablechronyd timedatectl set-timezone Asia/Shanghai二、安装容器运行时(containerd)所有节点执行
2.1 添加 Docker CE 源(containerd 源自此)
dnfinstall-yyum-utils yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo2.2 安装 containerd
dnfinstall-ycontainerd.io2.3 配置 containerd(关键步骤)
# 生成默认配置containerd config default>/etc/containerd/config.toml# 修改 pause 镜像为阿里云镜像(注意:新版配置位置是 pinned_images.sandbox)sed-i"s|sandbox = 'registry.k8s.io/pause:3.*'|sandbox = 'registry.aliyuncs.com/google_containers/pause:3.10'|g"/etc/containerd/config.toml# 启用 SystemdCgroupsed-i's/SystemdCgroup = false/SystemdCgroup = true/'/etc/containerd/config.toml# 重启 containerdsystemctl restart containerd systemctlenablecontainerd验证配置:
containerd config dump|grep-A2pinned_images# 应显示 sandbox = 'registry.aliyuncs.com/google_containers/pause:3.10'三、安装 Kubernetes 组件(所有节点)
3.1 添加阿里云 Kubernetes YUM 源
cat<<EOF|tee/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 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF3.2 安装 kubeadm、kubelet、kubectl
dnfinstall-ykubelet kubeadm kubectl--disableexcludes=kubernetes systemctlenablekubelet四、初始化集群(仅在 Master 节点)
4.1 预拉取镜像(可选,加速初始化)
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers4.2 初始化集群
kubeadm init\--apiserver-advertise-address=192.168.80.100\--image-repository=registry.aliyuncs.com/google_containers\--pod-network-cidr=192.168.0.0/16\--service-cidr=10.96.0.0/12保存输出中的 join 命令,稍后用于 Worker 节点加入。
4.3 配置 kubectl
mkdir-p$HOME/.kubesudocp/etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g)$HOME/.kube/config五、安装 Calico 网络插件(Master 节点)
5.1 安装 Tigera Operator
kubectl create-fhttps://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/tigera-operator.yaml5.2 创建 Installation 自定义资源(指定镜像仓库)
cat<<EOF|kubectl apply-f-apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: registry: quay.io calicoNetwork: ipPools: - blockSize: 26 cidr: 192.168.0.0/16 encapsulation: VXLANCrossSubnet natOutgoing: Enabled nodeSelector: all() --- apiVersion: operator.tigera.io/v1 kind: APIServer metadata: name: default spec: {} EOF5.3 如果 quay.io 拉取慢,改为 DaoCloud 加速
kubectl patch installation default--type='json'-p='[{"op": "replace", "path": "/spec/registry", "value": "docker.m.daocloud.io"}]'5.4 验证 Calico Pod 运行
kubectl get pods-ncalico-system-w# 等待所有 Pod 变为 Running六、加入 Worker 节点
在 Worker 节点执行之前保存的 join 命令,例如:
kubeadmjoin192.168.80.100:6443--token<token>--discovery-token-ca-cert-hash sha256:<hash>如果 token 过期,在 Master 上重新生成:
kubeadm token create --print-join-command七、验证集群
kubectl get nodes-owide kubectl get pods-A所有节点状态应为Ready。
八、部署 Kubernetes Dashboard(Master 节点)
8.1 安装 Dashboard(官方 YAML)
kubectl apply-fhttps://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml8.2 修改镜像为国内源(如果 Pod 出现 ImagePullBackOff)
kubectlsetimage deployment/kubernetes-dashboard-nkubernetes-dashboard\kubernetes-dashboard=docker.m.daocloud.io/kubernetesui/dashboard:v2.7.0 kubectlsetimage deployment/dashboard-metrics-scraper-nkubernetes-dashboard\dashboard-metrics-scraper=docker.m.daocloud.io/kubernetesui/metrics-scraper:v1.0.88.3 创建管理员用户并获取 Token
cat<<EOF|kubectl apply-f-apiVersion: v1 kind: ServiceAccount metadata: name: dashboard-admin namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: dashboard-admin roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: dashboard-admin namespace: kubernetes-dashboard EOF#执行以下命令生成一个永不过期(或长期有效)的 Token:(--duration=87600h 表示 10 年有效期,按需调整)kubectl create token-nkubernetes-dashboard dashboard-admin--duration=87600h8.4 访问 Dashboard
方式一:临时端口转发(仅限本机)
kubectl-nkubernetes-dashboard port-forward svc/kubernetes-dashboard8443:443# 浏览器访问 https://localhost:8443方式二:NodePort(允许外部访问)
kubectl patch svc kubernetes-dashboard-nkubernetes-dashboard-p'{"spec": {"type": "NodePort"}}'kubectl get svc-nkubernetes-dashboard kubernetes-dashboard# 获取 NodePort 端口(如 3xxxx),访问 https://<任意节点IP>:3xxxx登录时选择 Token,粘贴上一步生成的 Token。
九、常见问题及解决方案
9.1 containerd 拉取 pause 镜像失败
- 原因:新版 containerd 配置中 pause 镜像定义在
pinned_images.sandbox而非sandbox_image。 - 解决:使用
sed -i "s|sandbox = 'registry.k8s.io/pause:3.*'|sandbox = 'registry.aliyuncs.com/google_containers/pause:3.10'|g" /etc/containerd/config.toml修改,并重启 containerd。
9.2 Calico 镜像拉取失败
- 解决:使用
kubectl patch installation default --type='json' -p='[{"op": "replace", "path": "/spec/registry", "value": "docker.m.daocloud.io"}]'切换到 DaoCloud 镜像仓库。
9.3 Dashboard Pod ImagePullBackOff
- 解决:使用
kubectl set image指定国内镜像(如 DaoCloud 或阿里云镜像)。
9.4 端口 6443 被占用导致初始化失败
- 解决:
kill -9 <进程PID>杀掉占用进程,然后kubeadm reset -f清理后重新初始化。
9.5 Worker 节点 NotReady
- 原因:Calico 网络插件未成功部署或镜像拉取慢。
- 解决:检查
calico-nodePod 状态,如果镜像拉取失败,按 9.2 处理;如果卡在 Init,可删除 Pod 重建。
