从单机到集群:Docker与K8s协同部署实战指南

作者:狼烟四起2026.07.04 08:16浏览量:0

简介:本文面向运维人员与开发者,详解Docker与K8s的部署逻辑与协同实践。通过“外卖店运营”类比,阐明Docker解决单机环境标准化问题,K8s实现集群资源智能调度,并给出从环境准备到运维优化的完整部署方案。

一、部署目标与适用场景

核心目标:通过Docker实现应用标准化封装,借助K8s构建高可用、弹性扩展的容器化集群,最终实现开发环境与生产环境的高度一致性,以及业务流量的智能调度。

适用场景:

  • 微服务架构应用部署
  • 高并发业务场景(如电商大促、直播互动)
  • 混合云环境下的资源调度
  • 需要快速扩容的突发流量业务
  • 跨地域多可用区部署需求

典型用户画像:

  • 3年以上经验的运维工程师
  • 负责生产环境部署的架构师
  • 需要管理多套环境的技术负责人
  • 实施DevOps流程的研发团队

二、架构组件拆解

1. Docker核心组件

  • 镜像(Image):包含应用代码、依赖库、环境变量的只读模板
  • 容器(Container):镜像的运行实例,具备独立进程空间和网络命名空间
  • Dockerfile:定义镜像构建流程的脚本文件
  • Registry:镜像存储仓库(建议使用私有仓库保障安全性)

2. K8s核心组件

  • Master节点:
    • API Server:集群控制入口
    • Scheduler:资源调度器
    • Controller Manager:状态控制器
    • etcd:分布式键值存储
  • Worker节点:
    • Kubelet:节点代理
    • Container Runtime:容器运行时(通常为Docker)
    • Kube-proxy:网络代理
  • 核心资源对象:
    • Pod:最小部署单元(可包含1-N个容器)
    • Deployment:无状态应用控制器
    • StatefulSet:有状态应用控制器
    • Service:服务发现与负载均衡
    • Ingress:七层流量入口

三、前置准备清单

1. 基础环境要求

  • 服务器配置:
    • Master节点:4核8G以上(生产环境建议3节点集群)
    • Worker节点:根据业务类型配置(CPU密集型建议高主频,内存密集型建议大内存)
  • 操作系统:CentOS 7.6+/Ubuntu 18.04+(关闭Swap分区)
  • 网络要求:
    • 节点间网络延迟<1ms
    • 公网带宽根据业务峰值流量配置
    • 开启IPVS内核模块(提高负载均衡性能)

2. 依赖组件安装

  1. # 示例:Docker安装(所有节点)
  2. curl -fsSL https://get.docker.com | sh
  3. systemctl enable docker
  4. # 示例:K8s组件安装(所有节点)
  5. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  6. [kubernetes]
  7. name=Kubernetes
  8. baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
  9. enabled=1
  10. gpgcheck=1
  11. EOF
  12. yum install -y kubelet kubeadm kubectl
  13. systemctl enable kubelet

3. 安全配置

  • 配置TLS证书(kubeadm自动生成)
  • 启用RBAC权限控制
  • 设置NodeRestriction插件
  • 配置网络策略(NetworkPolicy)

四、部署流程详解

1. 集群初始化(Master节点)

  1. kubeadm init --apiserver-advertise-address=<MASTER_IP> \
  2. --pod-network-cidr=10.244.0.0/16 \
  3. --service-cidr=10.96.0.0/12
  4. # 配置kubectl
  5. mkdir -p $HOME/.kube
  6. cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  7. chown $(id -u):$(id -g) $HOME/.kube/config

2. 节点加入集群

  1. # Master节点生成token
  2. kubeadm token create --print-join-command
  3. # Worker节点执行
  4. kubeadm join <MASTER_IP>:6443 --token <TOKEN> \
  5. --discovery-token-ca-cert-hash sha256:<HASH>

3. 网络插件部署

  1. # 示例:Calico部署
  2. kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

4. 应用部署实践

Docker镜像构建:

  1. # 示例Dockerfile
  2. FROM python:3.8-slim
  3. WORKDIR /app
  4. COPY requirements.txt .
  5. RUN pip install -r requirements.txt
  6. COPY . .
  7. CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]

K8s部署配置:

  1. # deployment.yaml示例
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: web-app
  6. spec:
  7. replicas: 3
  8. selector:
  9. matchLabels:
  10. app: web
  11. template:
  12. metadata:
  13. labels:
  14. app: web
  15. spec:
  16. containers:
  17. - name: web
  18. image: registry.example.com/web-app:v1
  19. ports:
  20. - containerPort: 8000
  21. resources:
  22. requests:
  23. cpu: "100m"
  24. memory: "128Mi"
  25. limits:
  26. cpu: "500m"
  27. memory: "512Mi"

五、关键配置说明

1. 资源请求与限制

  • requests:保证容器获得的最小资源
  • limits:防止容器占用过多资源
  • 建议配置:
    • CPU密集型:requests=limits(避免调度到低配节点)
    • 突发流量型:requests<limits(允许资源超卖)

2. 健康检查配置

  1. livenessProbe:
  2. httpGet:
  3. path: /health
  4. port: 8000
  5. initialDelaySeconds: 30
  6. periodSeconds: 10
  7. readinessProbe:
  8. httpGet:
  9. path: /ready
  10. port: 8000
  11. initialDelaySeconds: 5
  12. periodSeconds: 5

3. 水平自动扩容

  1. # HPA配置示例
  2. apiVersion: autoscaling/v2
  3. kind: HorizontalPodAutoscaler
  4. metadata:
  5. name: web-hpa
  6. spec:
  7. scaleTargetRef:
  8. apiVersion: apps/v1
  9. kind: Deployment
  10. name: web-app
  11. minReplicas: 2
  12. maxReplicas: 10
  13. metrics:
  14. - type: Resource
  15. resource:
  16. name: cpu
  17. target:
  18. type: Utilization
  19. averageUtilization: 70

六、上线验证方法

  1. 基础验证:

    • kubectl get pods 查看Pod状态
    • kubectl logs <POD_NAME> 检查日志
    • kubectl describe pod <POD_NAME> 查看事件
  2. 服务验证:

    • 测试Service访问:curl http://<SERVICE_IP>:<PORT>
    • 测试Ingress访问:curl https://<DOMAIN>
  3. 性能验证:

    • 使用Locust进行压测
    • 监控CPU/内存使用率
    • 检查API响应时间分布

七、常见问题排查

问题现象 可能原因 解决方案
Pod一直Pending 资源不足/调度失败 检查kubectl describe pod事件
ImagePullBackOff 镜像拉取失败 检查镜像地址和Registry权限
CrashLoopBackOff 应用启动崩溃 检查容器日志和资源限制
502 Bad Gateway 服务不可达 检查Service后端Pod数量
网络延迟高 CNI插件问题 检查Calico/Flannel日志

八、运维优化建议

  1. 稳定性优化:

    • 配置PodDisruptionBudget(PDB)保障关键服务
    • 设置PriorityClass实现资源隔离
    • 启用PodAntiAffinity防止单节点故障
  2. 性能优化:

    • 使用NodeSelector将IO密集型应用调度到SSD节点
    • 配置topologySpreadConstraints实现跨AZ分布
    • 启用HPA+VPA实现双向自动扩容
  3. 成本优化:

    • 设置ResourceQuotas限制命名空间资源
    • 使用Spot实例承载无状态服务
    • 配置Pod生命周期钩子实现优雅退出

九、总结

通过Docker实现应用标准化封装,解决了”开发环境能跑,生产环境崩溃”的经典难题;借助K8s的集群管理能力,实现了从”人工运维”到”智能调度”的质的飞跃。实际部署中需重点关注:

  1. 镜像安全扫描与最小化构建
  2. 资源请求/限制的合理配置
  3. 多维度健康检查机制
  4. 自动化运维工具链集成

建议从测试环境开始验证部署流程,逐步扩展到生产环境,并通过混沌工程验证系统容错能力。对于大型集群,可考虑引入Prometheus+Grafana监控体系,结合ELK日志系统构建完整运维体系。