1. 程式人生 > >如何使用Rancher 2.0在Kubernetes集群上部署Istio

如何使用Rancher 2.0在Kubernetes集群上部署Istio

less ext mon http evel uic describe face rancher

Service mesh旨在解決雲原生應用之間服務拓撲的連接問題。如果你想要構建雲原生應用,那麽就需要Service mesh。Istio是Service mesh中的一個明星項目,在Istio文檔中對其有非常全面的介紹:https://istio.io/docs/concepts/what-is-istio/。Istio基於Envoy Proxy,是一個極其有前景的Service mesh解決方案,有多家科技巨頭對其進行聯合開發。


目前,Istio最適合Kubernetes,但未來也會支持其他平臺。因此,為了部署Istio並且展示其功能,首先需要一個Kubernetes集群。滿足這一條件之後,使用Rancher 2.0將十分容易。


前期準備


為了能夠順利demo,你需要做如下準備:

  • 一個Google Cloud賬號,免費的即可

  • 一個Ubuntu 16.04實例(這將是Rancher實例的運行環境)

  • 一個部署於Google Cloud Platform並且使用GKE服務的Kubernetes集群。本次demo使用的是1.10.5-gke.2版本

  • Istio 0.8.0(這是本文成稿時使用的版本,現在Istio 1.0已發布)

一般情況下,本教程中的步驟對於更新的版本也適用。

啟動Rancher 2.0


首先,啟動一個Rancher 2.0實例。關於如何啟動Rancher 2.0,可以參考Rancher官網上的入門教程,非常簡潔直觀(https://rancher.com/quick-start/

)。必要的步驟也會在下文中列出。

本文示例將使用Google Cloud Platform,所以我們首先啟動一個Ubuntu實例並且通過Console 或者CLI(https://cloud.google.com/compute/docs/instances/create-start-instance)。使用HTTP和HTTPs協議與其通信。實現上述目的的命令如下:


gcloud compute --project=rancher-20 instances create rancher-20 --zone=europe-west2-a --machine-type=n1-standard-1 --tags=http-server,https-server --image=ubuntu-1604-xenial-v20180627 --image-project=ubuntu-os-cloud

gcloud compute --project=rancher-20 firewall-rules create default-allow-http --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=http-server

gcloud compute --project=rancher-20 firewall-rules create default-allow-https --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:443 --source-ranges=0.0.0.0/0 --target-tags=https-server

請確保Rancher 實例至少有1 vCPU和大約4GB的RAM可用。

接著,通過ssh登錄到Ubuntu實例並且安裝Docker(https://docs.docker.com/install/linux/docker-ce/ubuntu/)。Docker安裝完成之後,即可啟動Rancher驗證其是否正在運行。


ubuntu@rancher-20:~$ sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher
Unable to find image 'rancher/rancher:latest' locally
latest: Pulling from rancher/rancher
6b98dfc16071: Pull complete
4001a1209541: Pull complete
6319fc68c576: Pull complete
b24603670dc3: Pull complete
97f170c87c6f: Pull complete
c5880aba2145: Pull complete
de3fa5ee4e0d: Pull complete
c973e0300d3b: Pull complete
d0f63a28838b: Pull complete
b5f0c036e778: Pull complete
Digest: sha256:3f042503cda9c9de63f9851748810012de01de380d0eca5f1f296d9b63ba7cd5
Status: Downloaded newer image for rancher/rancher:latest
2f496a88b82abaf28e653567d8754b3b24a2215420967ed9b817333ef6d6c52f
ubuntu@rancher-20:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                      NAMES
2f496a88b82a        rancher/rancher     "rancher --http-list…"   About a minute ago   Up 59 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   elegant_volhard

獲得Ubuntu實例的公共IP地址,並用你的瀏覽器訪問它。

$ gcloud compute instances describe rancher-20 --project=rancher-20 --format="value(networkInterfaces[0].accessConfigs[0].natIP)"
35.189.72.39

接著頁面會重新跳轉到Rancher的HTTPs協議頁面上,並且你將看到瀏覽器的警告。因為Rancher使用的是自簽名證書。不需要理會這些警告,因為你已經啟動了實例(千萬不要在不受信任的網站上進行這項操作),接下來開始設置管理員密碼和服務器URL來啟動Rancher 2.0。下面就可以開始啟動Kubernetes集群了。


啟動一個Kubernetes集群


首先,你需要一個附加以下角色的Google雲服務賬號:Compute Viewer,Kubernetes Engine Admin, Service Account User, Project Viewer。接著,你需要生成服務賬戶密鑰,具體步驟請參考:https://cloud.google.com/iam/docs/creating-managing-service-account-keys

現在你可以用你的服務賬戶密鑰來使用Rancher 2.0啟動一個Kubernetes集群(使用默認的Compute Engine服務帳戶是安全的):


gcloud iam service-accounts keys create ./key.json     --iam-account <SA-NAME>@developer.gserviceaccount.com


請留意<SA-NAME>@developer.gserviceaccount.com值,你稍後還會用到它。

現在,你已經做好啟動集群的準備工作了。打開Rancher的面板,然後點擊【添加集群/Add Cluster】。你需要執行以下操作:

  1. 在選擇Kubernetes托管服務提供商時,選擇GCE;

  2. 為你的集群起一個名字,比如rancher-demo;

  3. 將服務密鑰詳細信息從上述步驟中生成的key.json文件導出或復制粘貼到Service Account字段中。

接著去【配置節點/Configure Nodes】選項並按如下選擇:

  1. Kubernetes版本的選擇,你可以選擇最新版本,不過本測試是在1.10.5-gke.2版本上進行的;

  2. 區域的選擇,選擇離你最近的區域;

  3. 機器類型的選擇,至少需要 n1-standard-1;

  4. 至於節點數,對於Istio Demo來說,至少需要4個節點。

當上述內容設置完成之後,你的設置頁面如下圖所示:


技術分享圖片


毫不猶豫地點擊【創建/Create】吧。


幾分鐘之後,你可以在Rancher的面板上看到集群處於活躍狀態。還記得上文提到的<SA-NAME>@developer.gserviceaccount.com值嗎?現在它要派上用場了。你需要用它來授予當前用戶群集管理員權限(需要管理員權限才能為Istio創建必要的RBAC規則)。為此,你需要點擊Rancher面板上rancher-demo的集群名字,然後進入rancher-demo的集群面板。

現在啟動kubectl,這將打開這個特定群集的kubectl命令行。你還可以導出Kubeconfig文件,與本地安裝的kubectl一起使用。基於本次實例的目的,使用Rancher提供的命令行就可以了。你打開了命令行之後,運行下列命令:


> kubectl create clusterrolebinding cluster-admin-binding     --clusterrole=cluster-admin     --user=<SA-NAME>@developer.gserviceaccount.com

clusterrolebinding "cluster-admin-binding" created


在Rancher上部署Istio


Istio有一個Helm包,Rancher可以用它安裝Istio。想要獲得官方的Istio Helm包,需要將Istio的庫添加到Rancher的應用目錄裏。為此,首先要訪問Rancher Global View,進入目錄選項,並選擇【添加目錄】,名字填寫istio-github,目錄URL為https://github.com/istio/istio.git(Rancher可以處理git clone處理的任何事情),在Branch的部分,你可以寫branch名字,並將其設置為master。設置完成後,應該如下截圖所示:


技術分享圖片

點擊【創建/Create】。


在這一步,你將開始使用Rancher Catalog部署Istio。首先,訪問rancher-demo集群的默認項目,並且選擇目錄應用。當你點擊【啟動/Launch】之後,你將看到許多默認可用的應用。由於此demo是關於Istio的,在【所有目錄/All Catalogs】中選擇istio-github目錄,也就是你剛剛自行創建的那個。這將為您提供兩個選項:istio和istio-remote。選擇istio並點擊【查看詳情/View Details】,你將看到部署Istio的選項,按如下選擇:

  1. 設置名字為istio-demo;

  2. 讓模板版本保持為0.8.0;

  3. 默認的istio的命名空間是istio-system,因此這裏就將命名空間設置為istio-system;

  4. 在默認情況下,Istio不會加密組件之間的訪問,但加密功能挺重要的,因此我們需要把加密這一功能加上,;

  5. Istio的helm chart默認不添加Grafana,我們也應該把它加上。


點擊Add Answer,將global.controlPlaneSecurityEnabledgrafana.enabled的值設置為true。即可添加上述功能。


完成上述操作之後,界面應該如下圖所示:


技術分享圖片


點擊【啟動/Launch】。


如果你現在看到工作負載的標簽,那麽你應該能看到Istio的所有組件正在你的集群裏運行,同時請確保所有的工作負載都是綠色的。此外,還需要檢查負載均衡標簽,istio-ingressistio-ingressgateway都應該處於活躍狀態。

如果istio-ingressgateway處於待定(Pending)狀態,那麽你需要再次申請istio-ingressgateway服務。具體步驟是:點擊Import Yaml;對於Import Mode,選擇【集群:將任何資源直接導入此集群】Cluster: Direct import of any resources into this cluster;將 istio-demo-ingressgateway.yaml 服務復制/粘貼到 Import Yaml 編輯器並點擊導入:

這一步驟將解決 istio-ingressgateway待定狀態的問題。

現在,你需要在Rancher的面板上檢查Istio所有的工作負載、負載均衡以及服務發現均處於良好狀態。

最後還有一樣東西需要添加:在你的默認命名空間裏添加一個istio-injected標簽,Istio sidecar容器會自動註入你的節點,運行下方的kubectl命令(如上文所述,你可以從Rancher內部啟動kubectl)。


> kubectl label namespace default istio-injection=enabled
namespace "default" labeled
> kubectl get namespace -L istio-injection
NAME            STATUS    AGE       ISTIO-INJECTION
cattle-system   Active    1h
default         Active    1h        enabled
istio-system    Active    37m
kube-public     Active    1h
kube-system     Active    1h
>


這一標簽將使得Istio-Sidecar-Injector自動將Envoy容器註入您的應用程序節點。


部署Bookinfo示例應用


現在,你可以開始部署一個測試應用並且測試Istio的強大功能。首先,部署Bookinfo示例應用。這個應用有趣的部分在於它有三個版本的reviews程序同時運行。我們可-以在這三個版本的程序中體驗到Istio的一些功能。接著,訪問rancher-demo的默認項目中的工作負載來部署Bookinfo app,具體的操作是:


  1. 點擊Import Yaml;下載bookinfo.yaml(https://info.rancher.com/hubfs/bookinfo.yaml)到本地;

  2. 當你進入Import Yaml菜單之後,通過從文件讀取,將其上傳至Rancher;

  3. 對於 Import Mode,選擇【集群:將任何資源直接導入此集群】Cluster: Direct import of any resources into this cluster;

  4. 點擊【導入/Import】。

這應該為您的rancher-demo Default項目增加6個工作負載。如下圖:


技術分享圖片


現在,通過Istio暴露Bookinfo app,你需要應用此bookinfo-gateway.yaml(https://info.rancher.com/hubfs/bookinfo-gateway.yaml),操作方式與bookinfo.yaml相同。此時,你可以用瀏覽器訪問bookinfo app。你有兩種方式可以獲取istio-ingressgateway負載均衡器的外部IP地址:

第一,從Rancher中獲取。訪問負載均衡,從右手邊的菜單欄選擇View in API。它將打開一個新的瀏覽器頁面,在那搜索publicEndpoints -> addresses,你就可以看到公共IP地址了。

第二,通過kubectl獲取:

> export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
> echo $INGRESS_HOST


用你的瀏覽器訪問: http://${INGRESS_HOST}/productpage,然後你應該看到Bookinfo app。多次刷新頁面時,你應該看到 Book Reviews部分有三個不同版本:第一個版本沒有星星;第二個版本有黑星星;第三個版本有紅星星。


使用Istio,您可以限制您的應用僅路由到應用的第一個版本。具體操作為:導入 route-rule-all-v1.yaml( https://info.rancher.com/hubfs/route-rule-all-v1.yaml)到Rancher,幾秒之後再刷新頁面,你將不會在reviews上看到任何星星。

除此之外,你也可以僅將流量路由到一組用戶。當你導入route-rule-reviews-test-v2.yaml到Rancher之後,使用jason這個用戶名(無需密碼)登錄Bookinfo app,你應該只能看到版本2的reviews(即有黑星星的版本)。但登出之後,你僅能看到版本1reviews的app。

至此,你已經體會了Istio的強大功能。當然,這並非全部,Istio還有很多其他功能。創建此設置後,您可以完成Istio文檔中的任務。


Istio的遙感


現在是時候深入了解Istio另一個更有用的功能 :默認情況下提供指標。

讓我們從Grafana開始。當我們部署Istio時,值設置為true的grafana.enabled創建了一個grafana實例,並配置為收集Istio的指標以幾個面板中顯示它們。默認情況下,Grafana的服務不會公開顯示,因此想要查看指標,首先需要將Grafana的服務暴露給公共IP地址。當然,還有另一個選項也可以暴露服務:NodePort(https://kubernetes.io/docs/concepts/services-networking/service/#nodeport),但是這要求你在Google Cloud Platform防火墻的所有節點上開放Nodeport,這不止有一項任務,因此通過公共IP地址暴露服務更為簡單。

為此,在rancher-demo的默認項目中訪問工作負載並選擇【服務發現】標簽。當所有在集群上的工作都完成之後,應該有5項服務在默認的命名空間內,有12項服務在istio-system命名空間內,並且所有這些服務都處於活躍狀態。接著,選擇grafana服務,並且從右邊的菜單欄內選擇 View/Edit YAML。


技術分享圖片


找到包含type: ClusterIP的那行,將其改為type: LoadBalancer,並點擊【保存/Save】。然後它應該開始在Google Cloud Platform中配置負載均衡器,並在其默認端口3000上暴露Grafana。如果想要獲取Grafana的公共IP地址的話,只需重復bookinfo示例中獲取IP地址的步驟即可,即在API中查看grafana服務,你可以在其中找到IP地址,或通過kubectl獲取它:


export GRAFANA_HOST=$(kubectl -n istio-system get service grafana -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo $GRAFANA_HOST


用你的瀏覽器訪問:http://${GRAFANA_HOST}:3000/,選擇其中一個面板,比如 Istio Service。通過此前應用的配置,我們限制了流量,僅顯示版本1的reveiws應用。從服務的下拉菜單中選擇 reviews.default.svc.cluster.local,就可以從圖表中查看。現在使用以下命令從Rancher的kubectl生成一些流量:


export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
for i in {1..1000}; do curl -o /dev/null -s -w "%{http_code}\n" http://${INGRESS_HOST}/productpage; sleep 0.2; done


需要等待約5分鐘,為Grafana生成的流量將會顯示在如下面板上:


技術分享圖片

如果你滾動面板,在SERVICE WORKLOADS下你將看到Incoming Requests by Destination And Response Code的圖表,它要求Reviews應用程序只在v1端點結束。如果你使用以下命令,生成對版本2的應用的請求(請記得用戶jason可以訪問版本2的reviews 應用):


export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
for i in {1..1000}; do curl -o /dev/null -s -w "%{http_code}\n" --cookie "user=jason" http://${INGRESS_HOST}/productpage; sleep 0.2; done


你應該也可以看到顯示在版本2的應用上的請求:

技術分享圖片


用同樣的方式,也可能可以暴露並且看到Istio其他默認的指標,比如Prometheus, Tracing 和ServiceGraph。


總結與思考


正如你所看到的,Istio是一個具有強大功能並且十分實用的service mesh平臺。在未來,它一定會成為雲原生生態中一個核心工具。但目前, Istio仍暫不建議進入生產環境。引用Kelsey Hightower的一句話:“不要只消耗它,將它部署到生產環境中。你將成為新聞焦點”。無論如何,請你堅信,在不久的將來,Istio一定會被部署到生產環境中。

至於Rancher 2.0,它對於查看Kubernetes集群狀態、所有的工作負載、服務以及節點都十分實用。它通過WebUI提供了一種簡易的方式來管理集群並通過Helm Charts部署應用,即便對於不太熟悉Kubernetes的人來說,Rancher也十分容易上手。使用Rancher 2.0,你會擁有管理Kubernetes集群所需的一切,並對其狀態有一個很好的概覽。我相信,Rancher的小夥伴們之後會繼續添加越來越多實用的功能來不斷完善Rancher。


如何使用Rancher 2.0在Kubernetes集群上部署Istio