共用方式為


Open Service Mesh (OSM) 設定至 Istio 的移轉指引

重要

本文旨在讓您輕鬆了解如何識別 OSM 設定,並將其轉譯為對等的 Istio 設定,以便將工作負載從 OSM 移轉至 Istio。 本文絕非詳盡的詳細指南。

本文提供將 OSM 原則對應至 Istio 原則的實際指引,以協助將 OSM 管理的微服務部署移轉為由 Istio 管理。 我們使用 OSM Bookstore 範例應用程式,作為目前 OSM 使用者的基本參考。 下列逐步解說將部署 Bookstore 應用程式。 遵循相同的步驟,並說明如何使用 Istio 對等專案來套用 OSM SMI 流量原則。

如果您未使用 OSM 且不熟悉 Istio,請先參閱 Istio 自己的使用者入門指南,了解如何將 Istio 服務網格用於您的應用程式。 如果您正在使用 OSM,請確定您熟悉 OSM Bookstore 範例應用程式逐步解說中關於 OSM 設定流量原則的內容。 下列逐步解說不會複製目前的文件,並在相關時參考特定主題。 您應該熟悉並充分了解 Bookstore 應用程式架構,然後再續繼。

必要條件

OSM 範例 Bookstore 應用程式所需的修改

若要讓 Istio 管理 OSM Bookstore 應用程式,需要對現有資訊清單進行幾項變更。 這些變更與 Bookstore 和 mysql 服務有關。

Bookstore 修改

在 OSM Bookstore 逐步解說中,bookstore 服務會與另一個 bookstore-v2 服務一起部署,以示範 OSM 如何提供流量轉移。 這項部署的服務可讓您分割多個服務端點之間的用戶端 (bookbuyer) 流量。 第一個新概念,是了解 Istio 如何處理其所謂的流量轉移

流量轉移的 OSM 實作是以 SMI 流量分割規格為基礎。 SMI 流量分割規格要求需存在多個最上層服務,這些服務會新增為具有所需加權計量的後端,以將用戶端要求從一個服務移位到另一個服務。 Istio 會使用虛擬服務目的地規則的組合來完成流量轉移。 強烈建議您熟悉虛擬服務和目的地規則的概念。

簡單地說,Istio 虛擬服務會針對要求主機 (服務名稱) 的用戶端定義路由規則。 虛擬服務可讓多個版本的部署與一個虛擬服務主機名相關聯,讓客戶端設定目標。 可針對相同的服務為多個部署加上標籤,代表相同主機名稱背後的不同應用程式版本。 然後,可設定 Istio 虛擬服務將要求加權至特定版本的服務。 服務的可用版本會設定為在 Istio 目的地規則中使用 subsets 屬性。

對 Istio 的 bookstore 服務和部署進行的修改,便不需要有明確的第二個服務作為目標,而 SMI 流量分割則需要。 bookstore v2 服務也不需要另一個服務帳戶,因為其將在 bookstore 服務下合併。 針對 bookstore v1 和 v2 的原始 OSM traffic-access-v1.yaml 資訊清單修改,如底下的建立 Pod、服務和服務帳戶一節所示。 我們示範如何進行流量分割,也就是稍後逐步解說中的流量轉移:

MySql 修改

只有服務組態中才需要 mysql StatefulSet 的變更。 在服務規格下,OSM 需要 targetPortappProtocol 屬性。 Istio 不需要這些屬性。 mysqldb 的下列更新服務看起來像這樣:

apiVersion: v1
kind: Service
metadata:
  name: mysqldb
  labels:
    app: mysqldb
    service: mysqldb
spec:
  ports:
    - port: 3306
      name: tcp
  selector:
    app: mysqldb

部署修改的 Bookstore 應用程式

與 OSM Bookstore 逐步解說類似,我們從新的 Bookstore 應用程式安裝開始。

建立命名空間

kubectl create namespace bookstore
kubectl create namespace bookbuyer
kubectl create namespace bookthief
kubectl create namespace bookwarehouse

新增 Istio 側車插入的命名空間標籤

針對 OSM,使用命令 osm namespace add <namespace> 為 OSM 控制器建立命名空間的必要註釋,以新增自動側車插入。 使用 Istio 時,您只需要為命名空間加上標籤,即可指示 Istio 控制器自動插入 Envoy 側車 Proxy。

kubectl label namespace bookstore istio-injection=enabled
kubectl label namespace bookbuyer istio-injection=enabled
kubectl label namespace bookthief istio-injection=enabled
kubectl label namespace bookwarehouse istio-injection=enabled

部署 Bookstore 的 Istio 虛擬服務和目的地規則

如先前在 Bookstore 修改一節中所述,Istio 會使用我們稍後在逐步解說中設定的 VirtualService 加權屬性來處理流量轉移。 我們會部署 Bookstore 服務的虛擬服務和目的地規則。 即使已部署 Bookstore 第 2 版,我們仍只會部署 Bookstore 第 1 版。 Istio 虛擬服務只提供 Bookstore 第 1 版的路由。 與 OSM 處理流量轉移 (流量分割) 的方式不同,OSM 會為 Bookstore 第 2 版應用程式部署另一個服務。 OSM 需要設定使用 TrafficSplit 在用戶端要求之間分割流量。 搭配 Istio 使用流量轉移時,我們可以將流量轉移參考至針對相同服務標示的多個 Kubernetes 應用程式部署 (版本)。

在此逐步解說中,同時部署這兩個 Bookstore 版本 (v1 和 v2)。 因為虛擬服務組態的緣故,只有第 1 版可連線。 不需要為 Bookstore 第 2 版部署另一個服務,當我們稍後更新Bookstore 虛擬服務並提供必要的加權屬性來執行流量轉移時,便會啟用至 Bookstore 第 2 版的路由。

kubectl apply -f - <<EOF
# Create bookstore virtual service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookstore-virtualservice
  namespace: bookstore
spec:
  hosts:
  - bookstore
  http:
  - route:
    - destination:
        host: bookstore
        subset: v1
---
# Create bookstore destination rule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookstore-destination
  namespace: bookstore
spec:
  host: bookstore
  subsets:
  - name: v1
    labels:
      app: bookstore
      version: v1
  - name: v2
    labels:
      app: bookstore
      version: v2
EOF

建立 Pod、服務和服務帳戶

我們使用單一資訊清單檔案,其中包含先前部署 bookbuyerbookthiefbookstorebookwarehousemysql 應用程式的逐步解說中討論的修改。

kubectl apply -f - <<EOF
##################################################################################################
# bookbuyer service
##################################################################################################
---
# Create bookbuyer Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookbuyer
  namespace: bookbuyer
---
# Create bookbuyer Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookbuyer
  namespace: bookbuyer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookbuyer
      version: v1
  template:
    metadata:
      labels:
        app: bookbuyer
        version: v1
    spec:
      serviceAccountName: bookbuyer
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookbuyer
          image: openservicemesh/bookbuyer:latest-main
          imagePullPolicy: Always
          command: ["/bookbuyer"]
          env:
            - name: "BOOKSTORE_NAMESPACE"
              value: bookstore
            - name: "BOOKSTORE_SVC"
              value: bookstore
---
##################################################################################################
# bookthief service
##################################################################################################
---
# Create bookthief ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookthief
  namespace: bookthief
---
# Create bookthief Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookthief
  namespace: bookthief
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookthief
  template:
    metadata:
      labels:
        app: bookthief
        version: v1
    spec:
      serviceAccountName: bookthief
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookthief
          image: openservicemesh/bookthief:latest-main
          imagePullPolicy: Always
          command: ["/bookthief"]
          env:
            - name: "BOOKSTORE_NAMESPACE"
              value: bookstore
            - name: "BOOKSTORE_SVC"
              value: bookstore
            - name: "BOOKTHIEF_EXPECTED_RESPONSE_CODE"
              value: "503"
---
##################################################################################################
# bookstore service version 1 & 2
##################################################################################################
---
# Create bookstore Service
apiVersion: v1
kind: Service
metadata:
  name: bookstore
  namespace: bookstore
  labels:
    app: bookstore
spec:
  ports:
    - port: 14001
      name: bookstore-port
  selector:
    app: bookstore

---
# Create bookstore Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookstore
  namespace: bookstore

---
# Create bookstore-v1 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookstore-v1
  namespace: bookstore
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookstore
      version: v1
  template:
    metadata:
      labels:
        app: bookstore
        version: v1
    spec:
      serviceAccountName: bookstore
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookstore
          image: openservicemesh/bookstore:latest-main
          imagePullPolicy: Always
          ports:
            - containerPort: 14001
              name: web
          command: ["/bookstore"]
          args: ["--port", "14001"]
          env:
            - name: BOOKWAREHOUSE_NAMESPACE
              value: bookwarehouse
            - name: IDENTITY
              value: bookstore-v1

---
# Create bookstore-v2 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookstore-v2
  namespace: bookstore
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookstore
      version: v2
  template:
    metadata:
      labels:
        app: bookstore
        version: v2
    spec:
      serviceAccountName: bookstore
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookstore
          image: openservicemesh/bookstore:latest-main
          imagePullPolicy: Always
          ports:
            - containerPort: 14001
              name: web
          command: ["/bookstore"]
          args: ["--port", "14001"]
          env:
            - name: BOOKWAREHOUSE_NAMESPACE
              value: bookwarehouse
            - name: IDENTITY
              value: bookstore-v2
---
##################################################################################################
# bookwarehouse service
##################################################################################################
---
# Create bookwarehouse Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
---
# Create bookwarehouse Service
apiVersion: v1
kind: Service
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
  labels:
    app: bookwarehouse
spec:
  ports:
  - port: 14001
    name: bookwarehouse-port
  selector:
    app: bookwarehouse
---
# Create bookwarehouse Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookwarehouse
  template:
    metadata:
      labels:
        app: bookwarehouse
        version: v1
    spec:
      serviceAccountName: bookwarehouse
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookwarehouse
          image: openservicemesh/bookwarehouse:latest-main
          imagePullPolicy: Always
          command: ["/bookwarehouse"]
##################################################################################################
# mysql service
##################################################################################################
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mysql
  namespace: bookwarehouse
---
apiVersion: v1
kind: Service
metadata:
  name: mysqldb
  labels:
    app: mysqldb
    service: mysqldb
spec:
  ports:
    - port: 3306
      name: tcp
  selector:
    app: mysqldb
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: bookwarehouse
spec:
  serviceName: mysql
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      serviceAccountName: mysql
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: mypassword
        - name: MYSQL_DATABASE
          value: booksdemo
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - mountPath: /mysql-data
          name: data
        readinessProbe:
          tcpSocket:
            port: 3306
          initialDelaySeconds: 15
          periodSeconds: 10
      volumes:
        - name: data
          emptyDir: {}
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 250M
EOF

若要在叢集上檢視這些資源,請執行下列命令:

kubectl get pods,deployments,serviceaccounts -n bookbuyer
kubectl get pods,deployments,serviceaccounts -n bookthief

kubectl get pods,deployments,serviceaccounts,services,endpoints -n bookstore
kubectl get pods,deployments,serviceaccounts,services,endpoints -n bookwarehouse

檢視應用程式 UI

與原始 OSM 逐步解說類似,如果您複製 OSM 存放庫,則可以利用連接埠轉送指令碼在此處檢視每個應用程式的 UI。 目前,我們只需要檢視 bookbuyerbookthief UI。

cp .env.example .env
bash <<EOF
./scripts/port-forward-bookbuyer-ui.sh &
./scripts/port-forward-bookthief-ui.sh &
wait
EOF

在瀏覽器中開啟下列 URL:

http://localhost:8080 - bookbuyer

http://localhost:8083 - bookthief

設定 Istio 的流量原則

為了維持原始 OSM Bookstore 逐步解說的持續性,以轉譯至 Istio,我們將討論 OSM 的寬鬆流量原則模式。 OSM 的寬鬆流量原則模式是允許或拒絕網格中的流量的概念,而不需要部署任何特定的 SMI 流量存取控制規則。 寬鬆流量模式設定的存在可讓使用者將應用程式上線到網格中,同時取得 mTLS 加密,而不需要明確的規則,即可允許網格中的應用程式進行通訊。 寬鬆流量模式功能可避免在 OSM 管理應用程式時立即中斷應用程式的通訊,並提供定義規則的時間,同時確保應用程式通訊經過 mTLS 加密。 此設定可透過 OSM 的 MeshConfig 設定為 truefalse

Istio 會以不同的方式處理 mTLS 強制執行。 不同於 OSM,Istio 的寬鬆模式會自動設定側車 Proxy 使用 mTLS,但允許服務同時接受純文字和 mTLS 流量。 與 OSM 寬鬆模式設定對等的,是利用 Istio 的 PeerAuthentication 設定。 PeerAuthentication 可以在命名空間或整個網格上更細微地完成。 如需 Istio 強制執行 mTLS 的詳細資訊,請參閱 istio 相互 TLS 移轉文章

在 Bookstore 命名空間上強制執行 Istio Strict 模式

請務必記住,就像 OSM 寬鬆模式一樣,Istio 的 PeerAuthentication 設定只會與 mTLS 強制執行的使用有關。 實際的第 7 層原則,就像 OSM HTTPRouteGroups 中使用的原則,是使用稍後在逐步解說中看到的 Istio AuthorizationPolicy 設定來處理。

我們會在 Istio 的 mTLS 嚴格模式中,細微地放置 bookbuyerbookthiefbookstorebookwarehouse 命名空間。

kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookbuyer
  namespace: bookbuyer
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookthief
  namespace: bookthief
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookstore
  namespace: bookstore
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
spec:
  mtls:
    mode: STRICT
EOF

部署 Istio 存取控制原則

與 OSM SMI 流量目標SMI 流量規格資源類似,為了定義要通訊之應用程式的存取控制和路由原則,Istio 會使用 AuthorizationPolicy 設定來完成這些類似的精細控制。

讓我們逐步解說如何轉譯 Bookstore TrafficTarget 原則,其特別允許只使用特定的第 7 層路徑、標頭和方法 bookbuyer 與其通訊。 以下是 traffic-access-v1.yaml 資訊清單的一部分。

kind: TrafficTarget
apiVersion: access.smi-spec.io/v1alpha3
metadata:
  name: bookstore
  namespace: bookstore
spec:
  destination:
    kind: ServiceAccount
    name: bookstore
    namespace: bookstore
  rules:
    - kind: HTTPRouteGroup
      name: bookstore-service-routes
      matches:
        - buy-a-book
        - books-bought
  sources:
    - kind: ServiceAccount
      name: bookbuyer
      namespace: bookbuyer
---
apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
  name: bookstore-service-routes
  namespace: bookstore
spec:
  matches:
    - name: books-bought
      pathRegex: /books-bought
      methods:
        - GET
      headers:
        - "user-agent": ".*-http-client/*.*"
        - "client-app": "bookbuyer"
    - name: buy-a-book
      pathRegex: ".*a-book.*new"
      methods:
        - GET

如果您在 TrafficTarget 原則下注意到,您可以在規格中明確定義哪些來源服務可與目的地服務通訊。 我們可以看到,我們允許來源 bookbuyer 授權與目的地 Bookstore 通訊。 如果我們將服務對服務授權從 OSM TrafficTarget 設定轉譯為 Istio AuthorizationPolicy,其看起來像這樣:

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: bookstore
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]

在 Istio 的 AuthorizationPolicy中,您會注意到 OSM TrafficTarget 原則目的地服務如何對應至選取器標籤比對,以及服務所在的命名空間。 來源服務會顯示在規則區段底下,其中有一個來源/原則屬性會對應至 bookbuyer 服務的服務帳戶名稱。

除了 OSM TrafficTarget 中的來源/目的地設定以外,OSM 會繫結使用 HTTPRouteGroup 進一步定義來源可存取的第 7 層授權。 我們可以在下面的 HTTPRouteGroup 部分看到。 允許的來源服務有兩個 matches

apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
  name: bookstore-service-routes
  namespace: bookstore
spec:
  matches:
    - name: books-bought
      pathRegex: /books-bought
      methods:
        - GET
      headers:
        - "user-agent": ".*-http-client/*.*"
        - "client-app": "bookbuyer"
    - name: buy-a-book
      pathRegex: ".*a-book.*new"
      methods:
        - GET

有一個名為 books-boughtmatch,可讓來源使用具有主機標頭使用者代理程式和用戶端應用程式資訊的 GET 方法來存取路徑 /books-bought,以及使用 GET 方法使用 regex express 的 buy-a-book 比對於包含 .*a-book.*new 的路徑。

我們可以在 Istio AuthorizationPolicy 的規則區段中定義這些 OSM HTTPRouteGroup 設定,如下所示:

apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]
        - source:
            namespaces: ["bookbuyer"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["*/books-bought", "*/buy-a-book/new"]
    - when:
        - key: request.headers[User-Agent]
          values: ["*-http-client/*"]
        - key: request.headers[Client-App]
          values: ["bookbuyer"]

我們現在可以部署 OSM 移轉的 traffic-access-v1.yaml 資訊清單,如下列 Istio 中所了解到的。 Bookthief 沒有 AuthorizationPolicy ,所以 Bookthief UI 應該停止從 Bookstore v1 遞增書籍:

kubectl apply -f - <<EOF
##################################################################################################
# bookstore policy
##################################################################################################
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]
        - source:
            namespaces: ["bookbuyer"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["*/books-bought", "*/buy-a-book/new"]
    - when:
        - key: request.headers[User-Agent]
          values: ["*-http-client/*"]
        - key: request.headers[Client-App]
          values: ["bookbuyer"]
---
##################################################################################################
# bookwarehouse policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "bookwarehouse"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: bookwarehouse
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookstore/sa/bookstore"]
        - source:
            namespaces: ["bookstore"]
      to:
        - operation:
            methods: ["POST"]
---
##################################################################################################
# mysql policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "mysql"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: mysql
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookwarehouse/sa/bookwarehouse"]
        - source:
            namespaces: ["bookwarehouse"]
      to:
         - operation:
            ports: ["3306"]
EOF

允許 Bookthief 應用程式存取 Bookstore

目前沒有 AuthorizationPolicy 允許 Bookthief 與 Bookstore 通訊。 我們可以部署下列 AuthorizationPolicy ,以允許 Bookthief 與 Bookstore 通訊。 您注意到允許 Bookthief 授權之 Bookstore 原則規則的新增。

kubectl apply -f - <<EOF
##################################################################################################
# bookstore policy
##################################################################################################
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer", "cluster.local/ns/bookthief/sa/bookthief"]
        - source:
            namespaces: ["bookbuyer", "bookthief"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["*/books-bought", "*/buy-a-book/new"]
    - when:
        - key: request.headers[User-Agent]
          values: ["*-http-client/*"]
        - key: request.headers[Client-App]
          values: ["bookbuyer"]
---
##################################################################################################
# bookwarehouse policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "bookwarehouse"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: bookwarehouse
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookstore/sa/bookstore"]
        - source:
            namespaces: ["bookstore"]
      to:
        - operation:
            methods: ["POST"]
---
##################################################################################################
# mysql policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "mysql"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: mysql
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookwarehouse/sa/bookwarehouse"]
        - source:
            namespaces: ["bookwarehouse"]
      to:
         - operation:
            ports: ["3306"]
EOF

Bookthief UI 現在應該從 Bookstore v1 遞增書籍。

設定兩個服務版本之間的流量轉移

示範如何平衡 Kubernetes 服務兩個版本之間的流量,稱為 Istio 中的流量轉移。 如您在上一節所述,流量轉移的 OSM 實作依賴部署的兩個不同服務,並將這些服務名稱新增至 TrafficTarget 原則的後端設定。 Istio 實作流量轉移的方式不需要此部署架構。 透過 Istio,我們可以建立多個部署,代表服務應用程式的每個版本,並透過 Istio virtualservice 設定將流量轉移至這些特定版本。

目前部署的 virtualservice 只有 Bookstore v1 版的路由規則,如下所示:

spec:
  hosts:
    - bookstore
  http:
    - route:
        - destination:
            host: bookstore
            subset: v1

我們會更新 virtualservice ,將 100% 的加權移轉到 Bookstore v2 版本。

kubectl apply -f - <<EOF
# Create bookstore virtual service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookstore-virtualservice
  namespace: bookstore
spec:
  hosts:
  - bookstore
  http:
  - route:
    - destination:
        host: bookstore
        subset: v1
      weight: 0
    - destination:
        host: bookstore
        subset: v2
      weight: 100
EOF

您現在應該只會看到 bookstore v2 服務的 bookbuyerbookthief UI 遞增。 您可以變更 weigth 屬性,在兩個 bookstore 版本之間轉移流量,以繼續實驗。

摘要

我們希望此逐步解說提供如何將您目前 OSM 原則移轉至 Istio 原則的必要指引。 花時間並檢閱 Istio 概念並逐步解說 Istio 自己的使用者入門指南,了解如何使用 Istio 服務網格來管理您的應用程式。