使用服務條目資源(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
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 注入成功:
Istio 注入後,client 就處於 Istio 服務網格之中。
執行以下語句登陸 client:
kubectl exec -it $(kubectl get pods | grep -i client | awk '{print $1}') -- sh
登錄 client,訪問 www.baidu.com 成功,以下所示:
你可能會迷惑,難道這就是服務條目?不是訪問外網嗎?
好吧,這還就真是服務條目。爲了解除你心中的疑惑,咱們如今來對剛纔編寫的 ServiceEntry 資源作一些手腳。
調整內容以下所示:
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 查看:
再次訪問 baidu,發現已經不會成功了,多試驗幾回,同樣不會成功。
出現此問題的緣由是,service entry 一直都在發揮做用,前面沒報錯的緣由是默認指定的域名解析是基於 DNS 的。而調整後,咱們設置了靜態域名解析的方式,並隨意給了一個內網 IP 來標識 baidu。kubectl apply service entry 後此配置馬上就被應用在網格內(client)的 envoy,那麼在網格內訪問 baidu 的時候,流量就被路由到了咱們所指定的 192.168.182.188 去了。
執行以下語句刪除 service entry,再次登陸 client 訪問 baidu,發現歲月靜好。
使用 service entry 使用場景有哪些?這裏給你一個場景,好比工做過程當中你須要調用外部合做方服務,該服務跟你的集羣毫無關係,甚至對方服務能夠佈置在美國。可是經過服務條目,你能夠將對方服務歸入到本身的 Istio 網格以內,就像它自己存在你的集羣以內同樣,就好像你作了內網攔截同樣。並且服務條目能夠結合虛擬服務(virtual service)、目的地規則(destination rule)作更加精細的流量控制,不只如此,還能夠作失敗注入、重試等功能。