istio服務條目(ServiceEntry)介紹

使用服務條目資源(ServiceEntry)可以將條目添加到 Istio 內部維護的服務註冊表中。添加服務條目後,Envoy 代理可以將流量發送到該服務,就好像該服務條目是網格中的服務一樣。通過配置服務條目,可以管理在網格外部運行的服務的流量。

此外,可以配置虛擬服務和目標規則,以更精細的方式控制到服務條目的流量,就像爲網格中的其他任何服務配置流量一樣。


服務條目樣例

上面的介紹有點晦澀,不如我們直接給一個樣例出來,該樣例包含兩個資源文件:

client.yaml # istio 要注入的客戶端資源文件

svc-entry.yaml # 服務條目資源文件

服務條目資源

svc-entry.yaml 內容如下:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: svc-entry
spec:
  hosts:
  - "www.baidu.com"
  ports:
  - number: 80
    name: http
    protocol: HTTP
  location: MESH_EXTERNAL
  resolution: DNS

該服務條目資源定義了一個外部網站 baidu,並將它納入到 Istio 內部維護的服務註冊表中。執行如下語句創建 service entry 資源:

kubectl apply -f svc-entry.yaml

spacer.gifclipboard4.png

istio 注入客戶端資源

client.yaml 客戶端資源文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: client
spec:
  replicas: 1
  selector:
    matchLabels:
      app: client
  template:
    metadata:
      labels:
        app: client
    spec:
      containers:
      - name: busybox
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh", "-c", "sleep 3600"]

編輯完,執行如下語句進行 Istio 注入:

istioctl kube-inject -f client.yaml | kubectl apply -f -

執行成功後,查看 pod 發現容器個數爲 2 個,說明 istio 注入成功:

spacer.gifclipboard6.png

Istio 注入後,client 就處於 Istio 服務網格之中。


驗證服務條目樣例

登錄 client

執行如下語句登錄 client:

kubectl exec -it $(kubectl get pods | grep -i client | awk '{print $1}') -- sh

登陸 client,訪問 www.baidu.com 成功,如下所示:

spacer.gifclipboard7.png

你可能會迷惑,難道這就是服務條目?不是訪問外網嗎?

好吧,這還就真是服務條目。爲了解除你心中的疑惑,我們現在來對剛纔編寫的 ServiceEntry 資源做一些手腳。

調整 service entiries 解析類型

調整內容如下所示:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: svc-entry
spec:
  hosts:
  - "www.baidu.com"
  ports: 
  - number: 80
    name: http
    protocol: HTTP
  location: MESH_EXTERNAL
  resolution: STATIC
  endpoints:
  - address: 172.20.10.10

添加了域名解析類型爲 static,同時給出一個自定義 IP:192.168.182.188。再次 kubectl apply 後登陸 client 查看:

spacer.gifclipboard9.png

再次訪問 baidu,發現已經不會成功了,多試驗幾次,一樣不會成功。

出現此問題的原因是,service entry 一直都在發揮作用,前面沒報錯的原因是默認指定的域名解析是基於 DNS 的。而調整後,我們設置了靜態域名解析的方式,並隨意給了一個內網 IP 來標識 baidu。kubectl apply service entry 後此配置立刻就被應用在網格內(client)的 envoy,那麼在網格內訪問 baidu 的時候,流量就被路由到了我們所指定的 192.168.182.188 去了。

​ 執行如下語句刪除 service entry,再次登錄 client 訪問 baidu,發現歲月靜好。

spacer.gifclipboard10.png


總結

​ 使用 service entry 使用場景有哪些?這裏給你一個場景,比如工作過程中你需要調用外部合作方服務,該服務跟你的集羣毫無關係,甚至對方服務可以佈置在美國。但是通過服務條目,你可以將對方服務納入到自己的 Istio 網格之內,就像它本身存在你的集羣之內一樣,就好像你做了內網攔截一樣。而且服務條目可以結合虛擬服務(virtual service)、目的地規則(destination rule)做更加精細的流量控制,不僅如此,還可以做失敗注入、重試等功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章