从零搭建K8S集群:打造个人私有云的技术基石

从零搭建K8S集群:打造个人私有云的技术基石

一、为何选择K8S构建个人私有云?

在数字化转型浪潮中,个人开发者对资源管理的需求已从单点应用升级为需要弹性伸缩、服务自愈的分布式系统。Kubernetes(K8S)作为容器编排领域的标准,其核心价值体现在三个方面:

  1. 资源利用率最大化:通过动态调度将应用负载均衡至多节点,避免硬件闲置
  2. 服务高可用保障:内置的健康检查、自动重启机制确保服务连续性
  3. 基础设施标准化:统一的API接口实现跨云、跨机的应用部署

以笔者实际场景为例,在搭建个人媒体服务器时,通过K8S将转码、存储、访问三个服务解耦部署,使CPU利用率从30%提升至75%,同时实现故障节点自动迁移。

二、环境准备:硬件与软件选型指南

2.1 硬件配置建议

组件 最低配置 推荐配置
控制节点 2核4G+50G磁盘 4核8G+100G NVMe SSD
工作节点 2核4G+50G磁盘 4核16G+200G 机械盘(存储型)

关键考量

  • 控制节点需预留足够内存供etcd使用(每1000节点约需1GB内存)
  • 工作节点建议采用异构配置,区分计算型(高CPU)和存储型(大容量磁盘)

2.2 软件环境清单

  1. # 系统要求(以Ubuntu 22.04为例)
  2. $ cat /etc/os-release
  3. PRETTY_NAME="Ubuntu 22.04.3 LTS"
  4. # 必备组件版本
  5. CONTAINERD_VERSION=1.7.3
  6. KUBERNETES_VERSION=1.28.4
  7. CNI_PLUGINS_VERSION=1.4.0

版本兼容性原则

  • 遵循N-2版本策略(如使用K8S 1.28时,容器运行时最高支持1.26的兼容版本)
  • 避免混合使用不同发行版的组件(如CentOS的kubelet与Ubuntu的kubectl)

三、集群搭建三阶段实施

3.1 控制平面部署(以kubeadm为例)

  1. # 1. 初始化控制节点
  2. sudo kubeadm init --kubernetes-version v1.28.4 \
  3. --pod-network-cidr=10.244.0.0/16 \
  4. --service-cidr=10.96.0.0/12 \
  5. --apiserver-advertise-address=<控制节点IP>
  6. # 2. 配置kubectl
  7. mkdir -p $HOME/.kube
  8. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  9. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  10. # 3. 安装网络插件(以Calico为例)
  11. kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/calico.yaml

关键参数解析

  • --pod-network-cidr:必须与CNI插件配置一致,否则会导致Pod无法通信
  • --service-cidr:需避开本地网络段,建议使用RFC1918私有地址

3.2 工作节点加入集群

  1. # 在控制节点获取加入命令
  2. kubeadm token create --print-join-command
  3. # 在工作节点执行(示例输出)
  4. sudo kubeadm join 192.168.1.100:6443 --token abcdef.1234567890abcdef \
  5. --discovery-token-ca-cert-hash sha256:xxxxxx

常见问题处理

  • 证书过期:使用kubeadm certs renew all更新证书
  • 节点状态NotReady:检查kubectl get nodes并查看kubectl describe node <节点名>中的Conditions

3.3 存储方案配置

3.3.1 本地存储配置

  1. # 创建StorageClass示例
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5. name: local-storage
  6. provisioner: kubernetes.io/no-provisioner
  7. volumeBindingMode: WaitForFirstConsumer

3.3.2 分布式存储部署(以Longhorn为例)

  1. # 1. 添加Helm仓库
  2. helm repo add longhorn https://charts.longhorn.io
  3. # 2. 部署Longhorn
  4. helm install longhorn longhorn/longhorn \
  5. --namespace longhorn-system \
  6. --create-namespace \
  7. --set defaultSettings.defaultDataLocality=best-effort

存储选型建议

  • 单节点测试:使用hostPathlocal存储类
  • 多节点生产:优先考虑CSI驱动的分布式存储(如Ceph、Longhorn)

四、高可用强化方案

4.1 控制平面高可用

  1. # 使用kubeadm部署HA控制平面
  2. # 1. 在各控制节点安装keepalived和haproxy
  3. # 2. 初始化首个控制节点时指定VIP
  4. sudo kubeadm init --control-plane-endpoint "<VIP>:6443" \
  5. --upload-certs
  6. # 3. 其他控制节点加入时添加证书
  7. sudo kubeadm join <VIP>:6443 --token abcdef.1234567890abcdef \
  8. --control-plane --certificate-key xxxxxxx

4.2 etcd集群优化

  1. # etcd静态Pod配置示例
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: etcd
  6. namespace: kube-system
  7. spec:
  8. containers:
  9. - name: etcd
  10. image: registry.k8s.io/etcd:3.5.9-0
  11. command:
  12. - etcd
  13. - --advertised-client-urls=https://<本机IP>:2379
  14. - --listen-client-urls=https://0.0.0.0:2379
  15. - --initial-cluster-token=k8s-etcd-cluster
  16. - --initial-cluster=<节点1>=https://<IP1>:2380,<节点2>=https://<IP2>:2380
  17. volumeMounts:
  18. - mountPath: /var/lib/etcd
  19. name: etcd-data
  20. volumes:
  21. - name: etcd-data
  22. hostPath:
  23. path: /var/lib/etcd
  24. type: DirectoryOrCreate

性能调优参数

  • --quota-backend-bytes=8G:默认1.6GB在大型集群中易触发OOM
  • --snapshot-count=10000:减少快照频率提升写入性能

五、验证与监控体系搭建

5.1 基础功能验证

  1. # 1. 部署测试Pod
  2. kubectl create deployment nginx --image=nginx:alpine
  3. # 2. 验证服务暴露
  4. kubectl expose deployment nginx --port=80 --type=NodePort
  5. # 3. 检查访问
  6. curl http://<任意节点IP>:<NodePort>

5.2 监控栈部署(Prometheus+Grafana)

  1. # 使用kube-prometheus-stack快速部署
  2. helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
  3. helm install prometheus prometheus-community/kube-prometheus-stack \
  4. --namespace monitoring \
  5. --create-namespace \
  6. --set prometheus.prometheusSpec.retention=30d

关键监控指标

  • 节点级别:node_cpu_utilisationnode_memory_MemAvailable_bytes
  • 集群级别:kube_pod_status_readyetcd_server_leader_changes_seen_total

六、常见问题解决方案

6.1 Pod长时间处于ContainerCreating状态

排查流程

  1. 检查CNI插件日志:journalctl -u kubelet -n 100 --no-pager
  2. 验证网络命名空间:ls /var/run/netns/
  3. 检查镜像拉取权限:kubectl describe pod <pod名> | grep -i image

6.2 API Server响应超时

优化措施

  • 调整--default-not-ready-toleration-seconds--default-unreachable-toleration-seconds参数(默认5分钟)
  • 增加--kube-api-qps--kube-api-burst值(默认5/10)

七、进阶优化建议

  1. 资源配额管理

    1. apiVersion: v1
    2. kind: ResourceQuota
    3. metadata:
    4. name: compute-quota
    5. namespace: dev
    6. spec:
    7. hard:
    8. requests.cpu: "4"
    9. requests.memory: 8Gi
    10. limits.cpu: "8"
    11. limits.memory: 16Gi
  2. 节点亲和性调度

    1. affinity:
    2. nodeAffinity:
    3. requiredDuringSchedulingIgnoredDuringExecution:
    4. nodeSelectorTerms:
    5. - matchExpressions:
    6. - key: kubernetes.io/arch
    7. operator: In
    8. values: ["amd64"]
  3. 动态卷扩容

    1. # 为StorageClass启用扩容
    2. kubectl patch storageclass longhorn \
    3. --type='json' \
    4. -p='[{"op": "replace", "path": "/allowVolumeExpansion", "value": true}]'

通过上述系统化的搭建流程和优化方案,读者可构建出具备生产级特性的K8S集群。实际部署时建议先在虚拟机环境中验证所有组件,再迁移至物理机。下一期将深入探讨如何基于该集群部署持续集成系统,实现代码到容器的自动化交付。