Kompose - 用户指南 - Kompose 中文

用户指南

目录

Kompose 转换示例

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

Kubernetes

$ kompose --file compose.yaml convert

你也可以同时提供多个编排文件

$ kompose -f compose.yaml -f compose.yaml convert

如果提供了多个编排文件,则将合并配置。任何通用配置都将被后续文件覆盖。

你可以通过以下环境变量提供自己的编排文件

$ COMPOSE_FILE="compose.yaml alternative-compose.yaml" kompose convert

OpenShift

$ kompose --provider openshift --file compose.yaml convert

CLI 修改

在命令行中,你可以修改生成的 YAML 的输出。例如,使用替代控制器,如 副本控制器 对象、守护程序集有状态集

守护程序集示例

$ kompose convert --controller daemonSet

可以在 kompose convert --help 中找到这些选项的完整列表。

标签

kompose 支持 compose.yaml 文件中的 Kompose 特定标签,以便为你提供剩余的内容。

标签是一个重要的 kompose 概念,因为它允许你在不需要随后编辑 YAML 的情况下添加 Kubernetes 修改。例如,添加一个初始化容器或自定义就绪检查。

键 / 值 说明 / 示例
kompose.controller.port.expose 在控制器上作为 hostPort 暴露(不推荐)
布尔值 false
kompose.controller.type 控制器的类型
字符串 deploymentdaemonsetreplicationcontrollerstatefulset
kompose.cronjob.backoff_limit 标记为失败前重试次数
整数 6
kompose.cronjob.concurrency_policy 并发作业的处理
字符串 ForbidAllowNever
kompose.cronjob.schedule 日程
字符串 1 * * * *
kompose.hpa.cpu 触发自动缩放的 CPU 利用率百分比
百分比 50%
kompose.hpa.memory 触发自动缩放的内存利用率阈值
字符串 200Mi
kompose.hpa.replicas.max 水平 Pod 自动缩放器的最大 Pod 副本数
整数 10
kompose.hpa.replicas.min 水平 Pod 自动缩放器的最小 Pod 副本数
整数 2
kompose.image-pull-policy 拉取映像的策略
字符串 AlwaysIfNotPresentNever
kompose.image-pull-secret 用于从私有注册表拉取映像的密钥
字符串 myregistrykey
kompose.init.containers.command 要执行的命令
数组 ["printenv"]
kompose.init.containers.image 要使用的映像
字符串 busybox
kompose.init.containers.name 已分配的名称
字符串 init-mydb
kompose.security-context.fsgroup 容器卷的文件系统组 ID
整数 1001
kompose.service.external-traffic-policy 外部流量路由策略
字符串 clusterlocal
kompose.service.expose 创建 Ingress 或 Route。接受域或“true”以自动生成域。
字符串 true,domain1.com,domain2.com
kompose.service.expose.ingress-class-name 用于公开服务的入口类
字符串 nginx
kompose.service.expose.tls-secret 用于保护入口的 TLS 密钥
字符串 my-tls-secret
kompose.service.group 在单个容器中分组多个容器的标签
字符串 mygroup
kompose.service.healthcheck.liveness.http_get_path 健康检查的 HTTP GET 路径
字符串 /health
kompose.service.healthcheck.liveness.http_get_port 健康检查的 HTTP GET 端口
整数 8080
kompose.service.healthcheck.liveness.tcp_port 健康检查的 TCP 套接字端口
整数 3306
kompose.service.healthcheck.readiness.disable 是否禁用准备就绪检查
布尔值 true
kompose.service.healthcheck.readiness.http_get_path 准备就绪检查的 HTTP GET 路径
字符串 /ready
kompose.service.healthcheck.readiness.http_get_port 准备就绪检查的 HTTP GET 端口
整数 8081
kompose.service.healthcheck.readiness.interval 准备就绪检查之间的间隔
持续时间 10s
kompose.service.healthcheck.readiness.retries 准备就绪检查在失败之前应重试的次数
整数 3
kompose.service.healthcheck.readiness.start_period 在启动准备就绪检查之前的初始延迟
持续时间 30s
kompose.service.healthcheck.readiness.tcp_port 准备就绪检查的 TCP 套接字端口
整数 3307
kompose.service.healthcheck.readiness.test 准备就绪检查运行的命令或脚本
数组 ["CMD", "echo", "OK"]
kompose.service.healthcheck.readiness.timeout 单个准备就绪检查的超时时间
持续时间 5s
kompose.service.nodeport.port 用作 NodePort 的特定端口号
整数 30000
kompose.service.type 服务类型
字符串 nodeportclusteriploadbalancerheadless
kompose.volume.size 卷的大小
字符串 1Gi
kompose.volume.storage-class-name 用于预配卷的 StorageClassName
字符串 standard
kompose.volume.sub-path 装载卷中的子路径
字符串 /data
kompose.volume.type Kubernetes 卷类型
字符串 configMappersistentVolumeClaimemptyDirhostPath

kompose.controller.port.expose

services:
  web:
    image: wordpress:latest
    ports:
      - '80:80'
    labels:
      kompose.controller.expose.port: true

kompose.controller.type

services:
  web:
    image: wordpress:latest
    ports:
      - '80:80'
    labels:
      kompose.controller.type: deployment

kompose.cronjob.backoff_limit

services:
  cron-job:
    image: busybox
    labels:
      kompose.cronjob.backoff_limit: 3

kompose.cronjob.concurrency_policy

services:
  periodic-task:
    image: busybox
    labels:
      kompose.cronjob.concurrency_policy: Forbid

kompose.cronjob.schedule

services:
  cron-job:
    image: busybox
    labels:
      kompose.cronjob.schedule: "*/5 * * * *"

kompose.hpa.cpu

services:
  web:
    image: nginx
    labels:
      kompose.hpa.cpu: 80

kompose.hpa.memory

services:
  db:
    image: mysql
    labels:
      kompose.hpa.memory: 512Mi

kompose.hpa.replicas.max

services:
  api:
    image: custom-api
    labels:
      kompose.hpa.replicas.max: 10

kompose.hpa.replicas.min

services:
  api:
    image: custom-api
    labels:
      kompose.hpa.replicas.min: 2

kompose.image-pull-policy

services:
  example-service:
    image: example-image
    labels:
      kompose.image-pull-policy: "IfNotPresent"

kompose.image-pull-secret

services:
  private-service:
    image: private-repo/image:tag
    labels:
      kompose.image-pull-secret: "my-private-registry-key"

kompose.init.containers.command

services:
  init-service:
    image: busybox
    labels:
      kompose.init.containers.command: ["echo", "Initializing..."]

kompose.init.containers.image

services:
  init-service:
    image: busybox
    labels:
      kompose.init.containers.image: busybox

kompose.init.containers.name

services:
  init-service:
    image: busybox
    labels:
      kompose.init.containers.name: "initial-setup"

kompose.security-context.fsgroup

services:
  secured-service:
    image: nginx
    labels:
      kompose.security-context.fsgroup: 2000

kompose.service.external-traffic-policy

services:
  front-end:
    image: quay.io/kompose/web
    ports:
      - 8080:8080
    labels:
      kompose.service.external-traffic-policy: local

kompose.service.expose

services:
  web-app:
    image: nginx
    ports:
      - 80:80
    labels:
      kompose.service.expose: "example.com"

kompose.service.expose.ingress-class-name

services:
  web:
    image: nginx
    ports:
      - 80:80
    labels:
      kompose.service.expose.ingress-class-name: "nginx"

kompose.service.expose.tls-secret

services:
  web:
    image: nginx
    ports:
      - 443:443
    labels:
      kompose.service.expose.tls-secret: "my-ssl-secret"

kompose.service.group

version: "3"

services:
  nginx:
    image: nginx
    depends_on:
      - logs
    labels:
      - kompose.service.group=sidecar

  logs:
    image: busybox
    command: ["tail -f /var/log/nginx/access.log"]
    labels:
      - kompose.service.group=sidecar

kompose.service.healthcheck.liveness.http_get_path

services:
  web:
    image: custom-web
    ports:
      - "8080:8080"
    labels:
      kompose.service.healthcheck.liveness.http_get_path: /health

kompose.service.healthcheck.liveness.http_get_port

services:
  web:
    image: custom-web
    ports:
      - "8080:8080"
    labels:
      kompose.service.healthcheck.liveness.http_get_port: 8080

kompose.service.healthcheck.liveness.tcp_port

services:
  db:
    image: mysql
    ports:
      - "3306:3306"
    labels:
      kompose.service.healthcheck.liveness.tcp_port: 3306

kompose.service.healthcheck.readiness.disable

services:
  web:
    image: custom-web
    labels:
      kompose.service.healthcheck.readiness.disable: true

kompose.service.healthcheck.readiness.http_get_path

services:
  web:
    image: custom-web
    labels:
      kompose.service.healthcheck.readiness.http_get_path: /ready

kompose.service.healthcheck.readiness.http_get_port

services:
  web:
    image: custom-web
    labels:
      kompose.service.healthcheck.readiness.http_get_port: 8081

kompose.service.healthcheck.readiness.interval

services:
  web:
    image: custom-web
    labels:
      kompose.service.healthcheck.readiness.interval: 10s

kompose.service.healthcheck.readiness.retries

services:
  web:
    image: custom-web
    labels:
      kompose.service.healthcheck.readiness.retries: 3

kompose.service.healthcheck.readiness.start_period

services:
  web:
    image: custom-web
    labels:
      kompose.service.healthcheck.readiness.start_period: 30s

kompose.service.healthcheck.readiness.tcp_port

services:
  db:
    image: mysql
    labels:
      kompose.service.healthcheck.readiness.tcp_port: 3307

kompose.service.healthcheck.readiness.test

services:
  web:
    image: custom-web
    labels:
      kompose.service.healthcheck.readiness.test: ["CMD", "curl", "-f", "https://127.0.0.1:8081/ready"]

kompose.service.healthcheck.readiness.timeout

services:
  web:
    image: custom-web
    labels:
      kompose.service.healthcheck.readiness.timeout: 5s

kompose.service.nodeport.port

services:
  web:
    image: nginx
    ports:
      - "30000:80"
    labels:
      kompose.service.nodeport.port: 30000

kompose.service.type

services:
  web:
    image: nginx
    ports:
      - "80:80"
    labels:
      kompose.service.type: nodeport

kompose.volume.size

services:
  db:
    image: postgres:10.1
    labels:
      kompose.volume.size: 1Gi
    volumes:
      - db-data:/var/lib/postgresql/data

kompose.volume.storage-class-name

services:
  db:
    image: postgres:10.1
    labels:
      kompose.volume.storage-class-name: custom-storage-class-name
    volumes:
      - db-data:/var/lib/postgresql/data

kompose.volume.sub-path

services:
  pgadmin:
    image: postgres
    labels:
      kompose.volume.sub-path: pg-data

kompose.volume.type

services:
  db:
    image: postgres
    labels:
      kompose.volume.type: persistentVolumeClaim
    volumes:
      - db-data:/var/lib/postgresql/data

重新启动策略

如果您想创建无控制器的普通 Pod,可以使用 Compose 的 restart 架构来定义它们。遵循下表以查看 restart 值所产生的结果。

compose restart 创建的对象 Pod restartPolicy
"" 控制器对象 Always
always 控制器对象 Always
unless-stopped 控制器对象 Always
on-failure Pod / CronJob OnFailure
no Pod / CronJob Never

注意:控制器对象可以是 deploymentreplicationcontroller 等。

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

version: '2'

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

例如,pival 服务将在此处成为 Cron 作业。此容器会每分钟计算一次 pi 的值。

version: '2'

services:
  pival:
    image: perl
    command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
    restart: "no"
    labels:
      kompose.cronjob.schedule: "* * * * *"
      kompose.cronjob.concurrency_policy: "Forbid"
      kompose.cronjob.backoff_limit: "0"

关于 Deployment 配置的警告

如果 Compose 文件为某个服务指定了卷,则 Deployment (Kubernetes) 或 DeploymentConfig (OpenShift) 策略将更改为“Recreate”,而不是“RollingUpdate”(默认)。这么做是为了避免多个服务实例同时访问一个卷。

如果 Compose 文件中包含服务名称(例如 web_serviceweb.service),其中带有 _.,那么它将被替换为 -,并且服务名称将相应地进行重命名(例如 web-service)。Kompose 执行此操作是因为“Kubernetes”不允许对象名称中带有 _

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

构建并推送镜像

如果 Compose 文件有 buildbuild:context, build:dockerfile 键,当指定 --build 时,build 将会运行。

当指定 --push-image=true 时,Image 将推送到 docker.io(默认)。

通过指定 --push-image-registry 可以推送到自定义注册表,这将覆盖图像名称中的注册表。

注册表上的身份验证

docker login 之后,Kompose 使用文件 $DOCKER_CONFIG/config.json$HOME/.docker/config.json$HOME/.dockercfg 中的 docker 身份验证。

这只适用于 Linux,但在使用 "credsStore": "osxkeychain" 时 macOS 将会失败。

然而,可以通过不使用 osxkeychain 作为 credsStore 来成功推送,以实现此目的。若要禁用 osxkeychain

  • config.json 文件中删除 credsStore,并再次 docker login
  • 对于某些 docker 桌面版本,有一个名为 安全地将 Docker 登录信息存储在 macOS 钥匙串中 的设置,应该取消对此设置的选中。然后根据需要重新启动 docker 桌面,并再次 docker login

现在,config.json 应包含 base64 编码的密码,然后推送图像应该会成功。虽然可行,但并不安全!使用需谨慎。

对于 Windows,还有 credsStore,即 wincred。从技术上说,它会在认证中失败,如同 macOS 一样,但 你也可以尝试像 macOS 一样采用上述方法。

自定义构建和推送

如果您想自定义构建和推送程序,并使用除 Docker 以外的其他容器解决方案,Kompose 为您提供了这样的可能。您可以使用 --build-command--push-command 标志来实现此目的。

例如:kompose -f convert --build-command 'whatever command --you-use' --push-command 'whatever command --you-use'