本文章同時發佈於:
文章為自己的經驗與夥伴整理的內容,設計沒有標準答案,如有可以改進的地方,請告訴我,我會盡我所能的修改,謝謝大家~
大家好。今天要介紹 Istio 的VirtualService
、Gateway
,兩者搭配可以達到 K8s 的Ingress
的效果,並且有著 Istio 更強大的功能。
而這篇文章會以實作為介紹,實際原理將在之後介紹,
實作
以下的實作範例都在Code-Example中,
在helm-digimon/templates/server-service.yaml
中,我們須將 ports 的name做修改為grpc-web
,Istio在看到此name後,就會調整envoy proxy使client網頁端的grpc-web
請求可成功與server溝通。詳細API在此
新增VirtualService
、Gateway
兩個元件至DAY23/helm-digimon/templates/gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*.backend.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: virtual-service
spec:
hosts:
- "api.backend.com"
gateways:
- gateway
http:
- match:
- uri:
prefix: /digimon.Digimon
route:
- destination:
port:
number: 6000
host: server
corsPolicy:
allowOrigins:
- exact: "http://web.backend.com"
allowMethods:
- POST
- GET
- OPTIONS
- PUT
- DELETE
allowHeaders:
- grpc-timeout
- content-type
- keep-alive
- user-agent
- cache-control
- content-type
- content-transfer-encoding
- x-accept-content-transfer-encoding
- x-accept-response-streaming
- x-user-agent
- x-grpc-web
maxAge: 1728s
exposeHeaders:
- grpc-status
- grpc-message
allowCredentials: true
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: web
spec:
hosts:
- "web.backend.com"
gateways:
- gateway
http:
- match:
- uri:
prefix: /
rewrite:
uri: /
route:
- destination:
port:
number: 8060
host: web
DAY23/helm-digimon/templates/gateway.yaml
有一個Gateway、一個web的VirtualService、一個server的VirtualService,
外部的流量會如下導至正確的pods,
Istio Gateway元件 --> Istio VirtualService元件 --> K8s Service元件 --> K8s Pods元件
將 K8s run 起來,
$ minikube start --kubernetes-version v1.16.0
安裝Istio系統至K8s,並啟用envoy sidecar,
$ istioctl install --set profile=demo
$ kubectl label namespace default istio-injection=enabled
啟動所有K8s元件
$ cd DAY23/helm-digimon
$ helm install . --generate-name
Istio Gateway設計的外部流量導向如下:
外部Load Balancer --> Istio Gateway元件
由於實作是採用minikube,我們必須模擬外部Load Balancer出來,
$ minikube tunnel
模擬完畢後透過minikube ip
或的minikube的外部ip,並透過$ open /etc/hosts
將URL導至此ip,如果minikube ip是127.0.0.1
的話修改方式如下:
都完成後打開web.backend.com
,web client已經成功與server溝通,太好了。
結論
你可能會想為什麼要特別設計一個VirtualService元件,不直接用K8s Service元件呢?
,為什麼要分那麼多層元件呢?
,以下問題都會在下篇文章做探討,謝謝你的閱讀~