1. 程式人生 > >Kubernetes(k8s)中文文件 Meteor on Kuberenetes_Kubernetes中文社群

Kubernetes(k8s)中文文件 Meteor on Kuberenetes_Kubernetes中文社群

譯者:賈瀾鵬

這個例子將會向你展示如何在Kubernetes上打包執行一個Meteor app。

從谷歌的計算引擎開始

Meteor使用MongoDB,並且我們使用GCEPersistentDisk型別的卷作為永久儲存介質。所以,這個例項只使用於谷歌的計算引擎。如果想選用其它的方式,可以去檢視一下卷使用文件

首先,你需要完成如下操作:

  1. 建立一個谷歌雲平臺的專案。

  2. 啟用Google的付費API??

認證谷歌雲並且將谷歌雲的預設專案名稱指向你希望部署Kubernetes叢集的專案:

gcloud auth login
gcloud config set project <project-name>

之後,開啟一個Kubernetes叢集

wget -q -O - https://get.k8s.io | bash

所有細節和其它方式下啟動叢集的方法。

為你的Meteor APP建立一個容器

為了使一個Meteor APP能執行再Kubernetes上,你首先需要建立一個Docker容器。在建立之前你需要安裝DOCKER。一旦這些都具備了,你需要將Dockerfile.dockerignore這2個檔案新增到當前的Meteor工程中。

Dockerfile檔案中應該包含下面的語句。其中的ROOT_URL你應該替換為當前APP的主機名。

FROM chees/meteor-kubernetes
ENV ROOT_URL http://myawesomeapp.com

對於.dockerignore檔案,應該包含下面的語句。它是為了告訴Docker,再建立你的容器時忽略以下指定路徑的檔案。

.meteor/local
packages/*/.build*

你可以在下面的連結中看到一個已經建立起來的Meteor工程:meteor-gke-example。你可以隨意的使用這個例子中的APP。 如果你已經在你的Meteor工程中添加了移動平臺,那麼下面的步驟將不起作用。所以替換你的平臺為 meteor list-platforms

現在,你就可以在你的Meteor工程中執行下面的語句來建立一個容器:

docker build -t my-meteor .

推送一個登錄檔

對於Docker Hub,你需要利用下面的命令向Hub推送一個攜帶了你的使用者名稱的APP圖片,請注意替換<username>為你對應的Hub 使用者名稱。命令如下:

docker tag my-meteor <username>/my-meteor
docker push <username>/my-meteor

對於Google Container Registry,你需要向GCR推送一個攜帶你的工程ID的APP圖片,同時,請注意替換<project>為你的對應工程ID。

docker tag my-meteor gcr.io/<project>/my-meteor
gcloud docker push gcr.io/<project>/my-meteor

執行

現在,你已經容器化了你的Meteor APP,是時候開始建立你的叢集了。編輯meteor-controller.json 同時確保image:與你剛剛推送到Docker Hub或者GCR的容器是相對應的。 我們將需要一個MongoDB作為一個永久的Kubernetes捲來存放資料。我們將利用谷歌的計算引擎永久磁碟。建立MongoDB磁碟的命令如下:

gcloud compute disks create --size=200GB mongo-disk

你可以開啟Mongo去使用那些磁碟,命令如下:

kubectl create -f examples/meteor/mongo-pod.json
kubectl create -f examples/meteor/mongo-service.json

等待Mongo完全啟動,之後你就可以開啟自己的Meteor APP:

kubectl create -f examples/meteor/meteor-service.json
kubectl create -f examples/meteor/meteor-controller.json

需要注意的是,meteor-service.json建立了一個負載均衡器,所以你的APP要求能在Meteor Pods啟動時,有效的通過負載均衡器的IP。我們會再建立RC之前建立一個服務,該服務會提供反向關聯(或者其它的什麼)用以幫助排程程式去排列pod,從而幫助排程程式匹配對應的pods。你可以通過下面的命令獲得你的負載均衡器的IP:

kubectl get service meteor --template="{{range .status.loadBalancer.ingress}} {{.ip}} {{end}}"

之後,你需要在你的環境上開啟你的80號埠。如果是使用谷歌計算引擎的使用者,你需要執行下面的命令:

gcloud compute firewall-rules create meteor-80 --allow=tcp:80 --target-tags kubernetes-minion

接下來呢?

首先,在Dockerfile中的FROM chees/meteor-kubernetes語句會指定Meteor APP的基礎映象。這個映象的構建程式碼放置在示例程式碼工程的dockerbase/子目錄下。你可以通過閱讀Dockerfile檔案中的程式碼來了解docker build的步驟。這個映象是基於Node.js官方映象構建的。它會安裝Meteor並將使用者的程式拷貝進去。其中的最後一行的命令指出了你的app需要通過怎樣的命令在容器中執行起來。

ENTRYPOINT MONGO_URL=mongodb://$MONGO_SERVICE_HOST:$MONGO_SERVICE_PORT /usr/local/bin/node main.js

在上面的命令中,我們能看到傳遞到Meteor App的MongoDB主機和埠資訊。MONGO_SERVICE...這個環境變數是由Kubernetes設定的,同時,由mongo-service.json指定了名為mongo的伺服器的詳細資訊。

也許你已經瞭解,Meteor需要使用TCP長連線,以及持續性的Session(Sticky Sessions)。通過Kubernetes使用者能夠輕鬆的在叢集Scale out時保持節點的Session相關性。在meteor-service.json檔案中所包含的"sessionAffinity"* : *"ClientIP",就向我們提供了這些。

就向之前所提到的,mongo容器使用了一個被Kubernetes對映到永久磁碟的卷。在mongo-pod.json中,容器對指定的捲進行了劃分:

{
    "volumeMounts": [
      {
        "name": "mongo-disk",
        "mountPath": "/data/db"
      }

mongo-disk是指超出容器範圍的卷:

{
"volumes": [
  {
    "name": "mongo-disk",
    "gcePersistentDisk": {
      "pdName": "mongo-disk",
      "fsType": "ext4"
    }
  }
],
K8S中文社群微信公眾號