将 Docker Compose 文件转换为 Kubernetes 资源

什么是 Kompose?它是一个转换工具,用于将所有 compose(主要是 Docker Compose)转换为容器编排器(Kubernetes 或 OpenShift)。

更多信息可以在 Kompose 网站上找到:https://kompose.kubernetes.top

开始之前

你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具才能与你的集群通信。 建议在至少有两个节点且不充当控制平面主机的集群上运行此教程。 如果你还没有集群,可以使用 minikube 创建一个集群,或者你可以使用以下 Kubernetes 游乐场之一

要检查版本,请输入 kubectl version

安装 Kompose

我们有多种安装 Kompose 的方法。 我们首选的方法是从最新的 GitHub 版本下载二进制文件。

Kompose 通过 GitHub 以三周为周期发布,你可以在 GitHub 发布页面 上查看所有当前版本。

# Linux
curl -L https://github.com/kubernetes/kompose/releases/download/v1.34.0/kompose-linux-amd64 -o kompose

# macOS
curl -L https://github.com/kubernetes/kompose/releases/download/v1.34.0/kompose-darwin-amd64 -o kompose

# Windows
curl -L https://github.com/kubernetes/kompose/releases/download/v1.34.0/kompose-windows-amd64.exe -o kompose.exe

chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose

或者,你可以下载 tarball

使用 go get 安装会从主分支拉取最新的开发更改。

go get -u github.com/kubernetes/kompose

Kompose 位于 EPEL CentOS 存储库中。 如果你尚未安装并启用 EPEL 存储库,你可以通过运行 sudo yum install epel-release 来完成。

如果你的系统中启用了 EPEL,你可以像安装任何其他软件包一样安装 Kompose。

sudo yum -y install kompose

Kompose 位于 Fedora 24、25 和 26 存储库中。你可以像安装任何其他软件包一样安装它。

sudo dnf -y install kompose

在 macOS 上,你可以通过 Homebrew 安装最新版本

brew install kompose

使用 Kompose

在几个步骤中,我们将引导你从 Docker Compose 到 Kubernetes。你只需要一个现有的 docker-compose.yml 文件。

  1. 转到包含你的 docker-compose.yml 文件的目录。 如果你没有,请使用此文件进行测试。

    
    services:
    
      redis-leader:
        container_name: redis-leader
        image: redis
        ports:
          - "6379"
    
      redis-replica:
        container_name: redis-replica
        image: redis
        ports:
          - "6379"
        command: redis-server --replicaof redis-leader 6379 --dir /tmp
    
      web:
        container_name: web
        image: quay.io/kompose/web
        ports:
          - "8080:8080"
        environment:
          - GET_HOSTS_FROM=dns
        labels:
          kompose.service.type: LoadBalancer
    
  2. 要将 docker-compose.yml 文件转换为可以与 kubectl 一起使用的文件,请运行 kompose convert,然后运行 kubectl apply -f <output file>

    kompose convert
    

    输出类似于

    INFO Kubernetes file "redis-leader-service.yaml" created
    INFO Kubernetes file "redis-replica-service.yaml" created
    INFO Kubernetes file "web-tcp-service.yaml" created
    INFO Kubernetes file "redis-leader-deployment.yaml" created
    INFO Kubernetes file "redis-replica-deployment.yaml" created
    INFO Kubernetes file "web-deployment.yaml" created
    
     kubectl apply -f web-tcp-service.yaml,redis-leader-service.yaml,redis-replica-service.yaml,web-deployment.yaml,redis-leader-deployment.yaml,redis-replica-deployment.yaml
    

    输出类似于

    deployment.apps/redis-leader created
    deployment.apps/redis-replica created
    deployment.apps/web created
    service/redis-leader created
    service/redis-replica created
    service/web-tcp created
    

    你的部署正在 Kubernetes 中运行。

  3. 访问你的应用程序。

    如果你已经在开发过程中使用 minikube

    minikube service web-tcp
    

    否则,让我们查找你的服务正在使用的 IP!

    kubectl describe svc web-tcp
    
     Name:                     web-tcp
     Namespace:                default
     Labels:                   io.kompose.service=web-tcp
     Annotations:              kompose.cmd: kompose convert
                               kompose.service.type: LoadBalancer
                               kompose.version: 1.33.0 (3ce457399)
     Selector:                 io.kompose.service=web
     Type:                     LoadBalancer
     IP Family Policy:         SingleStack
     IP Families:              IPv4
     IP:                       10.102.30.3
     IPs:                      10.102.30.3
     Port:                     8080  8080/TCP
     TargetPort:               8080/TCP
     NodePort:                 8080  31624/TCP
     Endpoints:                10.244.0.5:8080
     Session Affinity:         None
     External Traffic Policy:  Cluster
     Events:                   <none>
    

    如果你正在使用云提供商,你的 IP 将列在 LoadBalancer Ingress 旁边。

    curl http://192.0.2.89
    
  4. 清理。

    在你完成测试示例应用程序部署后,只需在你的 shell 中运行以下命令即可删除所使用的资源。

    kubectl delete -f web-tcp-service.yaml,redis-leader-service.yaml,redis-replica-service.yaml,web-deployment.yaml,redis-leader-deployment.yaml,redis-replica-deployment.yaml
    

用户指南

Kompose 支持两个提供程序:OpenShift 和 Kubernetes。 你可以使用全局选项 --provider 选择目标提供程序。 如果未指定提供程序,则默认设置为 Kubernetes。

kompose convert

Kompose 支持将 V1、V2 和 V3 Docker Compose 文件转换为 Kubernetes 和 OpenShift 对象。

Kubernetes kompose convert 示例

kompose --file docker-voting.yml convert
WARN Unsupported key networks - ignoring
WARN Unsupported key build - ignoring
INFO Kubernetes file "worker-svc.yaml" created
INFO Kubernetes file "db-svc.yaml" created
INFO Kubernetes file "redis-svc.yaml" created
INFO Kubernetes file "result-svc.yaml" created
INFO Kubernetes file "vote-svc.yaml" created
INFO Kubernetes file "redis-deployment.yaml" created
INFO Kubernetes file "result-deployment.yaml" created
INFO Kubernetes file "vote-deployment.yaml" created
INFO Kubernetes file "worker-deployment.yaml" created
INFO Kubernetes file "db-deployment.yaml" created
ls
db-deployment.yaml  docker-compose.yml         docker-gitlab.yml  redis-deployment.yaml  result-deployment.yaml  vote-deployment.yaml  worker-deployment.yaml
db-svc.yaml         docker-voting.yml          redis-svc.yaml     result-svc.yaml        vote-svc.yaml           worker-svc.yaml

你也可以同时提供多个 docker-compose 文件

kompose -f docker-compose.yml -f docker-guestbook.yml convert
INFO Kubernetes file "frontend-service.yaml" created         
INFO Kubernetes file "mlbparks-service.yaml" created         
INFO Kubernetes file "mongodb-service.yaml" created          
INFO Kubernetes file "redis-master-service.yaml" created     
INFO Kubernetes file "redis-slave-service.yaml" created      
INFO Kubernetes file "frontend-deployment.yaml" created      
INFO Kubernetes file "mlbparks-deployment.yaml" created      
INFO Kubernetes file "mongodb-deployment.yaml" created       
INFO Kubernetes file "mongodb-claim0-persistentvolumeclaim.yaml" created
INFO Kubernetes file "redis-master-deployment.yaml" created  
INFO Kubernetes file "redis-slave-deployment.yaml" created   
ls
mlbparks-deployment.yaml  mongodb-service.yaml                       redis-slave-service.jsonmlbparks-service.yaml  
frontend-deployment.yaml  mongodb-claim0-persistentvolumeclaim.yaml  redis-master-service.yaml
frontend-service.yaml     mongodb-deployment.yaml                    redis-slave-deployment.yaml
redis-master-deployment.yaml

当提供多个 docker-compose 文件时,配置会合并。 任何公共配置都将被后续文件覆盖。

OpenShift kompose convert 示例

kompose --provider openshift --file docker-voting.yml convert
WARN [worker] Service cannot be created because of missing port.
INFO OpenShift file "vote-service.yaml" created             
INFO OpenShift file "db-service.yaml" created               
INFO OpenShift file "redis-service.yaml" created            
INFO OpenShift file "result-service.yaml" created           
INFO OpenShift file "vote-deploymentconfig.yaml" created    
INFO OpenShift file "vote-imagestream.yaml" created         
INFO OpenShift file "worker-deploymentconfig.yaml" created  
INFO OpenShift file "worker-imagestream.yaml" created       
INFO OpenShift file "db-deploymentconfig.yaml" created      
INFO OpenShift file "db-imagestream.yaml" created           
INFO OpenShift file "redis-deploymentconfig.yaml" created   
INFO OpenShift file "redis-imagestream.yaml" created        
INFO OpenShift file "result-deploymentconfig.yaml" created  
INFO OpenShift file "result-imagestream.yaml" created  

它还支持为服务中的 build 指令创建 buildconfig。 默认情况下,它使用当前 git 分支的远程存储库作为源存储库,并使用当前分支作为构建的源分支。 你可以使用 --build-repo--build-branch 选项分别指定不同的源存储库和分支。

kompose --provider openshift --file buildconfig/docker-compose.yml convert
WARN [foo] Service cannot be created because of missing port.
INFO OpenShift Buildconfig using [email protected]:rtnpro/kompose.git::master as source.
INFO OpenShift file "foo-deploymentconfig.yaml" created     
INFO OpenShift file "foo-imagestream.yaml" created          
INFO OpenShift file "foo-buildconfig.yaml" created

替代转换

默认的 kompose 转换将生成 Kubernetes 部署服务,采用 yaml 格式。 你可以使用 -j 选择生成 json。 此外,你还可以选择生成副本控制器对象、守护程序集Helm chart。

kompose convert -j
INFO Kubernetes file "redis-svc.json" created
INFO Kubernetes file "web-svc.json" created
INFO Kubernetes file "redis-deployment.json" created
INFO Kubernetes file "web-deployment.json" created

*-deployment.json 文件包含部署对象。

kompose convert --replication-controller
INFO Kubernetes file "redis-svc.yaml" created
INFO Kubernetes file "web-svc.yaml" created
INFO Kubernetes file "redis-replicationcontroller.yaml" created
INFO Kubernetes file "web-replicationcontroller.yaml" created

*-replicationcontroller.yaml 文件包含副本控制器对象。 如果你想指定副本数(默认为 1),请使用 --replicas 标志:kompose convert --replication-controller --replicas 3

kompose convert --daemon-set
INFO Kubernetes file "redis-svc.yaml" created
INFO Kubernetes file "web-svc.yaml" created
INFO Kubernetes file "redis-daemonset.yaml" created
INFO Kubernetes file "web-daemonset.yaml" created

*-daemonset.yaml 文件包含守护程序集对象。

如果要生成与 Helm 一起使用的 Chart,请运行

kompose convert -c
INFO Kubernetes file "web-svc.yaml" created
INFO Kubernetes file "redis-svc.yaml" created
INFO Kubernetes file "web-deployment.yaml" created
INFO Kubernetes file "redis-deployment.yaml" created
chart created in "./docker-compose/"
tree docker-compose/
docker-compose
├── Chart.yaml
├── README.md
└── templates
    ├── redis-deployment.yaml
    ├── redis-svc.yaml
    ├── web-deployment.yaml
    └── web-svc.yaml

该 Chart 结构旨在为构建你的 Helm chart 提供框架。

标签

kompose 支持 docker-compose.yml 文件中的 Kompose 特定标签,以便显式定义服务在转换时的行为。

  • kompose.service.type 定义要创建的服务类型。

    例如

    version: "2"
    services:
      nginx:
        image: nginx
        dockerfile: foobar
        build: ./foobar
        cap_add:
          - ALL
        container_name: foobar
        labels:
          kompose.service.type: nodeport
    
  • kompose.service.expose 定义是否需要从集群外部访问该服务。 如果值设置为 “true”,则提供程序会自动设置端点,对于任何其他值,该值都将设置为主机名。 如果在服务中定义了多个端口,则选择第一个端口进行公开。

    • 对于 Kubernetes 提供程序,会创建一个 Ingress 资源,并且假定已经配置了 Ingress 控制器。
    • 对于 OpenShift 提供程序,会创建一条路由。

    例如

    version: "2"
    services:
      web:
        image: tuna/docker-counter23
        ports:
        - "5000:5000"
        links:
        - redis
        labels:
          kompose.service.expose: "counter.example.com"
      redis:
        image: redis:3.0
        ports:
        - "6379"
    

当前支持的选项是

kompose.service.typenodeport / clusterip / loadbalancer
kompose.service.exposetrue / hostname

重启

如果你想创建没有控制器的普通 pod,你可以使用 docker-compose 的 restart 结构来定义它。 请参阅下表以了解 restart 值会发生什么。

docker-compose restart创建的对象Pod restartPolicy
""控制器对象Always
always控制器对象Always
on-failurePodOnFailure
noPodNever

例如,pival 服务将在此处变为 pod。 此容器计算 pi 的值。

version: '2'

services:
  pival:
    image: perl
    command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
    restart: "on-failure"

关于部署配置的警告

如果 Docker Compose 文件为服务指定了卷,则部署(Kubernetes)或 DeploymentConfig (OpenShift) 策略将更改为 "Recreate" 而不是 "RollingUpdate"(默认)。 这样做是为了避免服务的多个实例同时访问卷。

如果 Docker Compose 文件中的服务名称包含 _(例如 web_service),则它将被替换为 -,并且服务名称将相应地重命名(例如 web-service)。 Kompose 这样做是因为 “Kubernetes” 不允许对象名称中包含 _

请注意,更改服务名称可能会破坏某些 docker-compose 文件。

Docker Compose 版本

Kompose 支持 Docker Compose 版本:1、2 和 3。 由于它们的实验性质,我们对 2.1 和 3.2 版本的支持有限。

所有三个版本之间的兼容性的完整列表都在我们的转换文档中列出,包括所有不兼容的 Docker Compose 键的列表。

上次修改时间:2024 年 6 月 21 日上午 10:11 PST:修复镜像拉取失败并更新命令和输出 (cca76d50c1)