自定義 Compose Bridge

要求: Docker Desktop 4.43.0 及更高版本

本頁解釋了 Compose Bridge 如何利用模板高效地將 Docker Compose 檔案轉換為 Kubernetes 清單。它還解釋瞭如何根據您的特定要求和需求自定義這些模板,或者如何構建您自己的轉換。

工作原理

Compose Bridge 使用轉換將 Compose 模型轉換為另一種形式。

轉換被打包為 Docker 映象,它接收完全解析的 Compose 模型作為 /in/compose.yaml,並可以在 /out 下生成任何目標格式檔案。

Compose Bridge 包含一個使用 Go 模板的預設 Kubernetes 轉換,您可以透過替換或擴充套件模板來對其進行自定義。

語法

Compose Bridge 利用模板將 Compose 配置檔案轉換為 Kubernetes 清單。模板是使用 Go 模板語法 的純文字檔案。這使得可以插入邏輯和資料,使模板動態且可根據 Compose 模型進行調整。

模板執行時,必須生成一個 YAML 檔案,這是 Kubernetes 清單的標準格式。只要檔案之間用 --- 分隔,就可以生成多個檔案。

每個 YAML 輸出檔案都以自定義標題表示法開頭,例如

#! manifest.yaml

在以下示例中,一個模板遍歷 compose.yaml 檔案中定義的服務。對於每個服務,都會生成一個專用的 Kubernetes 清單檔案,根據服務命名幷包含指定的配置。

{{ range $name, $service := .services }}
---
#! {{ $name }}-manifest.yaml
# Generated code, do not edit
key: value
## ...
{{ end }}

輸入

您可以透過執行 docker compose config 生成輸入模型。此規範的 YAML 輸出用作 Compose Bridge 轉換的輸入。在模板中,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 模式 以全面瞭解 Compose 模型。此模式概述了 Compose 模型中所有可能的配置及其資料型別。

助手

作為 Go 模板語法的一部分,Compose Bridge 提供了一組 YAML 助手函式,旨在高效地操作模板中的資料。

  • seconds:將持續時間轉換為整數。
  • uppercase:將字串轉換為大寫字元。
  • title:透過將每個單詞的首字母大寫來轉換字串。
  • safe:將字串轉換為安全識別符號,將所有字元(小寫 a-z 除外)替換為 -
  • truncate:從列表中刪除前 N 個元素。
  • join:使用分隔符將列表中的元素分組為一個字串。
  • base64:將字串編碼為 Kubernetes 中用於編碼秘密的 base64 格式。
  • map:根據表示為 "value -> newValue" 字串的對映轉換值。
  • indent:將字串內容縮排 N 個空格。
  • helmValue:將字串內容作為模板值寫入最終檔案。

在以下示例中,模板檢查是否為服務指定了健康檢查間隔,應用 seconds 函式將此間隔轉換為秒,並將該值分配給 periodSeconds 屬性。

{{ if $service.healthcheck.interval }}
            periodSeconds: {{ $service.healthcheck.interval | seconds }}{{ end }}
{{ end }}

自定義

由於 Kubernetes 是一個多功能平臺,有許多方法可以將 Compose 概念對映到 Kubernetes 資源定義。Compose Bridge 允許您自定義轉換以匹配您自己的基礎架構決策和偏好,具有不同級別的靈活性和工作量。

修改預設模板

您可以透過執行 docker compose bridge transformations create --from docker/compose-bridge-kubernetes my-template 來提取預設轉換 docker/compose-bridge-kubernetes 所使用的模板,並根據您的需求調整模板。

模板被提取到以您的模板名稱命名的目錄中,在本例中為 my-template
它包含一個 Dockerfile,允許您建立自己的映象以分發您的模板,以及一個包含模板檔案的目錄。
您可以自由編輯現有檔案、刪除它們或新增新檔案,以便隨後生成滿足您需求的 Kubernetes 清單。
然後,您可以使用生成的 Dockerfile 將您的更改打包到新的轉換映象中,然後您可以將其與 Compose Bridge 一起使用。

$ docker build --tag mycompany/transform --push .

然後,您可以將您的轉換用作替換。

$ docker compose bridge convert --transformations mycompany/transform 

新增您自己的模板

對於 Compose Bridge 預設轉換未管理的資源,您可以構建自己的模板。compose.yaml 模型可能未提供填充目標清單所需的所有配置屬性。如果出現這種情況,您可以依賴 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 時,除了其他轉換之外,還可以使用此自定義模板。

$ docker compose bridge convert \
    --transformation docker/compose-bridge-kubernetes \
    --transformation mycompany/transform 

構建您自己的轉換

雖然 Compose Bridge 模板可以輕鬆進行最小更改的自定義,但您可能希望進行重大更改,或依賴現有轉換工具。

Compose Bridge 轉換是一個 Docker 映象,旨在從 /in/compose.yaml 獲取 Compose 模型並在 /out 下生成平臺清單。這個簡單的約定使得使用 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 轉換約定定義了執行此工具的命令。