1. 程式人生 > >Kubernetes入門指南:部署一個Node.js Docker應用 — SitePoint

Kubernetes入門指南:部署一個Node.js Docker應用 — SitePoint

A team of workers with a crane loading containers onto the back of a whale. Kubernetes and Docker.

容器技術已經存在了很多年,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

,比如“role=production”標識production業務。

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 學習更多!