簡體   English   中英

為什么我的金絲雀部署不適用於 istio?

[英]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: v1version: 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。 流量的路由方式由VirtualServiceDestionationRule定義。 我建議刪除 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM