自訂 Compose Bridge
本頁說明 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 轉換合約執行此工具的指令。