Kubernetes(k8s)中文文件 Meteor on Kuberenetes_Kubernetes中文社群
譯者:賈瀾鵬
這個例子將會向你展示如何在Kubernetes上打包執行一個Meteor app。
從谷歌的計算引擎開始
Meteor使用MongoDB,並且我們使用GCEPersistentDisk型別的卷作為永久儲存介質。所以,這個例項只使用於谷歌的計算引擎。如果想選用其它的方式,可以去檢視一下卷使用文件。
首先,你需要完成如下操作:
-
建立一個谷歌雲平臺的專案。
-
啟用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"
}
}
],