istio服務條目(ServiceEntry)介紹

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

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


服務條目樣例

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

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

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

服務條目資源

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 資源:code

kubectl apply -f svc-entry.yamlblog

spacer.gifclipboard4.png

istio 注入客戶端資源

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

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)作更加精細的流量控制,不只如此,還能夠作失敗注入、重試等功能。

相關文章
相關標籤/搜索