五分鐘 K8S 實(shí)戰(zhàn)- Istio 網(wǎng)關(guān)
在上一期 k8s-服務(wù)網(wǎng)格實(shí)戰(zhàn)-配置 Mesh 中講解了如何配置集群內(nèi)的 Mesh 請求,Istio 同樣也可以處理集群外部流量,也就是我們常見的網(wǎng)關(guān)。
圖片
其實(shí)和之前講到的k8s入門到實(shí)戰(zhàn)-使用Ingress Ingress 作用類似,都是將內(nèi)部服務(wù)暴露出去的方法。
只是使用 Istio-gateway 會更加靈活。
圖片
這里有一張功能對比圖,可以明顯的看出 Istio-gateway 支持的功能會更多,如果是一個中大型企業(yè)并且已經(jīng)用上 Istio 后還是更推薦是有 Istio-gateway,使用同一個控制面就可以管理內(nèi)外網(wǎng)流量。
創(chuàng)建 Gateway
開始之前首先是創(chuàng)建一個 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 #與現(xiàn)有的 gateway 關(guān)聯(lián)
istio: ingressgateway
其中的 selector 選擇器中匹配的 label 與我們安裝 Istio 時候自帶的 gateway 關(guān)聯(lián)即可。
# 查看 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
圖片
這個 Gateway 在我們第一次安裝 Istio 的時候就會安裝這個組件。
這個配置的含義是網(wǎng)關(guān)會代理通過 www.service1.io 這個域名訪問的所有請求。
之后需要使用剛才的 gateway 與我們的服務(wù)的 service 進(jìn)行綁定,這時就需要使用到 VirtualService:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: k8s-combat-istio-http-vs
spec:
gateways:
- istio-ingress-gateway # 綁定剛才創(chuàng)建的 gateway 名稱
hosts:
- www.service1.io
http:
- name: default
route:
- destination:
host: k8s-combat-service-istio-mesh #service 名稱
port:
number: 8081
subset: v1
這個和我們之前講到的 Mesh 內(nèi)部流量時所使用到的 VirtualService 配置是一樣的。
這里的含義也是通過 www.service1.io 以及 istio-ingress-gateway 網(wǎng)關(guān)的流量會進(jìn)入這個虛擬服務(wù),但所有的請求都會進(jìn)入 subset: v1 這個分組。
這個的分組信息在上一節(jié)可以查詢到:
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
之后我們訪問這個域名即可拿到響應(yīng),同時我們打開 k8s-combat-service-istio-mesh service 的 Pod 查看日志,會發(fā)現(xiàn)所有的請求都進(jìn)入了 v1, 如果不需要這個限制條件,將 subset: v1 刪除即可。
curl http://www.service1.io/ping
本地需要配置下 host: 127.0.0.1 www.service1.io
圖片
還有一點(diǎn),我們需要拿到 gateway 的外部IP,才能將 IP 和剛才的域名www.service1.io 進(jìn)行綁定(host,或者是域名管理臺)。
如果使用的是 docker-desktop 自帶的 kubernetes 集群時候直接使用 127.0.0.1 即可,默認(rèn)就會綁定上。
如果使用的是 minikube 安裝的,那需要使用 minikube tunnel 手動為 service 為LoadBalancer 類型的綁定一個本地 IP,具體可以參考文檔:https://minikube.sigs.k8s.io/docs/tasks/loadbalancer
如果是生產(chǎn)環(huán)境使用,云服務(wù)廠商會自動綁定一個外網(wǎng) IP。
原理
圖片
這個的訪問請求的流程和之前講到的 kubernetes Ingress 流程是類似的,只是 gateway 是通過 VirtualService 來路由的 service,同時在這個 VirtualService 中可以自定義許多的路由規(guī)則。
總結(jié)
服務(wù)網(wǎng)格 Istio 基本上講完了,后續(xù)還有關(guān)于 Telemetry 相關(guān)的 trace、log、metrics 會在運(yùn)維章節(jié)更新,也會和 Istio 有所關(guān)聯(lián)。感興趣的朋友可以持續(xù)關(guān)注。
本文的所有源碼在這里可以訪問:https://github.com/crossoverJie/k8s-combat