上篇文章從微服務1.0時代的三大痛點(技術門檻高,多語言支援不足和程式碼侵入性強)說起,由此引出服務網格的起源和演化歷史。但古語有云
紙上得來終覺淺,絕知此事要躬行
,不親自擼一遍命令,怎敢跟人提服務網格?本篇我將教大家如何在本地從零搭建一個基於Istio的服務網格,從而對服務網格有一個更直觀的認識。
1 通關密碼:上上下下左左右右ABAB
- 原料:Mac一臺,VPN賬號一枚
- 做法:依序安裝和執行Kubernetes,Minikube,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代理。對碼農而言,我更推薦後一種,方法如下:
-
開啟~/.gitconfig檔案,如果不存在則新建
-
在檔案末尾新增如下配置並儲存:
[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可以說是水到渠成了。基本步驟如下,
- 啟動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
複製程式碼
- 下載並解壓Istio安裝包
curl -L https://git.io/getLatestIstio | sh -
- 進入安裝目錄(假設為
istio-0.7
),將bin/
目錄新增到PATH
環境變數
cd istio-0.7
export PATH=$PWD/bin:$PATH
複製程式碼
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的服務網格的基本教程,希望能夠幫助你對服務網格有一個更直觀的認識。有關服務網格的進一步介紹,以後有機會我再跟你分享。歡迎你到我的留言板留言交流,和大家一起過過招。