Docker Swarm 简单易用但 KubernetesK8s已成为容器编排的事实标准拥有更丰富的生态和更强的扩展性。如果你已经从 Swarm 起步现在考虑迁移到 K8s本文将为你梳理核心概念对比、迁移步骤以及使用 kompose 工具转换 Compose 文件的方法。同时我们也会讨论 Docker 作为容器运行时在 K8s 中的演进CRI 接口。一、Docker Swarm vs Kubernetes核心差异选择建议如果你已有 Swarm 并且运行良好不需要复杂的自动伸缩、服务网格、多云部署继续使用 Swarm 也足够。如果需要更细粒度的策略、庞大的社区支持、跨云部署或者招聘方便K8s 是更好的选择。二、从 Docker Compose 到 Kubernetes使用 kompose许多 Swarm 用户使用 docker-compose.yml 定义应用。kompose 工具可以将 Compose 文件转换为 K8s 资源 YAML。2.1 安装 kompose# Linuxcurl-Lhttps://github.com/kubernetes/kompose/releases/download/v1.31.2/kompose-linux-amd64-okomposechmodx komposesudomvkompose /usr/local/bin/# macOSbrewinstallkompose2.2 转换示例假设有 docker-compose.ymlversion:3services:web:image:nginx:alpineports:-8080:80redis:image:redis:alpine运行转换kompose convert生成文件web-deployment.yaml, web-service.yaml, redis-deployment.yaml, redis-service.yaml。2.3 直接部署到 K8skompose up这会转换并应用资源到当前 K8s 集群需要预先配置好 kubectl。注意kompose 不是万能的某些 Compose 特性如 depends_on、healthcheck 的部分参数映射不完美需要手动调整。三、核心概念映射对照表四、迁移步骤示例WordPress 从 Swarm 到 K8s原 Swarm stack.yml简化version:3.8services:wordpress:image:wordpress:latestports:-80:80environment:WORDPRESS_DB_HOST:mysql:3306WORDPRESS_DB_PASSWORD:secretmysql:image:mysql:8.0environment:MYSQL_ROOT_PASSWORD:secretvolumes:-mysql-data:/var/lib/mysqlvolumes:mysql-data:K8s 迁移步骤创建 Namespace可选kubectl create namespace wordpress创建 Secret 存储密码kubectl create secret generic mysql-pass --from-literalpasswordsecret-nwordpress创建 MySQL Deployment 和 Servicemysql.yamlapiVersion:v1kind:Servicemetadata:name:mysqlnamespace:wordpressspec:ports:-port:3306selector:app:mysql---apiVersion:apps/v1kind:Deploymentmetadata:name:mysqlnamespace:wordpressspec:replicas:1selector:matchLabels:app:mysqltemplate:metadata:labels:app:mysqlspec:containers:-name:mysqlimage:mysql:8.0env:-name:MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name:mysql-passkey:passwordvolumeMounts:-name:mysql-storagemountPath:/var/lib/mysqlvolumes:-name:mysql-storagepersistentVolumeClaim:claimName:mysql-pvc---apiVersion:v1kind:PersistentVolumeClaimmetadata:name:mysql-pvcnamespace:wordpressspec:accessModes:-ReadWriteOnceresources:requests:storage:10Gi创建 WordPress Deployment 和 Servicewordpress.yamlapiVersion:v1kind:Servicemetadata:name:wordpressnamespace:wordpressspec:type:NodePortports:-port:80nodePort:30080selector:app:wordpress---apiVersion:apps/v1kind:Deploymentmetadata:name:wordpressnamespace:wordpressspec:replicas:3selector:matchLabels:app:wordpresstemplate:metadata:labels:app:wordpressspec:containers:-name:wordpressimage:wordpress:latestports:-containerPort:80env:-name:WORDPRESS_DB_HOSTvalue:mysql:3306-name:WORDPRESS_DB_PASSWORDvalueFrom:secretKeyRef:name:mysql-passkey:password部署到 K8skubectl apply-fmysql.yaml kubectl apply-fwordpress.yaml访问http://:30080五、Docker 作为 Kubernetes 运行时的变迁早期 K8s 通过 dockershim 直接与 Docker Engine 通信。但自 K8s 1.20 起官方逐步弃用 dockershim推荐使用符合 CRI容器运行时接口 的运行时如 containerdK8s 1.24 默认不再支持 dockershim。对用户的影响如果你的集群使用 containerd或 cri-o仍然可以运行 Docker 构建的镜像因为镜像是 OCI 标准格式。你依然可以在开发环境中使用 Docker 构建镜像只需将镜像推送到仓库K8s 从中拉取。docker 命令行工具仍然可用于本地构建和调试。六、迁移的最佳实践从开发和测试环境开始先将非核心应用迁移到 K8s积累经验。使用 Helm 打包应用Helm Charts 类似 Compose但更强大支持模板化配置。拥抱 GitOps将 K8s 资源清单存入 Git使用 ArgoCD 或 Flux 自动化部署。替换存储Swarm 的本地卷迁移到 K8s 需要 CSI 或云存储如 AWS EBS、GCE Persistent Disk。网络策略K8s 默认所有 Pod 互通如需隔离配置 NetworkPolicy需要 CNI 支持。日志和监控部署 EFKElasticsearch-Fluentd-Kibana或 Prometheus Grafana。七、小结从 Swarm 迁移到 K8s 需要学习曲线但能带来更强大的生态和扩展性。kompose 可以辅助转换但复杂场景仍需手动调整。记住K8s 并非万能适合规模和需求增长后的场景。