在 Azure 上部署 Kubernetes 集羣

在實驗、演示的時候,或者是生產過程當中,我常常會須要運行一些 Docker 負載。雖然這在本地計算機上十分容易,可是當你要在雲端運行的時候就有點困難了。相比於本地運行,在雲端運行真的太複雜了。我嘗試了幾個方法,好比在 AWS Beanstalk、AWS ECS 或者 Azure ACS DC/OS 上運行 Docker,可是針對於個人需求來講,這些嘗試太複雜了,並且限制諸多。

Azure 宣佈 Azure Container Service 預支持 Kubernetes,與此同時,Kubernetes 也宣佈支持 ACS,因此是時候嘗試一下 Kubernetes 了。linux

你能夠跳過全部步驟,只閱讀演示部署和說明,點擊連接:https://github.com/chaliy/play-azure-kubernetes。git

介紹

那麼,什麼是 Kubernetes 呢?用一句簡單的話來歸納:它是一個容器編排工具。第一步,將應用程序進行打包,而後 Kubernetes 能夠對打包好的這些應用程序進行部署、運行以及擴展。爲了深刻了解,可能還須要經過 Tutorial 瞭解,可是這個十分容易,你徹底能夠跳過這個步驟直接嘗試如何運行它。github

所需的基礎設施

在本文中,我會使用新的 Azure CLI。安裝十分簡單,大多數狀況下,只須要「pip install azure-cli」就能夠了。
因此如今讓咱們來預覽一下咱們的集羣。首先,你可能須要資源組來隔離你的基礎設施。docker

az group create -n my-very-own-k8s-cluster -l "West Europe"
接下來是規制集羣
az acs create -n my-very-own-k8s-cluster \
 -g my-very-own-k8s-cluster \
 --dns-prefix my-very-own-k8s-cluster \
 --orchestrator-type kubernetes

在等待命令完成的時候,咱們來看一些評論。api

一、若是你的命令出現了一些問題,好比這些命令出現一些無心義的錯誤,添加-debug 參數有點囉嗦,可是會出現一些錯誤。服務器

二、-dnsprefix 是可選的,我的建議仍是要添加上去,否則的話,就會按照「集羣名字+組名字」使用,若是超過 90 個字符的長度,以後在操做過程當中就會出現奇怪的錯誤。app

默認設置下,ACS 用單個 master 和 3 個 agents 來設置集羣。這些步驟默認設置下都是使用 D2 的,因此這個集羣耗費比較高,當你不須要的時候記得清理資源。curl

以及,歡迎閱讀 Kubernetes 的 ACS 引擎之下的內容,連接:https://github.com/Azure/acs-engine/blob/master/docs/kubernetes.md。上述內容給了實施過程當中的一些很棒的觀點。注意了,ACS 文檔沒有使用新的 Azure 工具,因此操做起來會有點複雜。ide

第一個有效負載工具

全部的基礎設施準備完成,如今開始部署 Kubernetes。要管理集羣,那麼就須要 kubectl。你能夠經過如下代碼自動運行(可能須要自行添加到 PATH):

az acs kubernetes install-cli

接下來,你須要用集羣來認證 kubectl。

az acs kubernetes get-credentials -n my-very-own-k8s-cluster \
 -g my-very-k8s-cluster

檢查全部一切是否 OK。這個命令行會提供客戶端和服務器端的版本。

kubectl version

從這裏開始,你已經擁有你所須要的東西來運行你的第一個有效負載。因此讓咱們來建立第一個定義文件,而且嘗試運行。Kubernetes 內的定義文件可使用不少文件格式,我用的是 YAML, 因此咱們用如下內容來建立 hello.yml 文件:

apiVersion: extension/v1beta1
 kind: Deployment
 metadata:
 name: hello # Name of the deployment, just for reference purposes
 spec:
 replica: 1 # Number of instances for the given application
 template:
 metadata:
 labels:
 app: hello
 spec:
 containers:
 - name: ner-uk-ms # Name of container, could be anything you like
 image: chaliy/ner-ms:uk # Docker image to run
 ports:
 -containerPort:8080

目前,理解一些 Kubernetes 術語十分重要。

Pod——容器實例——http://kubernetes.io/docs/user-guide/pods/

Deployment——確保 pods 可以運行,扮演監督的角色——http://kubernetes.io/docs/user-guide/deployments/

Service——將 pod 組成一個系統——http://kubernetes.io/docs/user-guide/services/

因此,對於定義在模版中的單個 pod 來講,咱們剛剛建立的定義文件是個 deployment。如下命令行會拉取Docker鏡像`chaliy/ner-ms:uk`,開啓它的實例而且設置監督員:

kubectl create -f ./hello.yml

如今可使用的命令行不多:

# Retrieve logs associated with deployment
 kubectl logs hello

# List Pods
 kubectl get pods

# List deployments
 kubectl get deployments

# Details about concrete pod, for example in case of errors
 kubectl describe pods/podid

若是你想要從新配置應用程序,能夠在定義文件中修改,好比設置`replicas:10`,而後運行:

kubectl apply -f ./hello.yml

技術上來講,這已經在運行有效負載了。咱們來看看它的運行情況。Kubernetes 的 UI 界面向用戶呈現集羣運行情況。它的運行方式跟應用程序的運行方式是同樣的。固然,若是你不但願這樣的 UI 出如今集羣外面,那麼默認設置下你能夠只在集羣內運行。可是,若是訪問又會如何?

方法很簡單,Kubernetes 實現 Basteon 模式,而且經過簡單的方法代理到你的本地電腦。因此首先你須要運行代理:

kubectl proxy --port=8000

而後,你須要馬上看到 Kubernetes Dashboard 的話。能夠瀏覽:http://localhost:8000/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard
還有就是,你可能須要發佈對集羣外的服務。對於這個,你須要建立 service(對於 Kubernetes),而後使用 expose 命令,用新的 Loadbalancer。

kubectl expose deployment hello --type="LoadBalancer"--port=80 --
 target-port=8080

這個命令行會開始設置新的 load balance,須要一點時間。要檢查它是否運行,要查詢關於 service 的信息:

kubectl get services/hello

以後你就會看到外部 IP 地址,意味着服務已處於 OK 狀態,你能夠用來發送請求。相似於:

curlhttp://EXTERNAL-IP/

全部的腳本均可以在這個網址找到:https://github.com/chaliy/play-azure-kubernetes。在這裏你能夠找到使用 Nginx 代理做爲路由器的一些真實例子。

結論

對於我來講,用戶體驗很棒,可是我也不肯定我會不會繼續使用,由於有幾個問題還在困擾着我:

一、Kubernetes ACS 版本還在預發佈階段,有些功能尚未實現(好比,你還不能對你的集羣進行縮容擴容)。

二、使用成本較高,至少須要 4D2 個節點,每個月最高可能要花費 1000 美圓。使用相對小一點的實例也是能夠的,可是,個人負載類型還不知道如何利用它。

三、目前尚未能夠建立系統的設備。相似於 docker-compose 可以提供相關服務。

相關文章
相關標籤/搜索