自訂 Compose Bridge

需求: Docker Desktop 4.43.0 及更新版本

本頁說明 Compose Bridge 如何利用範本引擎,將 Docker Compose 檔案高效轉換為 Kubernetes 清單。同時也說明如何針對您的特定要求與需求自訂這些範本,或是如何建構自己的轉換方式。

運作方式

Compose Bridge 使用轉換(Transformations)來協助您將 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 轉換的輸入。在範本中,可使用點記法(dot notation)存取 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:將時間長度 (duration) 轉換為整數。
  • uppercase:將字串轉換為大寫字母。
  • title:將字串轉換為每個單字首字母大寫的格式。
  • safe:將字串轉換為安全的識別碼,將所有字元(小寫 a-z 除外)替換為 -
  • truncate:從列表中移除前 N 個元素。
  • join:使用分隔符號將列表中的元素組合成單一字串。
  • base64:將字串編碼為 base64,用於 Kubernetes 中的密鑰 (secret) 編碼。
  • 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 轉換是一個設計為從 /in/compose.yaml 取得 Compose 模型並在 /out 下產生平台清單的 Docker 映像檔。這種簡單的合約機制,讓使用 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 轉換合約執行此工具的指令。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.