一、迁移前准备:理解Kubernetes与Docker的核心差异
1.1 架构设计对比
Docker采用单主机架构,容器直接运行在宿主机上,依赖本地资源调度;而Kubernetes通过主从架构(Master-Node)实现集群管理,支持跨主机资源调度与自愈能力。例如,Docker Compose通过docker-compose.yml定义多容器应用,但无法处理节点故障;Kubernetes则通过Deployment+Service组合实现容器编排与负载均衡。
1.2 资源模型转换
Docker使用docker run命令直接指定CPU/内存限制(如--cpus=1.5 --memory=2g),而Kubernetes通过资源请求(Requests)与限制(Limits)定义(示例如下):
apiVersion: v1kind: Podmetadata:name: nginx-podspec:containers:- name: nginximage: nginx:latestresources:requests:cpu: "500m"memory: "512Mi"limits:cpu: "1"memory: "1Gi"
需注意:Kubernetes的CPU单位为毫核(1核=1000m),内存单位为字节(1Gi=1024Mi)。
1.3 网络模型差异
Docker默认使用桥接网络,容器间通信依赖IP地址;Kubernetes通过CNI插件(如Calico、Flannel)实现Pod级网络,结合Service资源提供稳定的DNS名称与负载均衡。迁移时需将Docker的--network参数转换为Kubernetes的NetworkPolicy资源。
二、迁移实施:核心组件转换策略
2.1 容器镜像处理
- 镜像标签规范化:将Docker的
latest标签改为语义化版本(如v1.2.0),避免Kubernetes更新时拉取错误版本。 - 多阶段构建优化:示例Dockerfile(Go应用):
```dockerfile
构建阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .
运行阶段
FROM alpine:3.18
COPY —from=builder /app/main /main
CMD [“/main”]
此方式可减少最终镜像体积,提升Kubernetes节点存储利用率。## 2.2 编排文件转换将`docker-compose.yml`转换为Kubernetes资源需分三步:1. **服务分解**:每个Docker服务拆分为Deployment+Service组合2. **卷映射转换**:Docker的`volumes:`字段转为Kubernetes的PersistentVolumeClaim3. **环境变量处理**:Docker的`environment:`字段转为Kubernetes的ConfigMap或Secret示例转换(Redis服务):```yaml# Docker Compose片段services:redis:image: redis:7ports:- "6379:6379"volumes:- redis-data:/dataenvironment:- REDIS_PASSWORD=mysecret# Kubernetes等效资源apiVersion: v1kind: PersistentVolumeClaimmetadata:name: redis-pvcspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1Gi---apiVersion: apps/v1kind: Deploymentmetadata:name: redisspec:selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:containers:- name: redisimage: redis:7ports:- containerPort: 6379volumeMounts:- name: redis-storagemountPath: /dataenv:- name: REDIS_PASSWORDvalueFrom:secretKeyRef:name: redis-secretkey: passwordvolumes:- name: redis-storagepersistentVolumeClaim:claimName: redis-pvc
2.3 持久化存储迁移
Docker卷在Kubernetes中需通过PersistentVolume(PV)和PersistentVolumeClaim(PVC)实现。典型场景处理:
- 本地卷:Docker的
hostPath转为Kubernetes的hostPath类型PV(仅限开发环境) - 网络存储:NFS/Ceph等需配置StorageClass实现动态供给
- 云存储:AWS EBS/GCP PD等需安装对应CSI驱动
三、迁移后优化:Kubernetes特性深度应用
3.1 水平自动扩缩(HPA)
基于CPU/内存指标的自动扩缩示例:
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata:name: nginx-hpaspec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginxminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 70
3.2 探针配置最佳实践
- 存活探针(Liveness):检测容器是否健康
- 就绪探针(Readiness):检测服务是否可接收流量
示例配置(Web应用):livenessProbe:httpGet:path: /healthzport: 8080initialDelaySeconds: 30periodSeconds: 10readinessProbe:httpGet:path: /readyport: 8080initialDelaySeconds: 5periodSeconds: 5
3.3 Ingress路由配置
将Docker的端口映射转为Kubernetes Ingress规则。Nginx Ingress示例:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: web-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /spec:rules:- host: example.comhttp:paths:- path: /apipathType: Prefixbackend:service:name: api-serviceport:number: 80- path: /webpathType: Prefixbackend:service:name: web-serviceport:number: 80
四、运维体系重构
4.1 监控方案升级
- 指标收集:Prometheus+Node Exporter采集节点指标
- 日志管理:Fluentd+Elasticsearch+Kibana(EFK)方案
- 告警规则:基于Prometheus Alertmanager配置(示例):
```yaml
groups: - name: cpu-alerts
rules:- alert: HighCPUUsage
expr: (100 - (avg by (instance) (rate(node_cpu_seconds_total{mode=”idle”}[5m])) * 100)) > 90
for: 10m
labels:
severity: warning
annotations:
summary: “High CPU usage on {{ $labels.instance }}”
```
- alert: HighCPUUsage
4.2 备份恢复策略
- Etcd备份:定期备份
/var/lib/etcd目录 - 资源备份:使用Velero工具备份集群资源
- 持久卷快照:配置StorageClass的
volumeSnapshotClass
4.3 升级路径规划
- 蓝绿部署:通过两个独立Deployment实现无缝切换
- 金丝雀发布:逐步增加新版本Pod比例
- 回滚机制:保留历史Revision,支持
kubectl rollout undo
五、常见问题解决方案
5.1 镜像拉取失败
- 原因:私有仓库未配置Secret
- 解决:创建docker-registry类型Secret并挂载到Pod:
```yaml
apiVersion: v1
kind: Secret
metadata:
name: regcred
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson:
apiVersion: v1
kind: Pod
metadata:
name: private-reg-pod
spec:
containers:
- name: private-reg-container
image: myregistry.com/image:tag
imagePullSecrets: - name: regcred
```
5.2 Pod一直Pending状态
- 检查步骤:
kubectl describe pod <pod-name>查看事件- 检查节点资源是否充足(
kubectl top nodes) - 验证PVC是否绑定成功
- 检查是否有资源配额限制
5.3 服务间通信失败
- 排查流程:
- 确认Service的selector与Pod标签匹配
- 检查CoreDNS是否正常工作(
kubectl get pods -n kube-system) - 验证NetworkPolicy是否阻止通信
- 使用
kubectl exec进入容器测试连通性
六、迁移工具链推荐
6.1 自动化转换工具
- Kompose:将
docker-compose.yml转为Kubernetes资源 - Skaffold:简化开发到生产的部署流程
- Kubeval:验证YAML文件的合法性
6.2 运维管理平台
- Rancher:统一管理多个Kubernetes集群
- Lens:可视化集群监控与操作
- Argo CD:GitOps持续部署方案
6.3 性能测试工具
- k6:负载测试工具
- Locust:分布式压力测试
- Goldpinger:集群内网络连通性检测
七、企业级迁移路线图
7.1 试点阶段(1-2周)
- 选择非核心业务进行迁移
- 验证基础功能(部署、网络、存储)
- 建立CI/CD流水线
7.2 扩展阶段(1-2月)
- 迁移50%以上服务
- 实现监控告警体系
- 培训运维团队
7.3 优化阶段(持续)
- 调整资源配额
- 优化HPA参数
- 实施成本监控
八、成本效益分析
8.1 资源利用率提升
- Docker平均利用率:30-40%
- Kubernetes通过自动扩缩可提升至60-70%
8.2 运维成本降低
- 故障自愈减少人工干预
- 统一管理降低多环境维护成本
8.3 业务连续性增强
- 跨可用区部署提高可用性
- 快速回滚机制减少业务中断
通过系统化的迁移策略与工具链支持,企业可将Docker容器平稳迁移至Kubernetes平台,实现资源利用率的显著提升与运维效率的质的飞跃。实际案例显示,完成迁移的企业平均降低35%的基础设施成本,同时将应用发布频率从每周一次提升至每天多次。