1. 程式人生 > >【譯文連載】 理解Istio服務網格(第二章 安裝)

【譯文連載】 理解Istio服務網格(第二章 安裝)

全書目錄

第一章 概述

本文目錄

1.命令列工具安裝

2. Kubernetes/OpenShift安裝

3. Istio安裝

4.示例Java微服務安裝

4.1 原始碼概覽

4.2 編譯和部署customer服務

4.3 編譯和部署Preference服務

4.4 編譯和部署recommendation服務

 

本章中,我們會介紹如何在Kubernetes上安裝Istio。Istio並沒有和Kubernets繫結,實際上,它合適很多種基礎架構平臺。但是,Kubernetes因為原生支援邊車部署(sidecar deployment)概念,因此它是執行Istio的最佳平臺之一。你可以使用任何版本的Kubernetes。本章中,我們將使用Minishift,這是一個可以讓你的OpenShift安裝並執行在本地虛擬機器上的工具,而OpenShift則是一個面向開發者的Kubernetes企業發行版。

1. 命令列工具安裝

​作為一個開發者,你可能已有了各種工具,但為了清晰起見,我們還是給個本書所需的工具列表:

  • Minishift:這是minikube的紅帽發行版

  • VirtualBox:提供虛擬機器的虛擬化工具

  • Mac/Windows環境上的Docker:Docker客戶端

  • Kubectl:本書中我們主要會使用oc命令列,它基本上能替代kubectl,並可互換著使用。

  • Oc:minishift oc-env 命令列會輸出oc命令列的路徑,因此你不用單獨下載了。

  • OpenJDK:你需要能訪問javac和java命令列工具

  • Maven:用於編譯Java專案

  • Stern:為了方便檢視日誌

  • Siege:用於第四章中的Istio壓力測試

  • Git:通過 git clone 命令下載示例程式碼

  • istioctl:會通過下文中的部署被安裝

  • curl和tar:要在bash中用到

2. OpenShift/Kubernetes安裝

在安裝環境之前,你應該很清楚你將建立很多服務。你將安裝Istio控制平面、一些支援效能指標和視覺化的應用程式,以及示例應用程式服務。為此,用於執行Kubernetes的虛擬機器(VM)需要有足夠的資源。我們建議使用8 GB記憶體和3個CPU核的虛擬機器,但本書中包含的示例在4 GB記憶體和2個CPU核虛擬機器上也能成功執行。 

Minishift安裝好以後,你可以引導環境了,通過執行以下命令列:

    #!/bin/bash
    export MINISHIFT_HOME=~/minishift_1.27.0
    export PATH=$MINISHIFT_HOME:$PATH
    minishift profile set tutorial
    minishift config set memory 8GB
    minishift config set cpus 3
    minishift config set vm-driver virtualbox
    minishift config set image-caching true
    minishift addon enable admin-user
    minishift addon enable anyuid
    minishift config set openshift-version v3.11.0
    minishift start

然後,你可以進行環境配置了,然後就可以訪問Minishift、Docker守護程序以及登入Kubernetes叢集了:

    eval $(minishift oc-env)
    eval $(minishift docker-env)
    oc login $(minishift ip):8443 -u admin -p admin

如果一切順利,你能執行下面的命令:

oc get node
    NAME        STATUS    AGE       VERSION
    localhost   Ready     5m        v1.11.0+d4cacc0

這時,你可以執行下面命令以訪問web console: 

minishift dashboard

如果遇到錯誤,請檢視Istio Tutorial for Java Microservices網站中的步驟,甚至提交一個Github 問題。

3. Istio安裝

Istio發行版中包括命令列工具、安裝檔案和示例應用。執行下面的命令以下載Istio 1.0.4版本並解壓縮:

curl -L https://github.com/istio/istio/releases/download/1.0.4/istio-1.0.4/-osx.tar.gz | tar xzcd istio-1.0.4

現在你要開始準備OpenShift/Kubernetes環境了。Istio使用ValidatingAdmissionWebhook來校驗Istio配置,使用MutatingAdmissionWebhook去自動向使用者pod中插入邊車代理。執行下面的命令去更新Minishift的預設配置:

minishift openshift config set --target=kube --patch '{
        "admissionConfig": {
            "pluginConfig": {
                "ValidatingAdmissionWebhook": {
                    "configuration": {
                        "apiVersion": "v1",
                        "kind": "DefaultAdmissionConfig",
                        "disable": false
} }, 
                "MutatingAdmissionWebhook": {
                    "configuration": {
                        "apiVersion": "v1",
                        "kind": "DefaultAdmissionConfig",
                        "disable": false
} } 
} } 
}' 

現在開始安裝Istio。在Istio發行版的根目錄中,執行以下命令:

oc apply -f install/kubernetes/helm/istio/templates/crds.yaml
oc apply -f install/kubernetes/istio-demo.yaml
oc project istio-system

這會安裝所有Istio控制平面元件,包括Pilot、Mixer(實際的Mixer pod的名稱為telemetry和policy)和Citadel。還會安裝一些附加服務,包括用於統計資訊收集的Prometheus,用於分散式跟蹤的Jaeger,用於統計資訊展示的Grafana,用於服務簡單視覺化的Servicegraph等。這些服務會在第6章中介紹。

最後,因為我們用的是OpenShift,你可以將這些服務通過Router釋出出去,這樣你就不用配置複雜的節點埠了。

oc expose svc servicegraph
oc expose svc grafana
oc expose svc prometheus
oc expose svc tracing

現在,所有Istio控制平面元件和相關服務都已經執行起來了。你可以執行下面的命令來檢視它們:

oc get pods
NAME
grafana-59b787b9b             1/1   Running     0        3m
istio-citadel-78df8c67d9         1/1   Running     0        3m
istio-cleanup-secrets            0/1   Completed   0        3m
istio-egressgateway-674686c846   1/1   Running     0        3m
istio-galley-58f566cb66          1/1   Running     0        3m
istio-grafana-post-install          0/1   Completed   0        3m
istio-ingressgateway-6bbdd58f8c   1/1   Running     0        3m
istio-pilot-56b487ff45            2/2   Running     0        3m
istio-policy-68797d879           2/2   Running     0        3m
istio-security-post-install          0/1   Completed   0        3m
istio-sidecar-injector-b88dfb954    1/1   Running     0        3m
istio-telemetry-68787476f4        2/2   Running     0        3m
istio-tracing-7596597bd7          1/1   Running     0        3m
prometheus-76db5fddd5           1/1   Running     0        3m
servicegraph-fc55fc579            1/1   Running     0        3m

最後要做的是讓istioctl在命令列中能執行。istioctl是Istio命令列工具,能用於手工插入istio-proxy邊車代理容器,以及建立、更新和刪除Istio資源。當解壓Istio發行版後,會有一個/bin資料夾,其中就有istioctl二進位制檔案。你可以把它加入到PATH路徑中。

export ISTIO_HOME=~/istio-1.0.4
export PATH=$ISTIO_HOME/bin:$PATH

現在,你能在命令列中執行istioctl命令檢視它的版本了。

istioctl version
Version: 1.0.4
GitRevision: a44d4c8bcb427db16ca4a439adfbd8d9361b8ed3
User: root@0ead81bba27d
Hub: docker.io/istio
GolangVersion: go1.10.4
BuildStatus: Clean

現在,我們去安裝示例服務。

 

4.示例Java微服務安裝

 要展現Istio的能力,你需要使用一些互相互動和通訊的微服務。接下來我們要用到的微服務是一個簡單的客戶服務網站。在這些場景中,這個網站會允許客戶為網站的特定方面設定優先項(preference),而這些優先項會從一個推薦引擎中獲得。微服務之間的通訊流如下所示:

Customer ⇒ Preference ⇒ Recommendation 

從現在開始,你要有本書用到的原始碼。你可以從the Istio Tutorail for Java Microservies 網站(https://github.com/redhat-developer-demos/istio-tutorial)下載原始碼,轉至book-1.0.4分支,如下所示:

git clone https://github.com/redhat-developer-demos/istio-tutorial.git
cd istio-tutorial
git checkout book-1.0.4 

4.1原始碼概覽 

瀏覽剛才所下載的原始碼的istio-tutorial子目錄,你會看到customer、preference和recommendation這三個目錄。每個目錄都包含了相關服務的原始碼,這些原始碼會展示Istio的能力。 

Customer和perference服務都是用Java Sprint Boot實現的簡單直接REST服務。例如,這是customer服務的端點:   

@Value("${preferences.api.url:http://preference:8080}")
    private String remoteURL;
    @RequestMapping("/")
        public ResponseEntity<String> getCustomer(
          @RequestHeader("User-Agent")
            String userAgent,
          @RequestHeader(value = "user-preference",
                         required = false)
            String userPreference) {
           try {
              /* Carry user-agent as baggage */
              tracer.activeSpan()
                .setBaggageItem("user-agent", userAgent);
              if (userPreference != null &&
                  !userPreference.isEmpty()) {
                  tracer.activeSpan().setBaggageItem(
                    "user-preference", userPreference);
              }
              ResponseEntity<String> responseEntity =
                restTemplate.getForEntity(remoteURL, String.class);
              String response = responseEntity.getBody();
              return ResponseEntity.ok(String.format(
                RESPONSE_STRING_FORMAT, response.trim()));
            } catch (HttpStatusCodeException ex) {...
            } catch (RestClientException ex) {...}
} 

異常處理部分我們暫且省略。你可以看到,這個HTTP端點只是簡單地呼叫了由 remoteURL指定的preference服務,並將preference服務的回覆加上一個固定字串RESPONSE_STRING_FORMATI再返回。注意,這裡除了Spring RestTemplate之外沒用到其它庫。我們沒有做更多的封裝比如斷路器、重試、客戶端側的負載均衡等等。我們也沒有新增額外的請求跟蹤和映象功能。只有最純粹的程式碼!我們就是希望你寫出強壯的業務邏輯程式碼,而不用新增對應用網路的處理程式碼。 

在前面的例子中,我們暫時略過了異常處理部分,但這部分也是非常重要的。大多數程式語言提供了探測和處理異常的機制。當你在程式碼中呼叫一個可能會失敗的函式時,你需要關注所丟擲的異常並進行適當的處理。在customer HTTP端點這個例子中,你試圖通過網路呼叫preference服務。這個呼叫可能會失敗,因此你需要將呼叫程式碼封裝進異常處理程式碼塊。在異常處理部分,你可以做各種有趣的應對措施,比如從快取中讀取資料或呼叫另一個函式。有時,開發人員會在獲取不到preference服務的返回時返回已快取好的資料。 

也許你已經看到下面這句跟“user-agent”有關的程式碼了:

tracer.activeSpan().setBaggageItem("user-agent", userAgent);

Istio允許基於HTTP頭部資訊做路由決策,只有你將HTTP頭部資訊傳入去呼叫服務。在這個例子中,我們需要確保“user-agent”在preference和recommendation中是可見的。第三章的第29頁“基於HTTP頭進行路由”部分會詳細介紹流量控制。 

在我們的customer示例中,我們已經在pox.xml中添加了特定的 opentracing-spring-cloud-starter和jaeger-tracersolver依賴。這些依賴使得你能在Java程式碼中新增與OpenTracing API之間的互動邏輯。 

在本書用到的例子和使用者場景中,我們使用了CNCF聯盟的Jaeger Tracing專案。可訪問其官網去了解它的更多資訊,本書第6章也會介紹Istio的可觀察性。 

大致瀏覽程式碼後,我們可以編譯應用並在Kubernetes/OpenShift叢集中的容器中執行它們了。 

注意:本書主要使用oc而不是kubectl命令列工具。就像OpenShift是Kubernetes的超集一樣,oc還是kubectl的超集。在幾乎所有場景中,兩個命令列的用法完全相同,但是,還有兩個主要場景中它們有些不同。第一個有關OpenShift的專案(project)概念,它對應Kubernetes中的名稱空間(namespace)。第二個跟安全有關,OpenShift中的oc login和minishift預設都是安全的。 

開始部署服務之前,確保你建立了所需的專案,並應用了必要的安全許可權:

oc new-project tutorial
oc adm policy add-scc-to-user privileged -z default -n tutorial

這條oc adm 命令向tutorial名稱空間中的default服務賬號添加了privileged安全上下文限定(SCC)。 

4.2編譯和部署customer服務 

現在,我們來編譯和部署customer服務。先登入進Minishift,再使用下面的命令檢查下你的登入狀態:

oc status
oc whoami

然後確認你的docker工具指向Minishift的Docker守護程序了:

eval $(minishift docker-env)
docker images

你將看到本地Docker守護程序的倉庫中的一些Istio和OpenShift映象。轉至cutomer目錄,編譯程式碼:

cd customer/java/springboot
mvn clean package

現在程式碼編譯好了。下一步是將應用打包為Docker映象,這樣你就能在Kubernetes/OpenShift中執行它了:

docker build -t example/customer .

這會將customer服務打包進一個Docker映象。你可以執行下面的命令來檢視所生成的映象:

docker images | grep example

在cusomter/Kubernetes目錄中,有兩個Kubernetes資原始檔Deployment.yml和Service.yml。現在我們要部署customer微服務,並插入Istio邊車代理。這次我們用手工方式插入邊車。執行下面的命令來插入邊車代理:

istioctl kube-inject -f ../../kubernetes/Deployment.yml

檢查該命令的輸出,並與之前沒修改過的Deployment.yml檔案做對比。你會發現輸出中被添加了以下內容:      

- args:
            - proxy
            - sidecar
            - --configPath
            - /etc/istio/proxy
            - --binaryPath
            - /usr/local/bin/envoy
            - --serviceCluster
            - customer
            - --drainDuration
            - 45s
            - --parentShutdownDuration
            - 1m0s
            - --discoveryAddress
            - istio-pilot.istio-system:15007
            - --discoveryRefreshDelay
            - 1s
            - --zipkinAddress
            - zipkin.istio-system:9411
            - --connectTimeout
            - 10s
            - --proxyAdminPort
            - "15000"
            - --controlPlaneAuthPolicy
            - NONE
            ...
            image: docker.io/istio/proxyv2:1.0.4
            imagePullPolicy: IfNotPresent
            name: istio-proxy

其中你能看到第二個容器被插入了,其名稱為istio-proxy。現在可以建立新的部署和Kubernetes服務了:

oc apply -f <(istioctl kube-inject -f ../../kubernetes/Deployment.yml) -n tutorial
oc create -f ../../kubernetes/Service.yml -n tutorial

新的pod被創建出來了:

oc get pods
NAME                READY     STATUS  RESTARTS  AGE
customer-6564ff969f-jqkkr   2/2       Running   0          2m

因為插入了一個istio-proxy邊車容器,所以你在READY列看到了“2/2”。你還可以用其它命令去檢視更多資訊,比如:

oc get deployment customer -o yaml
oc describe pod customer-6564ff969f-jqkkr
oc logs customer-6564ff969f-jqkkr -c customer

注意oc logs命令中的 –c customer 引數,因為pod中存在兩個容器,因此你需要指定待檢視日誌的容器名稱。

 因為customer服務要在Kubernetes/OpenShift叢集外被訪問,因此需要新增route物件,使用下面的命令:

oc expose service customer
curl customer-tutorial.$(minishift ip).nip.io

這裡我們用的是nip.io服務。在curl命令列的輸出中,你將看到以下錯誤,因為preference和recommendation服務還沒有被部署:

customer => I/O error on GET request for "http://preference:8080": preference: Name or service not known

 現在你可以部署本例中的其它服務了。 

4.3編譯和部署Preference服務 

跟編譯和部署customer服務的方法一樣,本節中你會編譯、打包和部署preference服務:

cd preference/java/springboot
mvn clean package
docker build -t example/preference:v1 .

然後為preference服務插入Istio邊車代理,並建立服務物件:

oc apply -f <(istioctl kube-inject -f ../../kubernetes/Deployment.yml) -n tutorial
oc create -f ../../kubernetes/Service.yml 

現在,再次使用curl工具去訪問customer服務:

curl customer-tutorial.$(minishift ip).nip.io

你依然會看到錯誤,但這次有些不同:

customer => 503 preference => I/O error on GET request for    "http://recommendation:8080": recommendation: Name or...

 這個錯誤是因為preference服務訪問不到recommendation服務。因此,下一步中,我們需要編譯和部署recommendation服務。 

4.4編譯和部署recommendation服務 

要讓這些服務都執行起來的最後一步是部署recommendation服務。為了嘗試不同的做法,我們採用recommendation服務的Vert.x程式碼。跟前述方法一樣,採用以下步驟來編譯、打包和部署recommendation服務:

cd recommendation/java/vertx
mvn clean package
docker build -t example/recommendation:v1 .
oc apply -f <(istioctl kube-inject -f ../../kubernetes/Deployment.yml) -n tutorial
oc create -f ../../kubernetes/Service.yml
oc get pods -w

檢視輸出中READY列為“2/2”。再次用curl訪問customer服務,你會看到更好的結果了:

curl customer-tutorial.$(minishift ip).nip.io
customer => preference => recommendation v1 from '66b7c9779c': 1

成功了!三個服務之間的呼叫鏈如願正常工作了。如果你執行curl多次,你會看到最後面的數字依次遞增。66b7c9779c是recommendation服務的pod的UID。它由Java程式碼從HOSTNAME環境變數中獲取到。從程式碼角度看,pod其實就是一個計算機,程式碼執行在其中。 

執行下面的命令去檢視pod的名稱:

oc get pod -l app=recommendation
NAME                      READY STATUS  RESTARTS AGE
recommendation-v1-66b7c9779c   2/2   Running      0        2m

現在三個服務之間的呼叫沒問題了,接下來,我們將繼續討論Istio的更多核心能力,以及解決服務之間各種問題的強大能力。

 

書籍英文版下載連結為 https://developers.redhat.com/books/introducing-istio-service-mesh-microservices/,作者 Burr Sutter 和 Christian Posta

 

本中文譯稿版權由本人所有。水平有限,錯誤肯定是有的,還請海涵。

  

 感謝您的閱讀,歡迎關注我的微信公眾號:

相關推薦

譯文連載 理解Istio服務網格第二 安裝

全書目錄 第一章 概述 本文目錄 1.命令列工具安裝 2. Kubernetes/OpenShift安裝 3. Istio安裝 4.示例Java微服務安裝 4.1 原始碼概覽 4.2 編譯和部署customer服務 4.3 編譯和部署Preference服務 4.4 編

譯文連載 理解Istio服務網格第一 概述

書籍英文版下載連結為 https://developers.redhat.com/books/introducing-istio-service-mesh-microservices/,作者 Burr Sutter 和 Christian Posta。  第一章 概述 中文翻譯  劉世

譯文連載 理解Istio服務網格第三 流控

第3章 流控............................................................................................................... 1 3.1 更加智慧的金絲雀.............

譯文連載 理解Istio服務網格第六 可觀測性

全書目錄 第一章 概述 第二章 安裝 第三章 流控 第四章 服務彈性 第五章 混沌測試  ​本文目錄 第6章 可觀測性 6.1 分散式呼叫鏈跟蹤(tracing) 6.1.1 基本概念 6.1.2 Jaeger 6.1.3 Istio對

譯文連載 理解Istio服務網格第七 安全

全書目錄 第一章 概述 第二章 安裝 第三章 流控 第四章 服務彈性 第五章 混沌測試 第六章 可觀測性   本文目錄 第7章 安全 7.1 身份認證     7.1.1 Kubernetes上的Istio的身份

機器學習主成分分析PCAPrincipal components analysis

大小 限制 總結 情況 pca 空間 會有 ges nal 1. 問題 真實的訓練數據總是存在各種各樣的問題:  1、 比如拿到一個汽車的樣本,裏面既有以“千米/每小時”度量的最大速度特征,也有“英裏/小時”的最大速度特征,

設計模式2.工廠設計模式生產者消費者問題

catch 設計 star 機制 print boolean 結果 try producer 生產者消費者模型 與 多線程 生產者、消費者在同一時間內共用同一存儲空間, 生產者向共享空間生產數據, 而消費者取走共享的數據。、 經典問題描述: 生產者不斷交替地生產兩組數據“姓

CodeForces - 1060B Maximum Sum of Digits思維,構造

題幹: You are given a positive integer nn. Let S(x)S(x) be sum of digits in base 10 representation of xx, for example, S(

TP5.1樹狀導航欄無極限分類

author:咔咔 wechat:fangkangfk   業務場景: 使用無限極分類來做   我們還是需要將資料查出來 然後使用我們的單元測試看一下資料 很明顯這不是我們需要的資料結構   下來們需要引入一

LeetCode題解206_反轉連結串列Reverse-Linked-List

更多 LeetCode 題解筆記可以訪問我的 github。 文章目錄 描述 解法一:迭代 思路 Java 實現 Python 實現 複雜度分析 解法二:遞迴 思路

洛谷 P1019 單詞接龍-預處理+dfs

題目描述 單詞接龍是一個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的“龍”(每個單詞都最多在“龍”中出現兩次),在兩個單詞相連時,其重合部分合為一部分,例如 beastbeast和astonishastonish,如果接成

新書推薦2018.02電磁系統的極化第二

【2018.02】電磁系統的極化(第二版)Polarization in Electromagnetic Systemssecond edition,共352頁。 如果需要電子版,請聯絡QQ:3042075372。 本書是對第一版的徹底修訂與擴充,,主要講述應用於電磁系統中的極

POJ - 3342Party at Hali-Bula 樹形dp+判斷

Dear Contestant, I'm going to have a party at my villa at Hali-Bula to celebrate my retirement from BCM. I wish I could invite all my co-workers,

新書推薦2018.06現代電子戰系統概論第二

【2018.06】現代電子戰系統概論(第二版)Introduction to Modern Ew Systems 2nd Edition,共480頁。 如果需要電子版,請聯絡QQ:3042075372。 為了滿足巨大的市場需求,Artech House非常自豪地為專業人士帶來了

零基礎Python3學習課後練習題二十一

本文是跟著魚C論壇小甲魚零基礎學習Python3的視訊學習的,課後題也是跟隨每一課所附屬的題目來做的,根據自己的理解和標準答案記錄的筆記。 第二十三課與二十四課 測試題: 0.使用遞迴編寫一個十進位制轉換為二進位制的函式(要求採用“除2取餘”的方式,結果與呼叫b

零基礎Python3學習課後練習題二十二

本文是跟著魚C論壇小甲魚零基礎學習Python3的視訊學習的,課後題也是跟隨每一課所附屬的題目來做的,根據自己的理解和標準答案記錄的筆記。 第二十五課 測試題: 0.當你聽到小夥伴在討論“對映”、“雜湊”、“雜湊”或者“關係數列”的時候,事實上他們就是在討論什麼

零基礎Python3學習課後練習題二十六

本文是跟著魚C論壇小甲魚零基礎學習Python3的視訊學習的,課後題也是跟隨每一課所附屬的題目來做的,根據自己的理解和標準答案記錄的筆記。 第二十九課 動動手: 0.編寫一個程式,接受使用

零基礎Python3學習課後練習題二十七

本文是跟著魚C論壇小甲魚零基礎學習Python3的視訊學習的,課後題也是跟隨每一課所附屬的題目來做的,根據自己的理解和標準答案記錄的筆記。 第三十課 動動手: 0.編寫一個程式,統計當前目

2018.12.15SPOJ-LCS2Longest Common Substring II字尾自動機SAM

傳送門 解析: 這道題可以把所有串接在一起構建字尾自動機來做,但是那樣還不如寫字尾陣列。。。 所以這裡提供一個只有字尾自動機能實現的做法。 思路: 首先構建出第一個串的字尾自動機。 然後拿其他的串放到字尾自動機上面跑。同時更新答案。 程式碼裡面的

工程材料材料使我快樂金屬的結晶金屬粑粑與金屬麻麻的故事

金屬結晶的一些概念: ① 晶體—— 原子排列有一定規則的固體。 ② 非晶體—— 原子排列無規則的固體。 ③ 結晶—— 金屬由原子排列無規則的液體狀態向原子排列有規則的固體狀態的轉變過程。 結晶——就是純金屬從液態轉換為固態的過程,這個過程溫度持續下降,到某個