本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Kompose:一個從 Docker-compose 到 Kubernetes 的工具
在Skippbox,我們開發了 kompose,一個自動將您的Docker Compose應用程式轉換為Kubernetes清單的工具。它允許您透過一個簡單的`kompose up`命令在Kubernetes叢集上啟動一個Compose應用程式。我們非常高興能將kompose捐贈給Kubernetes孵化器。下面將快速介紹它以及促使我們開發它的一些動因。
Docker 對開發者來說非常棒。它讓每個人都能快速開始使用已打包在 Docker 映象中並可在 Docker Registry 上獲取的應用程式。為了構建多容器應用程式,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 是一個用 Go 語言編寫的獨立二進位制檔案,您可以從 GitHub 上的釋出頁面構建或安裝。讓我們跳過構建說明,直接進入一個示例。
讓我們來試試看!
使用Docker的Guestbook應用程式
留言簿應用程式已成為 Kubernetes 的典型示例。在 Docker-compose 格式中,留言簿可以使用這個最小檔案啟動
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節點,一組redis-slave可以透過其DNS名稱進行擴容並找到redis-master。以及一個在埠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”的留言簿
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 端點,並在其上建立了資源。可以使用一組標誌來生成 Replication Controllers、Replica Sets 或 Daemon Sets,而不是 Deployments。
就是這樣!無需其他操作,轉換自動完成。
現在,如果你對 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。要快速訪問應用程式,請在本地訪問 frontend 服務,享受留言簿應用程式,但這次是從 Docker-compose 檔案啟動的。
希望這能讓您快速瞭解 kompose 並感到興奮。還有更多激動人心的功能,例如建立不同型別的資源、建立 Helm Charts,甚至使用實驗性的 Docker bundle 格式作為輸入。請檢視 Lachlan Evenson 關於 使用 Docker bundle 與 Kubernetes 的部落格。要獲取整體演示,請觀看我們在 KubeCon 上的演講
前往 Kubernetes Incubator 並檢視 kompose,它將幫助您輕鬆地將 Docker compose 應用程式遷移到生產環境中的 Kubernetes 叢集。
- 下載 Kubernetes
- 在 GitHub 上參與 Kubernetes 專案
- 在 Stack Overflow 上提問(或回答問題)
- 在 Slack 上與社群聯絡
- 在 Twitter 上關注我們 @Kubernetesio 獲取最新更新