Kubernetes入門指南:部署一個Node.js Docker應用 — SitePoint
容器技術已經存在了很多年,Docker使它真正成為主流。因為Docker提供了一套簡單易用的介面來使用容器,現在已有許多的公司和開發者使用容器來裝載他們的應用。
然而,對於任何有一定規模的應用程式,你一定不會只要部署“一個容器”,而是部署在大量主機上的許多容器。 這這篇文章中,我們會來看一看 Kubernetes, 一個用來自動化部署、控制容器擴充套件/收縮以及管理容器化應用程式的開源系統。
Kubernetes解決了什麼問題?
檢視作者的更多文章
在Docker中,你有一些像是docker run 和 docker stop 這樣簡單的命令來啟動或關閉一個容器。不像這些讓你在一個容器上操作的簡單命令,並沒有docker deploy這樣的命令來向大量的主機推送新的映象。
最近出現了很多工具來解決這個“容器編排”問題;流行的有 Mesos, Docker Swarm (現在成了 Docker 引擎的一部分), Nomad, 和 Kubernetes。 他們都有各自的利弊,但是,可以說,Kubernetes在解決“容器編排”問題這一點上走的最遠.
Kubernetes (也被稱為 ‘k8s’) 提供了強大的資料抽象,可以完全的解耦各種應用程式操作,比如通過基礎架構操作實現服務部署和控制容器擴充套件/收縮。所以,有了Kubernetes,你的程式碼不用在個人主機或虛擬機器上執行,而是執行在被Kubernetes連線成基礎架構的裝載著容器的海量計算機上。
Kubernetes 概念學習
Kubernetes 是C/S架構,Kubernetes 的服務執行在你部署應用程式的叢集(大量主機)上,而通常你和叢集的互動是通過一個客戶端完成的,比如 kubectl
終端。
Pods
豆粒 (pod)是Kubernetes處理大量容器的基本單位。如果有兩個或多個容器總是需要一起工作,並且需要在一臺機器上,那麼就把它們定義為一個 pod
。豆粒是一個有用的資料抽象,甚至有人 建議 讓pod成為docker中的第一類物件。
Node
一個節點(node)是一臺執行著Kubernetes,可以安排pods到上面的物理機或虛擬機器。
Label
標籤(label)是一個用來標識資源的鍵值對。你可以用lebel標識所有你所有的pods
Selector
選擇器(Selections)可以讓你用lebel來搜尋/過濾資源。 比如像上邊的例子裡, 要獲得所有production相關的pods你的selector應該是 “role=production”。
Service
一項服務(Service)定義了一系列的pods (通常由一個“selector”選定)和一種訪問它們的方法,比如一個穩定的IP地址和對映的DNS名稱。
使用Kubernetes在GKE上部署一個 Node.js 應用
現在,我們對Kubernetes的基本概念有了些認識,再來實際操作下看看。比如在谷歌容器引擎 Google Container Engine (也稱GKE)上部署一個Node.js應用程式。你要有一個Google Cloud Platform 賬號 (谷歌提供了 300美元試用贈金).
1. 安裝 Google Cloud SDK and Kubernetes 客戶端
kubectl
是用來執行命令連線Kubernetes叢集的命令列工具. 你可以把它當作Google Cloud SDK的一部分來安裝。在安裝好Google Cloud SDK 後,執行下面的命令來安裝kubectl
:
`$ gcloud components install kubectl`
如果你使用的是 Mac則執行 brew install kubectl
。執行kubectl version
命令來驗證是否安裝成功.
你也需要用你谷歌雲賬號的證書安裝 Google cloud SDK ,只需要執行 gcloud init
命令然後跟著提示說明操作就可以了。
2. 建立一個 GCP工程
所有的Google Cloud Platform資源都被建立在一個工程裡, 所以 在網頁UI上建立一個.
在使用CLI時設定一個預設的工程ID通過執行:
`gcloud config set project {PROJECT_ID}`
3. 建立一個你的應用程式的Docker映象
這裡是一個我們一會兒會用到的應用程式: express-hello-world。從 Dockerfile 裡你會知道,我們正在使用一個現有的Node.js映象,它來自 dockerhub。現在,我們將會建立自己的應用映象,通過執行命令:
`$ docker build -t hello-world-image .`
在本地執行應用,通過:
`docker run --name hello-world -p 3000:3000 hello-world-image`
如果你訪問 localhost:3000
你就會得到響應。
4. 建立一個叢集
現在我們將會用三個例項(虛擬機器)建立一個叢集, 在例項上會部署我們的應用程式。 你可以在 容器引擎頁面 用相當直觀的網頁UI來操作,也可以通過執行下面的命令列:
`$ gcloud container clusters create {NAME} --zone {ZONE}`
讓我們在us-east1-b
裡建立一個叫做 hello-world-cluster
的叢集通過執行命令:
`$ gcloud container clusters create hello-world-cluster --zone us-east1-b --machine-type f1-micro`
這樣就啟動了一個三個節點的叢集。我們使用 f1-micro 當作機器型別是因為它是可用的最小值,可以確保最小開銷。
將 kubectl
客戶端和你的叢集連線起來,通過執行:
`gcloud container clusters get-credentials hello-world-cluster --zone us-east1-b`
這樣,現在我們就有了一個docker映象和一個叢集。我們要將映象部署到叢集上並且啟動容器,它們將響應服務請求。
5. 上傳 Docker映象到Google Container Image Registry
谷歌容器映象註冊中心是一個雲註冊中心,你可以推送你的映象到這裡,這些映象將自動適用於你的容器引擎叢集。 要推送一個映象,你需要在建立它時使用一個合適的名字。
要建立這個應用的容器映象並打標籤準備上傳,執行下面的命令:
`$ docker build -t gcr.io/{PROJECT_ID}/hello-world-image:v1 .`
v1
是映象的 tag (標籤)。
下一步是上傳我們剛才建立的映象:
`$ gcloud docker -- push gcr.io/{PROJECT_ID}/hello-world-image:v1`
6. 第一次部署
現在我們在雲伺服器上有了一個叢集和一個映象,讓我們用Kubernetes將映象部署到叢集上吧。我們會通過建立一個 deployment
規格檔案來實現。 部署配置是一種kubernetes資源而所有的kubernetes資源都可以通過一個規格檔案被宣告性定義。這個規格檔案規定了資源的期望狀態,而Kubernetes 則會計算出怎樣從當前狀態到達期望狀態 。
讓我們為第一次部署建立一個規格檔案:
deployment.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: hello-world-deployment
spec:
replicas: 2
template:
metadata:
labels: # labels to select/identify the deployment
app: hello-world
spec: # pod spec
containers:
- name: hello-world
image: hello-world-image:v1 # image we pushed
ports:
- containerPort: 3000
這個規格檔案表示: 啟動兩個pods,每個pod都被給出的pod的規格定義,並且都應該有一個包含著我們推送過的 hello-world-image:v1
映象的容器。
現在, 執行:
`$ kubectl create -f deployment.yml --save-config`
你可以通過執行 kubectl get deployments
檢視部署狀態。如果想檢視部署建立的pod,執行這個命令: kubectl get pods
。你可以看到正在執行的pods:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-world-deployment-629197995-ndmrf 1/1 Running 0 27s
hello-world-deployment-629197995-tlx41 1/1 Running 0 27s
注意我們有兩個pods正在執行,因為我們在deployment.yml檔案中設定的副本個數是2。
為確保服務已經啟動,檢視日誌通過執行:
`$ kubectl logs {pod-name} # kubectl logs hello-world-deployment-629197995-ndmrf`
7. 向網際網路公開服務
要向網際網路公開服務,你必須將你的虛擬機器置於負載均衡器之下。為此我們建立一個 Kubernetes Service
。
`$ kubectl expose deployment hello-world-deployment --type="LoadBalancer"`
這種場景下, 它建立了一個service
物件 (一個service也是一種Kubernetes資源, 就像是 Deployment) 和一個Google Cloud 負載均衡器.
執行 kubectl get services
來檢視你服務的公開IP, 控制檯輸出看起來應該是這樣:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-world-deployment 10.103.254.137 35.185.127.224 3000:30877/TCP 9m
kubernetes 10.103.240.1 <none> 443/TCP 17d
訪問 http://:
獲得服務。 你也可以購買一個自定義域名並將它指向這個IP。
8. 控制服務的擴充套件/收縮
假設你的服務開始有了更多的流量,你需要啟動更多你應用程式的例項。要在這種情形下擴充套件服務,只需要編輯你的 deployment.yml 檔案,改變 replicas
的數值為, 比如說3,接著執行 kubectl apply -f deployment.yml
,然後你立刻就會有三個pods在執行。這個也可以設定成自動擴充套件,不過那就超出這篇教程的範圍了。
9. 清理
做完後別忘了清理資源,否則他們將會繼續吃掉你的谷歌積分!
$ kubectl delete service/hello-world-deployment
$ kubectl delete deployment/hello-world-deployment
$ gcloud container clusters delete hello-world-cluster --zone us-east1-b
總結
在這篇教程中我們已經覆蓋了很多知識,但是就Kubernetes來看,這還只是九牛一毛。還有很多東西你可以做,比如通過一條語句將你的服務擴充套件到更多pods,或者在pods上為亞馬遜網路服務證書之類的東西增加secret
,等等。 當然,這已經足夠讓你有個好的開始。關注 kubernetes.io 學習更多!