自訂 Compose Bridge

實驗性

Compose Bridge 是一個 實驗性 產品。

此頁面說明 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 資訊清單檔案,並根據服務命名,且包含指定的設定。

輸入

輸入 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 規格 JSON 綱要輔助工具

作為 Go 範本語法的一部分,Compose Bridge 提供了一組 YAML 輔助函式,旨在有效率地操作範本中的資料

在以下範例中,範本會檢查是否為服務指定了健康檢查間隔,套用 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 資訊清單。
然後,您可以使用產生的 Dockerfile 將您的變更打包到新的轉換映像檔中,然後您可以將其與 Compose Bridge 一起使用

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

然後,您可以使用您的轉換作為替代方案

$ 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 }}
{{ if $service.x-virtual-host }}
  - host: ${{ $service.x-virtual-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 下產生平台資訊清單。這個簡單的協定可以輕鬆地使用 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 轉換協定運行此工具的命令。

後續步驟?