服務入口
網關是將內部服務暴露給外部訪問,服務入口正好相反,是把外部服務納入到網格內部進行管理,主要是希望能夠管理到外部服務的請求,比如需要對訪問外部服務的請求做一些流量控制,還有就是能夠幫我們擴展我們的網格,例如我們要給多個集羣共享同一個網格(mesh)
從圖上可以看出,服務入口相當於抽象了一個外部服務,然後內部服務就像訪問網格內部的服務一樣去訪問外部服務
任務
說明:將httpbin註冊爲網格內部的服務,並配置流控策略
目標:學會通過服務入口擴展網格,掌握服務入口的配置方法
配置
因爲bookinfo服務裏,沒有帶curl這個命令,因此想要模擬內部服務去請求外部服務,需要在添加另外一個服務,官方提供了sleep這樣的服務
httpbin是一個非常精簡的測試http請求的服務
如http://httpbin.org/headers可以看到頭信息
kubectl apply -f ./samples/sleep/sleep.yaml
kubectl exec -it sleep-f8cbf5b76-8fz8g -c sleep curl http://httpbin.org
關閉出流量訪問權限
outboundTrafficPolicy=REGISTER_ONLY
本來是ALLOW_ANY
istio中默認所有的網格內的服務,是允許直接訪問外部服務的,所以我們先關閉到允許訪問外部服務的方式,設置成只有註冊過的服務才能訪問外部服務
kubectl get configmap istio -n istio-system -o yaml | sed 's/mode: ALLOW_ANY/mode: REGISTER_ONLY/g' |kubectl replace -n istio-system -f -
這樣的話發現在服務內部無法訪問外部
然後定義一個服務入口,讓sleep服務可以通過服務入口訪問外部服務
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: httpbin-ext
spec:
hosts: 外部服務的服務域名
- httpbin.org
ports: 定義具體的訪問這個服務的協議及端口
- number: 80
name: http
protocol: HTTP
location: MESH_EXTERNAL 定義網格外部還是內部
resolution: DNS 服務發現的機制,通過dns發現
[root@vms30 ~] kubectl get se
NAME HOSTS LOCATION RESOLUTION AGE
httpbin-ext [httpbin.org] MESH_EXTERNAL DNS 27s
發現又可以訪問了