利用K8S技术栈打造个人私有云(连载之:K8S集群搭建)

利用K8S技术栈打造个人私有云(连载之:K8S集群搭建)

一、为什么选择K8S打造个人私有云?

在云计算技术快速发展的今天,容器化技术已成为构建现代应用架构的核心。Kubernetes(K8S)作为容器编排领域的标准,其优势体现在以下几个方面:

  1. 资源弹性与自动化
    K8S通过声明式API实现应用的自动扩缩容,例如使用Horizontal Pod Autoscaler(HPA)可根据CPU/内存指标动态调整副本数,避免资源浪费。

  2. 高可用与容灾能力
    通过多节点部署、Pod反亲和性配置及StorageClass动态卷管理,可构建跨主机、跨可用区的容错系统。例如,将数据库Pod分散部署在不同节点,避免单点故障。

  3. 生态整合与扩展性
    K8S生态包含Helm包管理、Operator框架及Service Mesh(如Istio),可快速集成监控、日志、CI/CD等工具链。例如,通过Prometheus Operator实现自动化监控配置。

  4. 成本优化
    相比虚拟机,容器密度更高,结合K8S的Resource Quotas和LimitRanges,可精细控制资源分配。例如,为测试环境分配较低的CPU/内存请求值。

二、K8S集群搭建前的环境准备

1. 硬件选型与资源规划

  • 节点角色划分

    • 控制平面节点:建议3节点(奇数)部署etcd、API Server、Controller Manager,避免脑裂。
    • 工作节点:根据负载需求配置CPU、内存及存储,例如每节点4核16G内存,支持20-30个Pod。
    • 存储节点:若需持久化存储,可配置独立节点部署Ceph或NFS Provisioner。
  • 网络拓扑设计

    • 使用VLAN或SDN(如Calico)隔离Pod网络与管理网络。
    • 示例拓扑:
      1. [管理网络] 192.168.1.0/24
      2. [Pod网络] 10.244.0.0/16
      3. [Service网络] 10.96.0.0/12

2. 操作系统与依赖安装

  • 基础系统要求

    • 推荐Ubuntu 22.04 LTS或CentOS 8,禁用Swap以避免调度问题。
    • 配置内核参数优化:
      1. # 修改/etc/sysctl.conf
      2. net.ipv4.ip_forward=1
      3. net.bridge.bridge-nf-call-iptables=1
  • 依赖工具安装

    • 安装Docker/containerd及K8S工具链:
      1. # Ubuntu示例
      2. sudo apt update && sudo apt install -y docker.io containerd kubeadm kubelet kubectl
      3. sudo systemctl enable docker containerd kubelet

三、K8S集群搭建核心步骤

1. 初始化控制平面

  • 使用kubeadm初始化

    1. sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
    2. --control-plane-endpoint="master.example.com:6443" \
    3. --apiserver-advertise-address=192.168.1.10
    • 参数说明:
      • --pod-network-cidr:指定Pod网络范围。
      • --control-plane-endpoint:高可用场景下配置VIP或负载均衡器地址。
  • 配置kubectl

    1. mkdir -p $HOME/.kube
    2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    3. sudo chown $(id -u):$(id -g) $HOME/.kube/config

2. 部署CNI网络插件

  • Calico部署示例
    1. kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
    • 验证网络连通性:
      1. kubectl get pods -n kube-system | grep calico
      2. kubectl run -it --rm debug --image=busybox --restart=Never -- sh
      3. # 在Pod内执行ping测试

3. 加入工作节点

  • 获取加入令牌
    1. kubeadm token create --print-join-command
    • 在工作节点执行输出命令,例如:
      1. kubeadm join 192.168.1.10:6443 --token abcdef.1234567890abcdef \
      2. --discovery-token-ca-cert-hash sha256:xxxxxx

4. 高可用控制平面配置(可选)

  • 使用kubeadm搭建HA集群
    1. 部署负载均衡器(如Nginx或HAProxy)。
    2. 在每个控制平面节点执行:
      1. kubeadm init --control-plane-endpoint="lb.example.com:6443" \
      2. --upload-certs
    3. 其他控制平面节点使用--control-plane--certificate-key参数加入。

四、集群验证与基础运维

1. 核心组件状态检查

  1. kubectl get componentstatuses # 检查API Server、Controller Manager等状态
  2. kubectl get nodes -o wide # 查看节点Ready状态及角色

2. 部署测试应用

  1. kubectl create deployment nginx --image=nginx:alpine
  2. kubectl expose deployment nginx --port=80 --type=NodePort
  3. kubectl get svc nginx # 获取NodePort端口

3. 日常运维命令

  • 日志查看
    1. kubectl logs -f <pod-name> -c <container-name>
  • 资源扩容
    1. kubectl scale deployment nginx --replicas=3
  • 节点维护
    1. kubectl drain <node-name> --ignore-daemonsets # 优雅驱逐Pod
    2. kubectl uncordon <node-name> # 恢复调度

五、常见问题与解决方案

  1. 节点状态NotReady

    • 检查kubelet日志:journalctl -u kubelet -f
    • 常见原因:网络不通、证书过期、资源不足。
  2. Pod一直Pending

    • 执行kubectl describe pod <pod-name>查看事件。
    • 典型原因:资源不足、持久卷绑定失败、调度策略限制。
  3. API Server无响应

    • 检查etcd集群健康度:ETCDCTL_API=3 etcdctl endpoint health
    • 验证负载均衡器配置是否正确。

六、总结与后续规划

本文详细介绍了K8S集群搭建的全流程,从环境准备到高可用配置,覆盖了生产级部署的关键要点。下一期将深入探讨如何基于K8S实现:

  • 持久化存储方案:对比Local PV、NFS、Ceph RBD的适用场景。
  • 监控告警体系:集成Prometheus+Grafana+Alertmanager。
  • CI/CD流水线:使用ArgoCD实现GitOps持续交付。

通过K8S技术栈,开发者可低成本构建具备企业级特性的个人私有云,为后续服务化改造奠定基础。