K8s/Kubernetes(v1.23.17)三节点集群部署全过程的总结与问题回顾
Kubernetes(v1.23.17)三节点集群部署全过程的总结与问题回顾
一、总体目标
本次目标是在 本地三台 CentOS 7 虚拟机 上搭建一个 Kubernetes v1.23.17 集群,实现:
- 1 个 Master 节点(控制面)
- 2 个 Worker 节点(计算节点)
- 集群内 Pod 网络互通(Flannel)
- Service 暴露并通过浏览器访问(NodePort)
二、安装阶段主要步骤
1. 环境准备
-
系统:CentOS 7 (3.10.0 内核)
-
容器:Docker 20.10.9
-
安装 kubeadm、kubelet、kubectl 三件套
-
设置内核转发参数:
cat <<EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 EOF sysctl --system -
关闭防火墙与 swap:
systemctl disable --now firewalld swapoff -a sed -ri 's@(^[^#].*\s+swap\s+)@#\1@' /etc/fstab
三、Master 初始化
命令:
kubeadm init \
--apiserver-advertise-address=192.168.232.101 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.23.17 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=172.20.0.0/16
关键点与问题:
-
第一次报错:manifest already exists
- 原因:之前初始化过,需要清理旧文件。
- 解决:
kubeadm reset -f && rm -rf /etc/kubernetes/manifests/*
-
成功初始化后运行:
export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl get nodes
四、网络插件(Flannel)
问题与解决:
-
curl 无法访问 GitHub raw
-
解决:换国内代理源
curl -fsSL https://mirror.ghproxy.com/https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml -O -
修改
Network为与--pod-network-cidr一致:sed -i 's#10.244.0.0/16#172.20.0.0/16#' kube-flannel.yml kubectl apply -f kube-flannel.yml -
Worker 节点 Flannel 启动失败 (pause 镜像下载失败)
-
解决:
kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
五、Worker 节点加入集群
常见错误:
| 报错信息 | 原因 | 解决 |
|---|---|---|
config.yaml not found | 上次 join 残留 | 执行 kubeadm reset -f 并清理 /var/lib/kubelet |
User "system:anonymous" cannot get cluster-info | cluster-info 没授权匿名读 | Master 上执行: kubeadm init phase bootstrap-token |
User "system:bootstrap:xxx" cannot get kubeadm-config | bootstrap 组权限不足 | 执行: kubectl create rolebinding kubeadm:kubeadm-config-reader --role=kubeadm:kubeadm-config-reader --group=system:bootstrappers:kubeadm:default-node-token -n kube-system |
configmaps kubelet-config-1.23 not found | 缺失默认配置 | Master 执行: kubeadm init phase upload-config kubeadm kubeadm init phase upload-config kubelet |
🔧 六、验证网络连通性
-
所有节点 Flannel 与 kube-proxy 都应为 Running:
kubectl -n kube-flannel get pods -o wide kubectl -n kube-system get pods -l k8s-app=kube-proxy -o wide -
所有节点状态:
kubectl get nodes -o wide均为
Ready即网络通畅。
七、Service 暴露与浏览器访问
1. 创建示例应用
kubectl create deployment web --image=nginx:1.25
2. 暴露服务为 NodePort
kubectl expose deployment web --port=80 --type=NodePort
3. 查看 NodePort
kubectl get svc web -o wide
# 例如:PORT(S)=80:31759/TCP
4. 在浏览器访问:
http://192.168.232.102:31759
成功看到 NGINX 欢迎页,说明集群可从外部访问。



🧾 八、最终验证清单
| 检查项 | 命令 | 结果 |
|---|---|---|
| 集群健康 | kubectl get nodes | 所有节点 Ready |
| 控制面健康 | kubectl get pods -n kube-system | 全 Running |
| 网络插件 | kubectl get pods -n kube-flannel | 全 Running |
| 服务访问 | 浏览器 http://节点IP:NodePort | 页面可打开 |

九、最终状态
| 节点 | IP | 角色 | 状态 |
|---|---|---|---|
| k8s-master | 192.168.232.101 | master | Ready |
| k8s-worker02 | 192.168.232.102 | worker | Ready |
| k8s-worker03 | 192.168.232.103 | worker | Ready |

