從零搭建一個基於Istio的服務網格

Emac發表於2018-05-03

上篇文章從微服務1.0時代的三大痛點(技術門檻高,多語言支援不足和程式碼侵入性強)說起,由此引出服務網格的起源和演化歷史。但古語有云紙上得來終覺淺,絕知此事要躬行,不親自擼一遍命令,怎敢跟人提服務網格?本篇我將教大家如何在本地從零搭建一個基於Istio的服務網格,從而對服務網格有一個更直觀的認識。

1 通關密碼:上上下下左左右右ABAB

  • 原料:Mac一臺,VPN賬號一枚
  • 做法:依序安裝和執行KubernetesMinikube,Istio

從零搭建一個基於Istio的服務網格

2 穿牆大法:Shadowsocks

無論是Kubernetes、Minikube還是Istio,官方提供的安裝文件都非常詳盡,只要英文過關,依葫蘆畫瓢基本上都能跑通。但如果你在國內,還得加一個必要條件,學會如何突破網路審查,俗稱翻牆。

Mac下的翻牆軟體我首推Shadowsocks,同時支援Socks5代理和HTTP代理,最新版本可以從GitHub下載。

3 小Boss: kubectl!

3.1 安裝

Kubernetes是Istio首推的執行平臺,因此作為第一步,我們首先來安裝kubectl,Kubernetes的命令列工具,用來控制Kubernetes叢集。根據官方文件,Mac下安裝kubectl只需要一行命令,brew install kubectl,這簡單、極致的使用者體驗讓你感動的想哭。But wait...

3.2 穿牆1: Brew

你敲完命令,躊躇滿志的按下回車之後,可能會發現,螢幕遲遲沒有輸出,10秒,30秒,1分鐘,3分鐘,10分鐘。。。恭喜你,你被牆了!

Brew預設的映象源是GitHub,而GitHub時不時會被牆,即使不被牆訪問速度有時也慢的令人髮指,導致Brew命令也常常超時甚至失敗。解決辦法要麼換源,要麼給GitHub配上Socks5代理。對碼農而言,我更推薦後一種,方法如下:

  1. 開啟~/.gitconfig檔案,如果不存在則新建

  2. 在檔案末尾新增如下配置並儲存:

[http "https://github.com"]
  proxy = socks5://127.0.0.1:1086
[https "https://github.com"]
  proxy = socks5://127.0.0.1:1086
複製程式碼

注:socks5://127.0.0.1:1086是Shadowsocks預設開啟的Socks5代理地址。

配上Socks5代理之後,一般就可以妥妥的執行Brew命令了。

3.3 驗證

安裝好kubectl之後,直接執行kubectl version檢視版本號。完整的kubectl命令列表在這裡可以找到。如果想進一步學習常見的kubectl命令,可以訪問Kubernetes Playground完成線上練習。

4 中Boss: Minikube!

4.1 安裝

安裝完kubectl,接下來就是在本地搭建Kubernetes叢集,Minikube是最簡單的一種搭建方式,它通過VM模擬了一個單節點的Kubernetes叢集。官方文件給出了Mac下的安裝命令。

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 && \
chmod +x minikube && \
sudo mv minikube /usr/local/bin/
複製程式碼

Minikube預設使用的VM Driver是VirutalBox,因此啟動Minikube之前,還要安裝VirtualBox。

4.2 啟動

安裝好Minikube和VirutalBox之後,可執行如下命令第一次啟動Minikube:

minikube start --docker-env HTTP_PROXY=http://<本機IP>:1087 --docker-env HTTPS_PROXY=http://<本機IP>:1087

注:官方文件給出的啟動命令帶有--vm-driver=xhyve,而事實上最新版本的Minikube已經廢棄了xhyve driver,應去除。

4.3 穿牆2: Docker

你可能已經注意到,上面的啟動命令中帶了兩個--docker-env引數,都指向了Shadowsocks開啟的HTTP代理,為啥呢?還是因為牆。Minikube預設使用Docker作為容器執行時,並在VM中內建了一個Docker守護程式,使用的映象源是DockerHub。如果你經常使用Docker,那你一定知道在國內使用Docker一般都要修改映象源(比如阿里雲的容器映象服務)或者使用代理,否則拉取速度也是慢的令人髮指。由於Minikube使用的是內建的Docker守護程式,使用代理更為方便,但要注意,開啟Shadowsocks HTTP代理時,需要修改代理的偵聽地址為本機IP,而不是預設的127.0.0.1,否則在VM中的Docker守護程式是無法訪問到這個代理的。

注:--docker-env引數只有在第一次啟動Minikube時需要,之後啟動直接執行minikube start即可。如果需要修改代理地址,可編輯~/.minikube/machines/minikube/config.json檔案。

4.4 驗證

安裝完Minikube之後,就可以試著建立第一個Kubernetes服務了,具體步驟參考官方文件

5 大Boss: Istio!

5.1 安裝

拿到了kubectl和Minikube兩大神器,搭建Istio可以說是水到渠成了。基本步驟如下,

  1. 啟動Minikube
minikube start \
  --extra-config=controller-manager.ClusterSigningCertFile="/var/lib/localkube/certs/ca.crt" \
  --extra-config=controller-manager.ClusterSigningKeyFile="/var/lib/localkube/certs/ca.key" \
  --extra-config=apiserver.Admission.PluginNames=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota \
  --kubernetes-version=v1.9.0
複製程式碼
  1. 下載並解壓Istio安裝包

curl -L https://git.io/getLatestIstio | sh -

  1. 進入安裝目錄(假設為istio-0.7),將bin/目錄新增到PATH環境變數
cd istio-0.7
export PATH=$PWD/bin:$PATH
複製程式碼
  1. 部署Istio的核心元件(包括外部流量閘道器Ingress, 管理Envoy例項生命週期的Pilot以及執行訪問控制和使用策略的Mixer)到Kubernetes

kubectl apply -f install/kubernetes/istio.yaml

注:如果你需要啟用Istio的Mutual TLS Authentication(服務身份驗證)功能,可以改為執行kubectl apply -f install/kubernetes/istio-auth.yaml

至此,一個基於Istio的服務網格就算安裝完成了。One more thing,還記得上篇文章提到的服務網格所獨有的邊車模式嗎?為了將一個具體的服務接入Istio,需要為每一個服務例項建立一個配套的邊車程式。根據官方文件,Istio提供手動和自動兩種方式來建立邊車程式,前者發生於部署階段,而後者發生於Pod建立階段,推薦使用後者,具體步驟參考官方文件,限於篇幅,這裡就不再贅述。

5.2 驗證

安裝完Istio之後,可執行kubectl get pods -n istio-system檢視所有Istio相關的Pods,確保這些Pods都處於Running狀態。然後,你就可以開始Istio的探索之旅了,建議從官方提供的Bookinginfo示例應用起步,這裡就不再展開。

NAME                                      READY     STATUS    RESTARTS   AGE
istio-ca-59f6dcb7d9-5mll5                 1/1       Running   18         42d
istio-ingress-779649ff5b-x2qmn            1/1       Running   26         42d
istio-mixer-7f4fd7dff-6l5g5               3/3       Running   54         42d
istio-pilot-5f5f76ddc8-6867m              2/2       Running   36         42d
istio-sidecar-injector-7947777478-gzcfz   1/1       Running   9          41d
複製程式碼

6 小結

以上就是搭建一個基於Istio的服務網格的基本教程,希望能夠幫助你對服務網格有一個更直觀的認識。有關服務網格的進一步介紹,以後有機會我再跟你分享。歡迎你到我的留言板留言交流,和大家一起過過招。

7 參考

相關文章