前言
Kubernetes 作为当前最流行的容器编排平台,已经成为企业级应用部署的标准。Rocky Linux 9.1 作为 CentOS 的优秀替代品,提供了稳定、安全的企业级 Linux 环境。本教程将详细介绍如何在 Rocky Linux 9.1 上从零开始部署一个完整的 Kubernetes 集群,包括 1 个 Master 节点和 2 个 Worker 节点,并提供详细的常见问题排错指南。
系统架构规划
硬件要求
Master 节点
: 2核 CPU, 4GB 内存, 40GB 硬盘
Worker 节点
: 2核 CPU, 4GB 内存, 40GB 硬盘
网络
: 所有节点之间网络互通,能够访问互联网
网络规划
Master 节点
: 192.168.1.100
Worker 节点 1
: 192.168.1.101
Worker 节点 2
: 192.168.1.102
Pod CIDR
: 10.244.0.0/16
Service CIDR
: 10.96.0.0/12
第一阶段:基础环境准备
1. 系统初始化配置
1.1 配置主机名
在每个节点上设置对应的主机名:
# Master 节点执行
hostnamectl set-hostname master
# Worker 节点1执行
hostnamectl set-hostname worker1
# Worker 节点2执行 # 查看日志 # 访问测试(在任意节点执行) # 或者使用 Worker 节点 IP 访问 # 2. 检查 kubelet 日志 # 3. 检查节点详细信息 # 4. 检查节点间网络连通性 # 或者重新配置 kubelet # 2. 查看容器日志 # 3. 检查镜像是否存在 # 4. 检查节点资源 # 如果是资源问题,调整资源限制 # 永久生效 # 或者修改 kubeadm 配置使用其他端口 # 2. 调整 Deployment 资源请求 # 3. 或者删除不必要的 Pod # 在 Worker 节点执行 # 清理网络配置 # 重新初始化 # 查看节点详细信息 # 查看系统 Pod # 查看资源使用 # 恢复 etcd 数据
hostnamectl set-hostname worker2
1.2 配置 hosts 解析
在所有节点上编辑
/etc/hosts
文件,添加集群节点信息:
cat >> /etc/hosts << EOF
192.168.1.100 master
192.168.1.101 worker1
192.168.1.102 worker2
EOF
1.3 关闭防火墙
Kubernetes 需要开放多个端口,为简化配置,生产环境建议按需开放,测试环境可直接关闭:
systemctl stop firewalld
systemctl disable firewalld
1.4 关闭 SELinux
SELinux 可能会干扰容器运行时的工作:
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
1.5 禁用 Swap
Kubernetes 要求必须关闭 swap:
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
1.6 配置内核参数
加载必要的内核模块并配置 sysctl 参数:
# 加载必要模块
cat <
worker2 Ready
第三阶段:部署应用验证集群
7. 部署测试应用
7.1 创建测试 Deployment
cat <
kubectl logs
# 获取 NodePort
NODE_PORT=$(kubectl get svc nginx-service -o jsonpath='{.spec.ports[0].nodePort}’)
curl http://$(hostname -I | awk ‘{print $1}’):$NODE_PORT
curl http://192.168.1.101:$NODE_PORT
第四阶段:常见问题排错指南
8. 常见问题及解决方案
8.1 节点状态为 NotReady
问题现象
:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 10m v1.28.2
worker1 NotReady
可能原因
:
网络插件未正确安装
CNI 配置错误
节点间网络不通
排查步骤
:
# 1. 检查网络插件 Pod 状态
kubectl get pods -n kube-flannel
journalctl -u kubelet -f
kubectl describe node worker1
ping worker1
解决方案
:
# 重新安装网络插件
kubectl delete -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
systemctl restart kubelet
8.2 Pod 无法启动,状态为 CrashLoopBackOff
问题现象
:
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-test-xxx 0/1 CrashLoopBackOff 5 3m
可能原因
:
镜像拉取失败
资源不足
应用配置错误
排查步骤
:
# 1. 查看 Pod 事件
kubectl describe pod
kubectl logs
docker images # 或 crictl images
kubectl top nodes
解决方案
:
# 如果是镜像问题,手动拉取
crictl pull nginx:1.24
kubectl patch deployment nginx-test -p ‘{“spec”:{“template”:{“spec”:{“containers”:[{“name”:”nginx”,”resources”:{“limits”:{“cpu”:”500m”,”memory”:”512Mi”}}}]}}}}’
8.3 kubeadm init 失败
问题现象
:
kubeadm init …
[ERROR FileContent–proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
解决方案
:
# 检查并设置内核参数
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
echo 1 > /proc/sys/net/ipv4/ip_forward
cat <
Type Reason Age From Message
—- —— —- —- ——-
Normal Pulling 2m kubelet Pulling image “nginx:1.24”
Warning Failed 2m kubelet Failed to pull image “nginx:1.24”: rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
解决方案
:
# 1. 配置镜像加速器
cat <
kubeadm init –apiserver-advertise-address=192.168.1.100 –apiserver-bind-port=6444
8.8 资源不足导致 Pod 调度失败
问题现象
:
kubectl describe pod
Type Reason Age From Message
—- —— —- —- ——-
Warning FailedScheduling 1m default-scheduler 0/3 nodes are available: 3 Insufficient cpu.
解决方案
:
# 1. 检查节点资源
kubectl top nodes
kubectl describe nodes
kubectl patch deployment nginx-test -p ‘{“spec”:{“template”:{“spec”:{“containers”:[{“name”:”nginx”,”resources”:{“requests”:{“cpu”:”50m”,”memory”:”64Mi”}}}]}}}}’
kubectl delete pod
如果遇到无法解决的问题,可以重置集群重新初始化:
# 在 Master 节点执行
kubeadm reset -f
kubeadm reset -f
ip link delete flannel.1
ip link delete cni0
kubeadm init …
第五阶段:集群维护与最佳实践
9. 日常维护命令
9.1 集群管理
# 查看集群信息
kubectl cluster-info
kubectl get nodes -o wide
kubectl get pods -n kube-system
9.2 资源监控
# 安装 metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl top nodes
kubectl top pods -A
9.3 备份与恢复
# 备份 etcd 数据
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.db \
–endpoints=https://127.0.0.1:2379 \
–cacert=/etc/kubernetes/pki/etcd/ca.crt \
–cert=/etc/kubernetes/pki/etcd/server.crt \
–key=/etc/kubernetes/pki/etcd/server.key
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot.db \
–data-dir=/var/lib/etcd-backup
10. 安全加固建议
10.1 RBAC 权限控制
# 创建最小权限 ServiceAccount
kubectl create serviceaccount limited-sa
kubectl create role limited-role –verb=get,list,watch –resource=pods
kubectl create rolebinding limited-binding –role=limited-role –serviceaccount=default:limited-sa
10.2 网络策略
# 创建网络策略示例
cat <