五分鐘K8S 實戰- Istio 網關
五分鐘K8S 實戰- Istio 網關
在上一期 k8s-服務網格實戰-配置Mesh 中講解瞭如何配置集群內的Mesh 請求,Istio 同樣也可以處理集群外部流量,也就是我們常見的網關。
圖片
其實和之前講到的k8s入門到實戰-使用Ingress Ingress 作用類似,都是將內部服務暴露出去的方法。
只是使用 Istio-gateway 會更有彈性。
圖片
這裡有一張功能對比圖,可以明顯的看出Istio-gateway 支援的功能會更多,如果是一個中大型企業並且已經用上Istio 後還是更推薦是有Istio-gateway,使用同一個控制面就可以管理內外網流量。
建立Gateway
在開始之前首先是建立一個 Istio-Gateway 的資源:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: istio-ingress-gateway
namespace: default
spec:
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- 'www.service1.io'
selector:
app: istio-ingressgateway #与现有的 gateway 关联
istio: ingressgateway
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
其中的 selector 選擇器中相符的label 與我們安裝 Istio 時候自帶的 gateway 關聯即可。
# 查看 gateway 的 label
k get pod -n istio-system
NAME READY STATUS
istio-ingressgateway-649f75b6b9-klljw 1/1 Running
k describe pod istio-ingressgateway-649f75b6b9-klljw -n istio-system |grep Labels
Labels: app=istio-ingressgateway
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
圖片
這個 Gateway 在我們第一次安裝 Istio 的時候就會安裝這個元件。
這個設定的意思是網關會代理程式透過 www.service1.io 這個網域存取的所有請求。
之後需要使用剛才的gateway 與我們的服務的service 進行綁定,這時就需要使用到 VirtualService:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: k8s-combat-istio-http-vs
spec:
gateways:
- istio-ingress-gateway # 绑定刚才创建的 gateway 名称
hosts:
- www.service1.io
http:
- name: default
route:
- destination:
host: k8s-combat-service-istio-mesh #service 名称
port:
number: 8081
subset: v1
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
這個和我們之前講到的Mesh 內部流量時所使用到的 VirtualService 設定是一樣的。
這裡的意思也是透過 www.service1.io 以及 istio-ingress-gateway 閘道的流量會進入這個虛擬服務,但所有的請求都會進入 subset: v1 這個分組。
這個的分組資訊在上一節可以查詢到:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: k8s-combat-service-ds
spec:
host: k8s-combat-service-istio-mesh
subsets:
- name: v1
labels:
app: k8s-combat-service-v1
- name: v2
labels:
app: k8s-combat-service-v2
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
之後我們造訪這個網域即可拿到回應,同時我們開啟k8s-combat-service-istio-mesh service 的Pod 查看日誌,會發現所有的請求都進入了v1, 如果不需要這個限制條件,將subset: v1刪除即可。
curl http://www.service1.io/ping
- 1.
本機需要設定下host: 127.0.0.1 www.service1.io
圖片
還有一點,我們需要拿到 gateway 的外部IP,才能將IP 和剛才的網域www.service1.io 綁定(host,或是網域管理台)。
如果使用的是 docker-desktop 自帶的 kubernetes 叢集時候直接使用 127.0.0.1 即可,預設就會綁定上。
如果使用的是 minikube 安裝的,那需要使用 minikube tunnel 手動為service 為LoadBalancer 類型的綁定一個本地IP,具體可以參考文件:https://minikube.sigs.k8s.io/docs/tasks/loadbalancer
如果是生產環境使用,雲端服務廠商會自動綁定一個外網IP。
原理
圖片
這個的存取請求的流程和之前講到的 kubernetes Ingress 流程是類似的,只是gateway 是透過 VirtualService 來路由的service,同時在這個 VirtualService 中可以自訂許多的路由規則。
總結
服務格 Istio 基本上講完了,後續還有關於 Telemetry 相關的 trace、log、metrics 會在維運章節更新,也會和Istio 有所關聯。有興趣的朋友可以持續關注。
本文的所有原始碼在這裡可以訪問:https://github.com/crossoverJie/k8s-combat