[英]Why my canary deployment does not work with istio?
我正在嘗試學習有關 istio 的基礎知識,因此我在這里閱讀了官方文檔以創建 80/20 金絲雀部署,我還遵循了 digitalocean 的本指南,其中解釋了簡單部署https:// www.digitalocean.com/community/tutorials/how-to-do-canary-deployments-with-istio-and-kubernetes 。
我在主頁上創建了一個帶有 2 條不同消息的簡單應用程序,然后創建了 virtualService、Gateway 和目標規則。 我(如指南中所述)使用kubectl -n istio-system get svc
獲取外部 ip 並嘗試導航到該地址,但出現 503 錯誤。 這看起來很簡單,但我必須遺漏一些東西。 這些是我的 3 個文件(據我所知,沒有更多必要的文件):
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
namespace: istio
name: flask-gateway
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- "*"
port:
name: http
number: 80
protocol: HTTP
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: flask-app
namespace: istio
spec:
hosts:
- "*"
gateways:
- flask-gateway
http:
- route:
- destination:
host: flask-app
subset: v1
weight: 80
- destination:
host: flask-app
subset: v2
weight: 20
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: flask-app
namespace: istio
spec:
host: flask-app
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
以下是 yaml 以及 v1 和 v2 的部署和服務:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
version: v1
name: flask-deployment-v1
namespace: istio
spec:
replicas: 1
selector:
matchLabels:
app: flask-app
template:
metadata:
labels:
version: v1
app: flask-app
spec:
containers:
- name: flask-app
image: latalavera/flask-app:1.3
ports:
- containerPort: 5000
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 250m
memory: 256Mi
---
apiVersion: v1
kind: Service
metadata:
name: flask-service
namespace: istio
spec:
selector:
app: flask-app
ports:
- port: 5000
protocol: TCP
targetPort: 5000
type: ClusterIP
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
version: v2
name: flask-deployment-v2
namespace: istio
spec:
replicas: 1
selector:
matchLabels:
app: flask-app
template:
metadata:
labels:
app: flask-app
version: v2
spec:
containers:
- name: flask-app
image: latalavera/flask-app:2.0
ports:
- containerPort: 5000
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 250m
memory: 256Mi
---
apiVersion: v1
kind: Service
metadata:
name: flask-service2
namespace: istio
spec:
selector:
app: flask-app
ports:
- port: 5000
protocol: TCP
targetPort: 5000
type: ClusterIP
我已將標簽version: v1
和version: v2
添加到我的部署中,並且我還使用了kubectl label ns istio istio-injection=enabled
命令,但它們無論如何都不起作用
您將服務命名為flask-service
並將VirtualService
中的host
設置為flask-app
。
host
字段不是選擇器,而是要將流量路由到的服務的FQDN
。 所以它應該被稱為flask-service
或者更好flask-service.istio.svc.cluster.local
:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: flask-app
namespace: istio
spec:
hosts:
- "*"
gateways:
- flask-gateway
http:
- route:
- destination:
host: flask-service.istio.svc.cluster.local
subset: v1
weight: 80
- destination:
host: flask-service.istio.svc.cluster.local
subset: v2
weight: 20
或者,您可以像Deployment
一樣調用服務flask-app
。 但是在任何情況下都建議使用完整的FQDN
<service-name>.<namespace-name>.svc.cluster.local
。 來自文檔:
Kubernetes 用戶注意:當使用短名稱時(例如“reviews”而不是“reviews.default.svc.cluster.local”),Istio 將根據規則的命名空間而不是服務來解釋短名稱。 包含主機“reviews”的“default”命名空間中的規則將被解釋為“reviews.default.svc.cluster.local”,而與與評論服務關聯的實際命名空間無關。 為避免潛在的錯誤配置,建議始終使用完全限定域名而不是短名稱。
https://istio.io/latest/docs/reference/config/networking/virtual-service/#VirtualService -> 主機
順便說一句,您不需要 2 項服務,只需要一項。 您的服務有一個應用程序selector
app: flask-app
,因此它可以將流量路由到 v1 和 v2。 流量的路由方式由VirtualService
和DestionationRule
定義。 我建議刪除 service flask-service2
。 如果您需要在網格內路由流量,請在VirtualService
中添加mesh
作為gateways
,或者為網格內部流量創建一個新網關,以達到兩個版本。 有關該主題的更多信息:
https://istio.io/latest/docs/reference/config/networking/virtual-service/#VirtualService -> 網關
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.