本文已超過一年。較舊的文章可能包含過時的內容。檢查頁面中的資訊自發布以來是否已變得不正確。

Kompose:一個從 Docker-compose 到 Kubernetes 的工具

Skippbox,我們開發了 kompose 這個工具,可以自動將您的 Docker Compose 應用程式轉換為 Kubernetes 清單。讓您只需一個 kompose up 命令即可在 Kubernetes 叢集上啟動 Compose 應用程式。我們非常高興將 kompose 捐贈給 Kubernetes Incubator。因此,這是一個關於它的快速介紹以及促使我們開發它的一些動機。

Docker 對開發人員來說非常棒。它允許每個人快速開始使用已封裝在 Docker 映像中並可在 Docker 註冊表中使用的應用程式。為了構建多容器應用程式,Docker 開發了 Docker-compose(又名 Compose)。Compose 接收基於 yaml 的多容器應用程式清單,並使用單個命令 docker-compose up 啟動所有必需的容器。但是 Compose 僅在本地或 Docker Swarm 叢集上工作。

但是,如果您想使用 Swarm 以外的其他東西呢?當然像 Kubernetes 一樣。

Compose 格式不是用於定義分散式應用程式的標準。因此,您需要以您選擇的容器協調器重新編寫應用程式清單。

我們將 kompose 視為向 Docker 使用者公開 Kubernetes 原則以及輕鬆從 Docker Swarm 遷移到 Kubernetes 以在生產環境中運作您的應用程式的絕佳方式。

在夏季,Kompose 在來自 Red Hat 的 Tomas Kral 和 Suraj Deshmukh 以及來自 Google 的 Janet Kuo 的幫助下找到了新的動力。他們與我們自己的 kompose 首席開發人員 Nguyen An-Tu 一起,使 kompose 更加令人興奮。我們在 SIG-apps 內向 Kubernetes Incubator 提出了 Kompose,並收到了 Kubernetes 社群的普遍批准;您現在可以在 Kubernetes Incubator 中找到 kompose。

Kompose 現在支援 Docker-compose v2 格式,最近新增了持久卷聲明,以及每個 Pod 多個容器。它也可以透過指定與預設 Kubernetes 不同的提供者來用於針對 OpenShift 部署。Kompose 現在也以 Fedora 封裝形式提供,我們期待在未來幾週內在 CentOS 發行版中看到它。

kompose 是一個單一的 Golang 二進制檔案,您可以從 GitHub 上的發行版本構建或安裝它。讓我們跳過構建說明,直接深入研究一個範例。

讓我們試用一下!

使用 Docker 的 Guestbook 應用程式

Guestbook 應用程式已成為 Kubernetes 的規範範例。在 Docker-compose 格式中,可以使用這個最小檔案啟動 guestbook

version: "2"



services:

  redis-master:

    image: gcr.io/google\_containers/redis:e2e

    ports:

      - "6379"

  redis-slave:

    image: gcr.io/google\_samples/gb-redisslave:v1

    ports:

      - "6379"

    environment:

      - GET\_HOSTS\_FROM=dns

  frontend:

    image: gcr.io/google-samples/gb-frontend:v4

    ports:

      - "80:80"

    environment:

      - GET\_HOSTS\_FROM=dns

它由三個服務組成。一個 redis-master 節點,一組可以擴展並透過其 DNS 名稱找到 redis-master 的 redis-slave。以及一個在端口 80 上公開自己的 PHP 前端。產生的應用程式允許您留下簡短的訊息,這些訊息存儲在 redis 叢集中。

要在原始 Docker 主機上使用 docker-compose 啟動它,請執行

$ docker-compose -f docker-guestbook.yml up -d

Creating network "examples\_default" with the default driver

Creating examples\_redis-slave\_1

Creating examples\_frontend\_1

Creating examples\_redis-master\_1

到目前為止一切順利,這是普通的 Docker 用法。現在讓我們看看如何在 Kubernetes 上實現這一點,而無需重新編寫任何內容。

使用 'kompose' 的 Guestbook

Kompose 目前有三個主要命令:up、down 和 convert。為了簡單起見,這裡我們將展示一個單一用法來啟動 Guestbook 應用程式。

與 docker-compose 類似,我們可以使用 kompose up 命令指向代表 Guestbook 應用程式的 Docker-compose 檔案。像這樣

$ kompose -f ./examples/docker-guestbook.yml up

We are going to create Kubernetes deployment and service for your dockerized application.

If you need more kind of controllers, use 'kompose convert' and 'kubectl create -f' instead.



INFO[0000] Successfully created service: redis-master

INFO[0000] Successfully created service: redis-slave

INFO[0000] Successfully created service: frontend

INFO[0000] Successfully created deployment: redis-master

INFO[0000] Successfully created deployment: redis-slave

INFO[0000] Successfully created deployment: frontend



Application has been deployed to Kubernetes. You can run 'kubectl get deployment,svc' for details.

kompose 自動將 Docker-compose 檔案轉換為 Kubernetes 物件。預設情況下,它為每個 compose 服務建立一個部署和一個服務。此外,它還自動偵測到您目前的 Kubernetes 端點,並在其上建立資源。可以使用一組標誌來產生複製控制器、副本集或 Daemon 集,而不是部署。

就是這樣!沒有其他事情要做,轉換自動發生。
現在,如果您已經對 Kubernetes 有所了解,您會熟悉客戶端 kubectl,並且可以檢查叢集上建立了什麼。

$ kubectl get pods,svc,deployments

NAME                             READY        STATUS        RESTARTS     AGE

frontend-3780173733-0ayyx        1/1          Running       0            1m

redis-master-3028862641-8miqn    1/1          Running       0            1m

redis-slave-3788432149-t3ejp     1/1          Running       0            1m

NAME                             CLUSTER-IP   EXTERNAL-IP   PORT(S)      AGE

frontend                         10.0.0.34    \<none\>        80/TCP       1m

redis-master                     10.0.0.219   \<none\>        6379/TCP     1m

redis-slave                      10.0.0.84    \<none\>        6379/TCP     1m

NAME                             DESIRED      CURRENT       UP-TO-DATE



AVAILABLE   AGE

frontend                         1            1             1            1           1m

redis-master                     1            1             1            1           1m

redis-slave                      1            1             1            1           1m

實際上,您看到了三個服務、三個部署和產生的三個 Pod。要快速存取應用程式,請在本地存取前端服務並享受 Guestbook 應用程式,但這次是從 Docker-compose 檔案啟動的。

kompose.png

希望這能讓您快速了解 kompose 並讓您感到興奮。它們有更多令人興奮的功能,例如建立不同類型的資源、建立 Helm charts,甚至使用實驗性的 Docker bundle 格式作為輸入。查看 Lachlan Evenson 關於 將 Docker bundle 與 Kubernetes 一起使用的部落格。有關整體演示,請參閱我們在 KubeCon 上的演講

前往 Kubernetes Incubator 並查看 kompose,它將幫助您輕鬆地從 Docker compose 應用程式遷移到生產環境中的 Kubernetes 叢集。