自定义 Compose Bridge
本页解释了 Compose Bridge 如何利用模板高效地将 Docker Compose 文件转换为 Kubernetes Manifest。它还解释了如何根据您的特定要求和需求自定义这些模板,或者如何构建您自己的转换。
工作原理
Compose Bridge 使用转换将 Compose 模型转换为另一种形式。
转换被打包为一个 Docker 镜像,该镜像接收完全解析的 Compose 模型作为 /in/compose.yaml
,并可以在 /out
目录下生成任何目标格式文件。
Compose Bridge 使用 Go 模板为 Kubernetes 提供转换,因此只需替换或添加您自己的模板即可轻松扩展以进行自定义。
语法
Compose Bridge 使用模板将 Compose 配置文件转换为 Kubernetes Manifest。模板是使用 Go 模板语法 的纯文本文件。这使得能够插入逻辑和数据,使模板根据 Compose 模型具有动态性和适应性。
当执行模板时,它必须生成一个 YAML 文件,这是 Kubernetes Manifest 的标准格式。只要文件之间用 ---
分隔,就可以生成多个文件。
每个 YAML 输出文件都以自定义头部标记开头,例如
#! manifest.yaml
在以下示例中,模板遍历 compose.yaml
文件中定义的服务。对于每个服务,都会生成一个专用的 Kubernetes Manifest 文件,该文件根据服务命名并包含指定的配置。
{{ range $name, $service := .services }}
---
#! {{ $name }}-manifest.yaml
# Generated code, do not edit
key: value
## ...
{{ end }}
输入
输入的 Compose 模型是运行 docker compose config
获得的规范 YAML 模型。在模板中,使用点符号访问 compose.yaml
中的数据,允许您浏览嵌套数据结构。例如,要访问服务的部署模式,您可以使用 service.deploy.mode
# iterate over a yaml sequence
{{ range $name, $service := .services }}
# access a nested attribute using dot notation
{{ if eq $service.deploy.mode "global" }}
kind: DaemonSet
{{ end }}
{{ end }}
您可以查看 Compose Specification JSON Schema 以全面了解 Compose 模型。此 schema 概述了 Compose 模型中的所有可能配置及其数据类型。
助手函数
作为 Go 模板语法的一部分,Compose Bridge 提供了一套 YAML 助手函数,旨在高效地操作模板中的数据
seconds
:将 持续时间 转换为整数uppercase
:将字符串转换为大写字符title
:通过将每个单词的首字母大写来转换字符串safe
:将字符串转换为安全标识符,将所有字符(小写字母 a-z 除外)替换为-
truncate
:从列表中删除前 N 个元素join
:使用分隔符将列表中的元素组合成一个字符串base64
:将字符串编码为 base64,用于 Kubernetes 中 secrets 的编码map
:根据表示为"value -> newValue"
字符串的映射转换值indent
:将字符串内容缩进 N 个空格helmValue
:将字符串内容作为模板值写入最终文件
在以下示例中,模板检查是否为服务指定了健康检查间隔,应用 seconds
函数将此间隔转换为秒,并将该值分配给 periodSeconds
属性。
{{ if $service.healthcheck.interval }}
periodSeconds: {{ $service.healthcheck.interval | seconds }}{{ end }}
{{ end }}
自定义
由于 Kubernetes 是一个多功能平台,因此有多种方法将 Compose 概念映射到 Kubernetes 资源定义中。Compose Bridge 允许您自定义转换以匹配您自己的基础设施决策和偏好,具有不同级别的灵活性和工作量。
修改默认模板
您可以通过运行 compose-bridge transformations create --from docker/compose-bridge-kubernetes my-template
来提取默认转换 docker/compose-bridge-kubernetes
使用的模板,并调整模板以匹配您的需求。
模板将被提取到以您的模板名称命名的目录中,在本例中为 my-template
。
它包含一个 Dockerfile,可让您创建自己的镜像来分发模板,以及一个包含模板文件的目录。
您可以自由编辑现有文件、删除它们或 添加新文件,以便随后生成满足您需求的 Kubernetes Manifest。
然后,您可以使用生成的 Dockerfile 将您的更改打包到一个新的转换镜像中,然后您可以使用该镜像配合 Compose Bridge。
$ docker build --tag mycompany/transform --push .
然后,您可以使用您的转换作为替代
$ compose-bridge convert --transformations mycompany/transform
添加您自己的模板
对于不受 Compose Bridge 默认转换管理的资源,您可以构建自己的模板。compose.yaml
模型可能不提供填充目标 Manifest 所需的所有配置属性。在这种情况下,您可以依赖 Compose 自定义扩展来更好地描述应用程序,并提供一种与平台无关的转换。
例如,如果您在 compose.yaml
文件中的服务定义中添加 x-virtual-host
元数据,则可以使用以下自定义属性生成 Ingress 规则
{{ $project := .name }}
#! {{ $name }}-ingress.yaml
# Generated code, do not edit
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: virtual-host-ingress
namespace: {{ $project }}
spec:
rules:
{{ range $name, $service := .services }}
{{ range index $service "x-virtual-host" }}
- host: ${{ . }}
http:
paths:
- path: "/"
backend:
service:
name: ${{ name }}
port:
number: 80
{{ end }}
{{ end }}
打包到 Docker 镜像后,除了其他转换之外,您还可以在将 Compose 模型转换为 Kubernetes 时使用此自定义模板。
$ compose-bridge convert \
--transformation docker/compose-bridge-kubernetes \
--transformation mycompany/transform
构建您自己的转换
虽然 Compose Bridge 模板可以轻松进行最小更改的自定义,但您可能希望进行重大更改,或依赖现有的转换工具。
Compose Bridge 转换是一个 Docker 镜像,旨在从 /in/compose.yaml
获取 Compose 模型并在 /out
目录下生成平台 Manifest。这种简单的约定使得使用 Kompose 打包替代转换变得容易。
FROM alpine
# Get kompose from github release page
RUN apk add --no-cache curl
ARG VERSION=1.32.0
RUN ARCH=$(uname -m | sed 's/armv7l/arm/g' | sed 's/aarch64/arm64/g' | sed 's/x86_64/amd64/g') && \
curl -fsL \
"https://github.com/kubernetes/kompose/releases/download/v${VERSION}/kompose-linux-${ARCH}" \
-o /usr/bin/kompose
RUN chmod +x /usr/bin/kompose
CMD ["/usr/bin/kompose", "convert", "-f", "/in/compose.yaml", "--out", "/out"]
此 Dockerfile 打包了 Kompose,并根据 Compose Bridge 转换约定定义了运行此工具的命令。