Docker+Kubernetes落地指南:从单机到集群的平滑迁移
一、为何必须升级到Kubernetes?
1.1 单机Docker的瓶颈
单机环境痛点:
├─ 资源利用率不均衡(CPU飙高 vs 内存闲置)
├─ 服务扩容需手动操作
├─ 零宕机更新难以实现
└─ 网络配置复杂(跨主机通信困难) 企业级需求:
┌───────────┬───────────────┐
| 场景 | Kubernetes方案 |
|───────────|───────────────|
| 滚动更新 | Deployment策略 |
| 服务发现 | Service+Ingress |
| 自动扩缩容 | HPA控制器 |
└───────────┴───────────────┘
1.2 迁移收益预估
# 某电商平台迁移前后对比 | 单机Docker | Kubernetes集群
-----------|-----------|-------------
部署效率 | 30min/次 | 2min/次 # 提升15倍
故障恢复 | 人工介入 | 自愈机制 # MTTR减少80%
资源成本 | ¥5万/月 | ¥3.2万/月 # 节省36%
二、迁移前准备:环境与数据双保险
2.1 环境兼容性检查
# 检测Docker与Kubernetes版本兼容性
$ docker version | grep 'API version' # 需≥1.41
$ kubectl version --short | grep Server # 推荐v1.24+ # 检查Linux内核配置
$ grep -E 'vm.swappiness|overcommit' /etc/sysctl.conf
vm.swappiness=0 # 必须调优项
vm.overcommit_memory=1 # 避免OOM Killer误杀
2.2 数据备份方案
# 持久化数据备份(以PostgreSQL为例)
$ docker exec -t pg_container pg_dump -U postgres dbname > backup.sql # 容器配置导出
$ docker inspect <container_id> > config.json
$ docker save -o app-image.tar <image_name>
三、五步完成平滑迁移
3.1 步骤1:搭建Kubernetes集群
# 使用kubeadm初始化控制平面
$ kubeadm init --pod-network-cidr=10.244.0.0/16 # 安装Calico网络插件
$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml # 节点加入集群(在工作节点执行)
$ kubeadm join 192.168.0.100:6443 --token <token> \ --discovery-token-ca-cert-hash sha256:<hash>
3.2 步骤2:容器镜像迁移
# 搭建私有镜像仓库(Harbor)
$ helm install harbor bitnami/harbor --set service.type=LoadBalancer # 推送镜像到新仓库
$ docker tag local-image:1.0 harbor.domain.com/prod/app:v1
$ docker push harbor.domain.com/prod/app:v1
3.3 步骤3:服务编排转换
# 将docker-compose.yml转换为Deployment
apiVersion: apps/v1
kind: Deployment
metadata: name: web-app
spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: web image: harbor.domain.com/prod/app:v1 ports: - containerPort: 8080 envFrom: - configMapRef: name: app-config
3.4 步骤4:流量切换方案
蓝绿发布策略:
1. 旧Docker服务保持运行(v1.0)
2. Kubernetes集群部署新版本(v1.1)
3. 修改Nginx配置将10%流量导至集群
4. 监控无异常后逐步切流
3.5 步骤5:监控体系构建
# 安装Prometheus Operator
$ helm install prometheus prometheus-community/kube-prometheus-stack # 配置容器日志收集(EFK方案)
$ kubectl apply -f https://raw.githubusercontent.com/fluent/fluentd-kubernetes-daemonset/master/fluentd-daemonset-elasticsearch-rbac.yaml
四、四大避坑指南
4.1 网络配置陷阱
常见故障:
◼ 跨节点容器无法互通 → 检查Calico的MTU设置
◼ Service ClusterIP不通 → 确认kube-proxy模式(推荐iptables)
解决方案:
$ kubectl get endpoints <service-name> # 验证Endpoint状态
$ iptables-save | grep KUBE-SVC- # 查看iptables规则
4.2 存储卷迁移
# 将本地卷迁移到CSI驱动(以Rook-Ceph为例)
$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/deploy/examples/csi/rbd/storageclass.yaml # PVC数据迁移命令
$ kubectl cp /local/path my-pod:/remote/path
4.3 容器时区同步
# 在Deployment中挂载主机时区
spec: containers: - name: app volumeMounts: - name: timezone mountPath: /etc/localtime volumes: - name: timezone hostPath: path: /usr/share/zoneinfo/Asia/Shanghai
4.4 资源限制优化
resources: requests: memory: "512Mi" cpu: "500m" limits: memory: "1Gi" cpu: "1"
# 通过监控数据调整:
$ kubectl top pod # 查看实际资源消耗
五、迁移后性能调优
5.1 节点亲和性配置
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-type operator: In values: - high-memory
5.2 自动水平扩缩容
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata: name: app-hpa
spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60
结语:迁移不是终点而是起点
完成Docker到Kubernetes的迁移只是云原生旅程的第一步,接下来需要:
- 建立完善的CI/CD流水线
- 实施Service Mesh服务治理
- 探索Serverless架构转型
迁移成功标志:当团队不再关注“容器在哪里运行”,而是聚焦业务价值交付时,说明转型真正成功。
新时代农民工