最近在做企业私有云相关的技术预研,于是利用个人电脑上的虚拟化环境,完整搭建了一套 Kubernetes 实验集群,并逐步完善入口、负载均衡以及后续私有云组件。
本文主要记录 Kubernetes 集群搭建、MetalLB 负载均衡、Ingress 入口控制器部署过程,以及过程中遇到的一些问题和解决方案。整体架构图大致如下:

本次实验主要在本地虚拟化环境中完成,后续计划迁移到公司 vCenter 私有云环境中。
虚拟化环境:
集群节点规划如下:
节点 | IP | 角色 |
|---|---|---|
k8s-master | 192.168.2.97 | 控制节点 |
k8s-node1 | 192.168.2.98 | 工作节点 |
k8s-node2 | 192.168.2.99 | 工作节点 |
k8s-node3 | 192.168.2.100 | 工作节点 |

网络模式使用 桥接模式,确保虚拟机与局域网互通。
本次集群采用 kubeadm 方式进行部署。
整体步骤包括:
1、系统初始化
关闭 swap:
swapoff -a
加载必要内核模块:
modprobe br_netfilter
开启内核转发:
net.ipv4.ip_forward=1
2、安装 containerd
由于 Kubernetes 已经逐渐弃用 Docker,本次实验直接使用 containerd 作为容器运行时。
安装完成后生成配置文件:
containerd config default > /etc/containerd/config.toml
并配置国内镜像源,提高镜像拉取速度。
3、安装 Kubernetes 组件
安装以下组件:
初始化集群:
kubeadm init \
--pod-network-cidr=10.244.0.0/16
初始化完成后,将 kubeconfig 复制到当前用户目录:
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config
Kubernetes 集群默认没有网络能力,需要安装 CNI 插件。
本次选择 Calico:
kubectl apply -f calico.yaml
安装完成后查看节点状态:
kubectl get nodes

全部 Ready 即表示网络正常。
由于实验环境不是云环境,没有云厂商 LoadBalancer,因此需要使用 MetalLB。
MetalLB 是一个专门为裸机 Kubernetes 提供 LoadBalancer 功能的组件。
安装 MetalLB:
kubectl apply -f metallb-native.yaml
然后创建 IP 地址池:
apiVersion: metallb.io/v1beta1
kind:IPAddressPool
metadata:
name:metallb-ip-pool
namespace:metallb-system
spec:
addresses:
-192.168.2.100-192.168.2.120
创建 L2 广播配置:
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: metallb-l2
namespace: metallb-system
这样 MetalLB 就可以在局域网中分配 LoadBalancer IP。
为了实现统一入口,需要部署 Ingress Controller。
安装 ingress-nginx:
kubectl apply -f ingress-nginx.yaml
安装完成后查看 Pod:
kubectl get pod -n ingress-nginx
示例输出:
ingress-nginx-controller-xxxxx Running
然后创建 LoadBalancer 类型服务。

成功后 Kubernetes 会自动从 MetalLB 分配一个 IP,例如:
192.168.2.101
这个 IP 就是整个集群的统一入口地址。
在实验过程中也遇到了一些比较典型的问题。
例如:
1、containerd 拉取镜像失败
原因是默认访问国外镜像仓库,解决方法是配置国内镜像加速源(或者使用魔法)。
2、MetalLB IP 无法 ping 通
最开始只有部分节点可以 ping 通 LoadBalancer IP。
排查后发现主要原因是:
调整网络配置后恢复正常。
3、Ingress Controller 无法启动
一开始 Pod 一直处于 Pending 状态。
原因是镜像拉取失败,修改 containerd 镜像源后重新部署即可。
4、虚拟机内使用 “curl http://nginx.local”、“curl http://demo.local” 正常访问。但在虚拟机外的其他局域网设备无法访问,应该是 MetalLB 没有广播出来。请有了解的大佬留言区解惑一下,非常感谢。
目前实验环境的整体结构如下:

基本具备一个 完整 Kubernetes 平台的基础能力。
接下来准备继续完善整个私有云平台,主要包括:
1、分布式存储
计划部署 Longhorn 或 Ceph,实现 Kubernetes 持久化存储。
2、监控系统
部署:
实现集群监控。
3、日志系统
考虑部署:
实现日志集中管理。
4、CI/CD 平台
后续计划结合 GitLab 和 ArgoCD,实现自动化部署。
通过这次实验,从零开始搭建了一套 Kubernetes 集群,并逐步补齐了网络和入口组件。
虽然只是一个实验环境,但整个架构已经接近企业私有云的基础形态。后续计划将该架构迁移到公司 vCenter 私有云环境中继续完善。