一、为何选择K8S技术栈搭建私有云?
Kubernetes(K8S)作为容器编排领域的标准,其核心价值体现在自动化部署、弹性伸缩、服务发现与自愈能力。对于个人开发者而言,K8S技术栈能解决传统私有云方案的三大痛点:
- 资源利用率低:通过Pod动态调度与水平扩展,避免物理机闲置资源浪费。例如,测试环境与开发环境可共享同一节点,按需分配CPU/内存。
- 维护成本高:声明式API与Operator模式将运维操作转化为代码,如通过Prometheus Operator自动配置监控规则,减少人工干预。
- 扩展性受限:K8S的Control Plane与Data Plane分离架构,支持从单节点到数千节点的无缝扩展,满足个人项目到小型团队的需求。
典型场景:开发者可通过K8S的Ingress资源统一管理多个Web服务的域名路由,结合HPA(Horizontal Pod Autoscaler)实现流量突增时的自动扩容。
二、私有云需求分析与技术选型
1. 需求拆解
- 核心功能:容器化应用部署、持久化存储、网络隔离、日志收集、监控告警。
- 非功能需求:高可用(节点故障时自动迁移)、低延迟(同城双活部署)、易用性(提供Web控制台)。
2. 技术栈对比
| 组件 | 候选方案 | 选型依据 |
|---|---|---|
| 容器运行时 | Docker vs containerd | containerd更轻量,与K8S集成度更高,符合CRI标准 |
| 网络插件 | Calico vs Flannel | Calico支持网络策略,适合多租户隔离场景 |
| 存储方案 | Local PV vs CSI插件 | CSI插件(如NFS-CSI)支持动态卷供应,避免手动管理存储类 |
| 监控系统 | Prometheus+Grafana | 开源生态完善,支持自定义指标与告警规则 |
3. 硬件配置建议
- 最小化部署:1台4核8G服务器(测试环境),安装Ubuntu 22.04 LTS + kubeadm。
- 生产环境:3台2核4G服务器(1主2从),配置SSD硬盘与千兆网卡,使用Keepalived实现VIP高可用。
三、基础环境搭建指南
1. 节点初始化
# 所有节点执行(关闭swap,设置主机名)sudo swapoff -asudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstabhostnamectl set-hostname k8s-master # 主节点hostnamectl set-hostname k8s-worker1 # 从节点
2. 安装容器运行时(containerd)
# 安装依赖与containerdsudo apt-get updatesudo apt-get install -y containerd apt-transport-https ca-certificates curl# 配置containerd(使用systemd cgroup驱动)sudo mkdir -p /etc/containerdcontainerd config default | sudo tee /etc/containerd/config.tomlsudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.tomlsudo systemctl restart containerd
3. 部署K8S集群(kubeadm)
# 主节点初始化sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.28.0mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config# 从节点加入集群kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash>
4. 部署网络插件(Calico)
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml# 验证Pod网络kubectl get pods -n kube-system | grep calico
四、验证集群功能
-
部署测试应用:
kubectl create deployment nginx --image=nginx:alpinekubectl expose deployment nginx --port=80 --type=NodePortkubectl get svc nginx # 获取NodePort端口
-
检查节点状态:
kubectl get nodes# 输出应显示所有节点为Ready状态NAME STATUS ROLES AGE VERSIONk8s-master Ready control-plane 10m v1.28.0k8s-worker1 Ready <none> 9m v1.28.0
-
模拟故障转移:
- 手动终止主节点上的
kube-apiserver容器,观察从节点是否自动选举新主节点(需配置--control-plane-endpoint)。
五、常见问题与解决方案
-
问题:
kubeadm init卡在[etcd]阶段。- 原因:磁盘I/O性能不足或网络延迟高。
- 解决:更换SSD硬盘,或调整
etcd的heartbeat-interval和election-timeout参数。
-
问题:Calico Pod无法启动,日志显示
Failed to create pod sandbox。- 原因:CNI插件配置错误或内核模块缺失。
- 解决:检查
/etc/cni/net.d/目录下的配置文件,确保bridge与host-local插件已安装。
六、下一步规划
本篇为系列连载的初章,后续将深入探讨:
- 存储方案:对比Rook-Ceph与Longhorn的优劣,实现有状态应用持久化。
- CI/CD集成:通过ArgoCD实现GitOps,自动化部署流水线。
- 安全加固:配置RBAC权限、网络策略与镜像签名,满足合规要求。
通过K8S技术栈构建个人私有云,开发者不仅能获得对基础设施的完全控制权,更能积累云原生技术的实战经验,为后续参与企业级项目奠定基础。