在服務網格中管理與公開應用程式

在叢集裡安裝 Istio 附加程式之後,您可以透過設定 Envoy Proxy Sidecar 注入並以子網域公開應用程式,將應用程式部署至 Istio 服務網格。

了解「BookInfo」範例應用程式

BookInfo 範例申請書(適用於) Istio 包含基礎示範設定與預設目的地規則,讓您能立即體驗 Istio 的各項功能。

在 Istio 1.4 版以及更新版本中,BookInfo 不以受管理附加程式的形式提供,必須個別安裝。 若要安裝 BookInfo,請參閱設定 BookInfo 範例應用程式

四個 BookInfo 微服務包括:

  • productpage 會呼叫 detailsreviews 微服務以移入頁面。
  • details 包含書籍資訊。
  • ratings 包含隨附書籍檢閱的書籍分級資訊。
  • reviews 包含書籍檢閱,並呼叫 ratings 微服務。 reviews 微服務具有多個版本:
    • v1 不會呼叫 ratings 微服務。
    • v2 會呼叫 ratings 微服務,並將評等顯示為 1 到 5 顆黑色星星。
    • v3 會呼叫 ratings 微服務,並將評等顯示為 1 到 5 顆紅色星星。

會修改其中每個微服務的部署 YAML,先將 Envoy Sidecar Proxy 以容器形式預先注入微服務的 Pod,再予以部署。 有關手動側車注入的更多資訊,請參閱 Istio 文件。 此外,BookInfo 應用程式已由 Istio 閘道在公用 IP 位址上公開。 雖然 BookInfo 應用程式可以協助您開始使用,但該應用程式並不適合用於正式作業目的。

設定 BookInfo 範例應用程式

  1. 在叢集裡安裝 BookInfo。 下載您作業系統的最新 Istio 套件,其包括 BookInfo 應用程式的配置檔。
    curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.29.5 sh -
    
  2. 導覽至 Istio 套件目錄。
    cd istio-1.29.5
    
  3. 標示自動 Sidecar 注入的 default 名稱空間。
    kubectl label namespace default istio-injection=enabled
    
  4. 部署 BookInfo 應用程式、閘道及目的地規則。
    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
    
  5. 確定已部署 BookInfo 微服務及其對應的 Pod。
    kubectl get svc
    kubectl get pods
    
    NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)          AGE
    details                   ClusterIP      172.21.19.104    <none>         9080/TCP         2m
    kubernetes                ClusterIP      172.21.0.1       <none>         443/TCP          1d
    productpage               ClusterIP      172.21.168.196   <none>         9080/TCP         2m
    ratings                   ClusterIP      172.21.11.131    <none>         9080/TCP         2m
    reviews                   ClusterIP      172.21.117.164   <none>         9080/TCP         2m
    NAME                                     READY     STATUS      RESTARTS   AGE
    details-v1-6865b9b99d-7v9h8              2/2       Running     0          2m
    productpage-v1-f8c8fb8-tbsz9             2/2       Running     0          2m
    ratings-v1-77f657f55d-png6j              2/2       Running     0          2m
    reviews-v1-6b7f6db5c5-fdmbq              2/2       Running     0          2m
    reviews-v2-7ff5966b99-zflkv              2/2       Running     0          2m
    reviews-v3-5df889bcff-nlmjp              2/2       Running     0          2m
    

公開存取 BookInfo

取得 istio-ingressgateway 負載平衡器的公開位址,該位址會揭露 BookInfo。

在 Classic 群集中建立閘道 URL

  1. 設定 Istio Ingress 主機。
    export INGRESS_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    
  2. 設定 Istio Ingress 埠。
    export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
    
  3. 建立使用 Istio Ingress 主機和埠的 GATEWAY_URL 環境變數。
    export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT
    
  4. GATEWAY_URL 變數進行 Curl 處理,以確認 BookInfo 應用程式正在執行中。 200 回應表示 BookInfo 應用程式與 Istio 適當地執行中。
    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    
  5. 嘗試多次重新整理頁面。 不同版本的評論區段會以紅色星號、黑色星號和無星號進行循環。

在 VPC 群集中建立閘道 URL

  1. 建立一個名為 GATEWAY_URL 的環境變數,並設定其值為 Istio 的 Ingress 主機名稱。
    export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    
  2. GATEWAY_URL 變數進行 Curl 處理,以確認 BookInfo 應用程式正在執行中。 200 回應表示 BookInfo 應用程式與 Istio 適當地執行中。
    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    

在瀏覽器中瀏覽 BookInfo 網頁

根據您的作業執行下列指令,即可在瀏覽器中檢視 BookInfo 應用程式。

Mac OS 或 Linux

open http://$GATEWAY_URL/productpage

Windows

start http://$GATEWAY_URL/productpage

嘗試多次重新整理頁面。 不同版本的評論區段會以紅色星號、黑色星號和無星號進行循環。

透過 IBM 提供的子網域來公開 BookInfo,但未使用 TLS

在叢集裡啟用 BookInfo 附加程式時,會為您建立 Istio 閘道 bookinfo-gateway。 該閘道使用 Istio 虛擬服務及目的地規則來配置以公用方式公開 BookInfo 應用程式的負載平衡器 istio-ingressgateway。 在下列步驟中,您會針對標準叢集裡的 istio-ingressgateway 負載平衡器 IP 位址或 VPC 叢集裡的主機名稱建立子網域,透過此子網域便可公開存取 BookInfo。

  1. 藉由建立 DNS 子網域,在標準叢集裡登錄 istio-ingressgateway 負載平衡器的 IP 位址,或在 VPC 叢集裡登錄其主機名稱。
    • 標準:
        ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --cluster <cluster_name_or_id>
        ```
    * VPC:
    ```sh {: pre}
        ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --cluster <cluster_name_or_id>
        ```
    
  2. 請驗證已建立子網域,並複製子網域。
    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    

經典叢集的輸出範例

Hostname                                                                                IP(s)              Health Monitor   SSL Cert Status           SSL Cert Secret Name
mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      None             created                   <certificate>

VPC 叢集的輸出範例

Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>

在 Web 瀏覽器中,開啟 BookInfo 產品頁面。 因為沒有設定 TLS,所以請確定您使用 HTTP。

http://<subdomain>/productpage

嘗試多次重新整理頁面。 發送至 http://<subdomain>/productpage 的請求,將由 Istio 閘道負載平衡器接收。 仍然會隨機傳回不同的 reviews 微服務版本,因為 Istio 閘道會管理微服務的虛擬服務及目的地遞送規則。

透過 IBM 提供的子網域,將 BookInfo 公開,並使用 TLS

在叢集裡啟用 BookInfo 附加程式時,會為您建立 Istio 閘道 bookinfo-gateway。 該閘道使用 Istio 虛擬服務及目的地規則來配置以公用方式公開 BookInfo 應用程式的負載平衡器 istio-ingressgateway。 在下列步驟中,您會針對標準叢集裡的 istio-ingressgateway 負載平衡器 IP 位址或 VPC 叢集裡的主機名稱建立子網域,透過此子網域便可公開存取 BookInfo。 您也可以使用 SSL 憑證啟用 HTTPS 連線至 BookInfo 應用程式。

  1. 藉由建立 DNS 子網域,在標準叢集裡登錄 istio-ingressgateway 負載平衡器的 IP 位址,或在 VPC 叢集裡登錄其主機名稱。

    • 標準:
        ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --secret-namespace istio-system --cluster <cluster_name_or_id>
        ```
    * VPC:
    ```sh {: pre}
        ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --secret-namespace istio-system --cluster <cluster_name_or_id>
        ```
    
  2. 驗證已建立子網域,並記下 SSL Cert Secret Name 欄位中的 SSL 密碼名稱。

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    

    經典叢集的輸出範例。

    Hostname                                                                                IP(s)              Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      None             created                   <certificate>
    

    VPC 叢集的輸出範例

    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>
    

設定 bookinfo-gateway 使用 TLS 終止

完成下列步驟,為 bookinfo-gateway 設定 TLS 終止。

  1. 刪除現有的 bookinfo-gateway,它未設定為處理 TLS 連線。
    kubectl delete gateway bookinfo-gateway
    
  2. 建立使用 TLS 終止的新 bookinfo-gateway 配置檔案。 將下列 YAML 檔案儲存為 bookinfo-gateway.yaml。 將 <secret_name> 改為之前找到的 SSL 秘訣名稱。
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: ingressgateway
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: <secret_name>
        hosts:
        - "*"
    
  3. 在叢集中建立新 bookinfo-gateway
    kubectl apply -f bookinfo-gateway.yaml
    
  4. 在 Web 瀏覽器中,開啟 BookInfo 產品頁面。 確保您在步驟 2 中找到的子網域使用 HTTPS。
    https://<subdomain>/productpage
    
  5. 嘗試多次重新整理頁面。 發送至 https://<subdomain>/productpage 的請求,將由 Istio 閘道負載平衡器接收。 仍然會隨機傳回不同的 reviews 微服務版本,因為 Istio 閘道會管理微服務的虛擬服務及目的地遞送規則。

瞭解發生什麼情況

BookInfo 範例示範三種 Istio 的資料流量管理元件如何一起運作,以將 Ingress 資料流量遞送至應用程式。

Gateway
bookinfo-gateway 閘道描述了一台負載平衡器,即位於 istio-system 命名空間中的 istio-ingressgateway 服務,該服務作為 BookInfo 網站的 HTTP / TCP 入站流量的入口點。 Istio 會配置負載平衡器,以在閘道配置檔中定義的埠上接聽 Istio 管理的應用程式的送入要求。 若要檢視「BookInfo」閘道的設定檔,請執行以下指令。
kubectl get gateway bookinfo-gateway -o yaml
VirtualService
bookinfoVirtualService 透過將微服務定義為 destinations,來定義控制請求在服務網格內如何路由的規則。 在 bookinfo 虛擬服務中,會透過埠 /productpage 將要求的 productpage URI 遞送至 9080 主機。 因此,所有對 BookInfo 應用程式的要求都會先遞送至 productpage 微服務,此微服務接著會呼叫其他 BookInfo 微服務。 若要查看虛擬服務規則,請執行下列指令。
kubectl get virtualservice bookinfo -o yaml
DestinationRule
當閘道器根據虛擬服務規則將請求進行路由後,detailsproductpageratings 以及 reviews DestinationRules 定義了當請求抵達微服務時所套用的政策。 例如,當您重新整理 BookInfo 產品頁面時,所看到的變更是隨機呼叫不同 productpage 微服務版本(v1v2v3)的 reviews 微服務結果。 隨機選取版本,因為 reviews 目的地規則會針對微服務的 subsets 或具名版本提供相同的加權。 將資料流量遞送至特定版本的服務時,虛擬服務規則即會使用這些子集。 若要查看套用至 BookInfo, 的目的地規則,請執行以下指令。
kubectl describe destinationrules

藉由設定 Sidecar 注入以在 Istio 服務網格中包含應用程式

準備好使用 Istio 來管理自己的應用程式了嗎? 部署應用程式之前,您必須先決定要如何將 Envoy Proxy Sidecar 注入應用程式 Pod。

每個應用程式 Pod 都必須運行一個 Envoy 代理 sidecar,以確保微服務位於服務網格中。 您可以確保 Sidecar 以自動或手動方式注入到每個應用程式 Pod 中。 有關 sidecar 注入的更多資訊,請參閱 Istio 文件

啟用自動 Sidecar 注入

啟用自動 Sidecar 注入時,名稱空間會接聽任何新的部署,並自動修改 Pod 範本規格,以使用 Envoy Proxy Sidecar 容器來建立應用程式 Pod。 當您打算將要與 Istio 整合的多個應用程式部署至名稱空間時,請針對該名稱空間啟用自動 Sidecar 注入。 依預設,在 Istio 受管理附加程式中,未對任何名稱空間已啟用自動 Sidecar 注入。

請勿對 kube-systemibm-system,ibm-operators 名稱空間啟用 Sidecar 注入。

若要啟用名稱空間的自動 Sidecar 注入,請執行下列動作:

  1. 取得您要在其中部署 Istio 管理的應用程式的名稱空間名稱。

    kubectl get namespaces
    
  2. 將名稱空間標示為 istio-injection=enabled

    kubectl label namespace <namespace> istio-injection=enabled
    
  3. 將應用程式部署到已標記的名稱空間中,或者重新部署已在該名稱空間中的應用程式。

    kubectl apply <myapp>.yaml --namespace <namespace>
    
  4. 可選 )若要重新部署該命名空間中的應用程式,請刪除該應用程式的 Pod,以便其能搭配已注入的 sidecar 重新部署。

    kubectl delete pod -l app=<myapp>
    
  5. 若您尚未建立服務來公開您的應用程式,請建立一個「Kubernetes」服務。 您的應用程式必須由 Kubernetes 服務公開,才能包含為 Istio 服務網格中的微服務。 請務必遵循 Istio 中針對 Pod 和服務所列出的要求

  6. 定義應用程式的服務。

    apiVersion: v1
    kind: Service
    metadata:
      name: myappservice
    spec:
      selector:
        <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs.
      ports:
      - protocol: TCP
        port: 8080 # The port that the service listens on
    
  7. 在叢集裡建立服務。 請確定服務會部署至與應用程式相同的名稱空間。

    kubectl apply -f myappservice.yaml -n <namespace>
    

應用程式 Pod 現在已整合至您的 Istio 服務網格,因為它們的 Istio Sidecar 容器與您的應用程式容器並排執行。

手動注入 Sidecar

若您不想為某個命名空間啟用自動 sidecar 注入功能,可以手動將 sidecar 注入部署的 YAML 檔案中。 當應用程式在命名空間中與其他部署並行執行,且您不希望自動將 sidecar 注入至這些部署時,請手動注入 sidecar。

請勿對 kube-systemibm-system,ibm-operators 名稱空間啟用 Sidecar 注入。

  1. 下載 istioctl 用戶端。
    curl -L https://istio.io/downloadIstio | sh -
    
  2. 導覽至 Istio 套件目錄。
    cd istio-1.29.5
    

若要手動將 Sidecar 注入部署,請執行下列動作:

  1. 將 Envoy Sidecar 注入應用程式部署 YAML。

    istioctl kube-inject -f <myapp>.yaml | kubectl apply -f -
    
  2. 部署應用程式。

    kubectl apply <myapp>.yaml
    
  3. 若您尚未建立服務來公開您的應用程式,請建立一個「Kubernetes」服務。 您的應用程式必須由 Kubernetes 服務公開,才能包含為 Istio 服務網格中的微服務。 請務必遵循 Istio 中針對 Pod 和服務所列出的要求

  4. 定義應用程式的服務。

    apiVersion: v1
    kind: Service
    metadata:
      name: myappservice
    spec:
      selector:
        <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs.
      ports:
      - protocol: TCP
        port: 8080 # The port that the service listens on.
    
  5. 在叢集裡建立服務。 請確定服務會部署至與應用程式相同的名稱空間。

    kubectl apply -f myappservice.yaml -n <namespace>
    

應用程式 Pod 現在已整合至您的 Istio 服務網格,因為它們的 Istio Sidecar 容器與您的應用程式容器並排執行。

addon-istio 中啟用或停用公共 Istio 負載平衡器 1.23

預設情況下,您的群集會啟用一個公共 Istio 負載平衡器 istio-ingressgateway,以負載平衡從網際網路傳入的要求到您 Istio 管理的應用程式。 您可以在群集的每個區域啟用 Istio 負載平衡器,以達到更高的可用性。

  1. 編輯 managed-istio-custom ConfigMap 資源。

    kubectl edit cm managed-istio-custom -n ibm-operators
    
  2. 驗證所有叢集區域都在 istio-ingressgateway-zone 欄位中。

    達拉斯的標準多區域叢集範例:

    istio-ingressgateway-zone-1: "dal10"
    istio-ingressgateway-zone-2: "dal12"
    istio-ingressgateway-zone-3: "dal13"
    
  3. istio-ingressgateway-public-1|2|3-enabled 欄位設定為 "true""false",在每個區域中啟用或停用 Istio 負載平衡器。

    如果您想要您的應用程式可供用戶端存取,請確保至少已啟用一個負載平衡器,或 建立自訂閘道負載平衡器。 如果您停用所有區域中的所有負載平衡器,則您的應用程式不再公開且無法從外部存取。

    在每一個區域中啟用公用閘道的範例:

    istio-ingressgateway-public-1-enabled: "true"
    istio-ingressgateway-public-2-enabled: "true"
    istio-ingressgateway-public-3-enabled: "true"
    
  4. 儲存並關閉配置檔。

  5. 驗證是否已建立新的 istio-ingressgateway 負載平衡器服務。

    kubectl get svc -n istio-system
    

若要透過使用 istio-ingressgateway 負載平衡器服務來揭露 Istio-managed 應用程式,請在 Gateway 資源中指定 istio: ingressgateway 選擇器。 如需詳細資訊,請參閱 Exposing Istio-managed apps

使用 DNS 揭露 Istio 輸入閘道

藉由為 istio-ingressgateway 負載平衡器建立 DNS 項目,並配置該負載平衡器以將資料流量轉遞到應用程式,以公用方式公開 Istio 管理的應用程式。

在下列步驟中,您可以建立下列資源,以設定使用者可用來存取應用程式的子網域:

  • 稱為 my-gateway 的閘道。 此閘道充當應用程式的公用進入點,並使用現有 istio-ingressgateway 負載平衡器服務來公開應用程式。 可以選擇配置閘道以使用 TLS 終止。
  • 一個名為「my-virtual-service」的虛擬服務。my-gateway 會根據您在 my-virtual-service 中定義的規則,將流量路由至您的應用程式。
  • istio-ingressgateway 負載平衡器的子網域。 根據 my-virtual-service 遞送規則,將所有對子網域的使用者要求轉遞給您的應用程式。

使用 DNS 開啟 Istio 輸入閘道,無需 TLS 終止

  1. 在叢集裡安裝 istio 受管理附加程式
  2. 安裝 istioctl CLI
  3. 為您的應用程式微服務設定 sidecar 注入,將應用程式微服務部署至命名空間,並為這些微服務建立 Kubernetes 服務,使其納入 Istio 服務網中

若要公開應用程式,請執行下列動作:

  1. 建立一個網關,該網關使用公開的 istio-ingressgateway 負載平衡服務,以開放 HTTP 的 80 號埠。 請將 替換為您所管理的 Istio 微服務所部署的命名空間。 有關閘道 YAML 元件的更多資訊,請參閱 Istio 參考文件

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: my-gateway
    spec:
      selector:
        app: ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    
  2. 在部署 Istio 受管理微服務的名稱空間中,套用閘道。

    kubectl apply -f my-gateway.yaml -n <namespace>
    
  3. 建立虛擬服務,以使用 my-gateway 閘道並定義應用程式微服務的遞送規則。 如果微服務接聽的不是埠 80,請新增該埠。 有關虛擬服務 YAML 元件的更多資訊,請參閱 Istio 參考文件

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: my-virtual-service
      namespace: <namespace> # The namespace where your Istio-managed microservices are deployed.
    spec:
      gateways:
      - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer.
      hosts:
      - '*'
      http:
      - match:
        - uri:
            exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`.
        route:
        - destination:
            host: <service_name> # Replace `service_name` with the name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices.
            port:
              number: 80 # If your microservice listens on a different port, replace `80` with the port.
    
  4. 在其中部署 Istio 管理的微服務的名稱空間中,套用虛擬服務規則。

    kubectl apply -f my-virtual-service.yaml -n <namespace>
    
  5. 取得 istio-ingressgateway 公開負載平衡器的外部 IP 位址(傳統叢集)或主機名稱(VPC 叢集)。 如果您 在群集的每個區域啟用了 Istio 負載平衡器,請取得每個區域中負載平衡器服務的 IP 位址或主機名稱。

    kubectl get svc -n istio-system
    
    # Example output for classic clusters
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   169.1.1.1       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
    # Example output for VPC clusters:
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   1234abcd-us-south.lb.appdomain.cloud       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
  6. 透過建立 DNS 子網域,來註冊負載平衡器的 IP 位址或主機名稱。 有關在IBM Cloud Kubernetes Service中註冊 DNS 子域的更多信息,請參閱 經典:註冊 NLB 子域 或有關使用 VPC ALBVPC NLB 的DNS 子域註冊VPC 負載平衡器主機名的訊息。

    ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
    

    VPC 叢集的範例指令。

    ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
    
  7. 驗證已建立子網域。 在輸出中,複製 SSL secret 的名稱到 SSL Cert Secret Name 欄位

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    

    經典叢集的輸出範例。

    Hostname                                                                                IP(s)              Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      None             created                   <certificate>
    

    VPC 叢集的輸出範例。

    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>
    
  8. 請輸入應用程式微服務的 URL,以確認流量是否已路由至由 Istio 管理的微服務。

    http://<host_name>/<service_path>
    

要尋找更精細的遞送控制嗎? 若要建立在負載平衡器將流量路由至各微服務後才套用的規則(例如將流量導向同一微服務不同版本的規則),您可以建立並套用 DestinationRules

需要對 Ingress 或 Egress 設定進行除錯? 確保 istio-global-proxy-accessLogFile 選項中的 managed-istio-custom ConfigMap 中的選項設定為 "/dev/stdout"。 Envoy 代理將存取資訊列印到其標準輸出,您可以透過執行 kubectl logs 指令來檢視 Envoy 容器。 如果您注意到閘道的 ibm-cloud-provider-ip Pod 停留在 pending 中,請參閱 此疑難排解主題

使用 DNS 開啟 Istio 輸入閘道,TLS 終止

  1. 在叢集裡安裝 istio 受管理附加程式
  2. 安裝 istioctl CLI
  3. 為您的應用程式微服務設定 sidecar 注入,將應用程式微服務部署至命名空間,並為這些微服務建立 Kubernetes 服務,使其納入 Istio 服務網中

若要公開應用程式,請執行下列動作:

  1. 透過建立 DNS 子網域,來註冊負載平衡器的 IP 位址或主機名稱。 如需在 IBM Cloud Kubernetes Service中登錄 DNS 子網域的相關資訊,請參閱 典型: 登錄 NLB 子網域向 DNS 子網域登錄 VPC 負載平衡器主機名稱

    • 標準叢集:
        ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
        ```
    * VPC 叢集:
    ```sh {: pre}
        ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
        ```
    
  2. 驗證已建立子網域。 在輸出中,複製 SSL secret 的名稱到 SSL Cert Secret Name 欄位

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    
    # Example output for classic clusters:
    Hostname                                                                                IP(s)              Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      None             created                   <certificate>
    
    # Example output for VPC clusters:
    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>
    
  3. 建立一個網關,該網關使用公開的 istio-ingressgateway 負載平衡服務,以開放 HTTP 的 80 號埠。 請將 替換為您所管理的 Istio 微服務所部署的命名空間。 有關閘道 YAML 元件的更多資訊,請參閱 Istio 參考文件

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: my-gateway
      namespace: <namespace>
    spec:
      selector:
        istio: ingressgateway
      servers:
        - port:
            name: https
            protocol: HTTPS
            number: 443
        tls:
          mode: SIMPLE
          serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
          privateKey: /etc/istio/ingressgateway-certs/tls.key
        hosts:
        - "*"
    
  4. 在部署 Istio 受管理微服務的名稱空間中,套用閘道。

    kubectl apply -f my-gateway.yaml -n <namespace>
    
  5. 建立虛擬服務,以使用 my-gateway 閘道並定義應用程式微服務的遞送規則。 有關虛擬服務 YAML 元件的更多資訊,請參閱 Istio 參考文件

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: my-virtual-service
      namespace: <namespace> # The namespace where your Istio-managed microservices are deployed.
    spec:
      gateways:
      - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer.
      hosts:
      - '*'
      http:
      - match:
        - uri:
            exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`.
        route:
        - destination:
            host: <service_name> # The name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices.
            port:
              number: 443 # If your microservice listens on a different port, replace 443 with the port.
    
  6. 在其中部署 Istio 管理的微服務的名稱空間中,套用虛擬服務規則。

    kubectl apply -f my-virtual-service.yaml -n <namespace>
    
  7. 取得 istio-ingressgateway 公開負載平衡器的外部 IP 位址(傳統叢集)或主機名稱(VPC 叢集)。 如果您 在群集的每個區域啟用了 Istio 負載平衡器,請取得每個區域中負載平衡器服務的 IP 位址或主機名稱。

    kubectl get svc -n istio-system
    
    # Example output for classic clusters:
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   169.1.1.1       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
    # Example output for VPC clusters:
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   1234abcd-us-south.lb.appdomain.cloud       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
  8. 請輸入應用程式微服務的 URL,以確認流量是否已路由至由 Istio 管理的微服務。

    https://<host_name>/<service_path>
    

NLB DNS 主機密碼的憑證每 90 天到期一次。 預設名稱空間中的密碼在到期的 37 天之前會由 IBM Cloud Kubernetes Service 自動更新,但每次更新密碼後,必須手動將密碼複製到 istio-system 名稱空間。 使用 Script 可自動化此過程。

要尋找更精細的遞送控制嗎? 若要建立在負載平衡器將流量路由至各微服務後才套用的規則(例如將流量導向同一微服務不同版本的規則),您可以建立並套用 DestinationRules

需要對 Ingress 或 Egress 設定進行除錯? 確保 istio-global-proxy-accessLogFile 選項中的 managed-istio-custom ConfigMap 中的選項設定為 "/dev/stdout"。 Envoy 代理將存取資訊列印到其標準輸出,您可以透過執行 kubectl logs 指令來檢視 Envoy 容器。 如果您注意到閘道的 ibm-cloud-provider-ip Pod 停留在 pending 中,請參閱 此疑難排解主題

藉由啟用 mTLS 來保護叢集內資料流量

啟用命名空間中工作負載的加密功能,以在群集內部實現相互 TLS ( mTLS )。 在叢集裡 Pod 之間由 Envoy 遞送的資料流量會使用 TLS 進行加密。 mTLS 的憑證管理由 Istio 進行處理。 如需詳細資訊,請參閱 Istio mutual TLS 文件

  1. 建立名為 default.yaml 的鑑別原則檔案。 此政策適用於命名空間範圍,並設定服務網格中的工作負載僅接受使用 TLS 加密的請求。 請注意,此處未包含任何 targets 規格,因為此政策適用於此命名空間中網格內的全部服務。
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "default"
    spec:
      mtls:
        mode: STRICT
    
  2. 將鑑別原則套用至名稱空間。
    kubectl apply -f default.yaml -n NAMESPACE
    
  3. 建立一個名為 destination-mtls.yaml 的目的地規則檔案。 此原則可設定命名空間中的服務網狀工作負載使用 TLS 傳送流量。 請注意,host: *.local 萬用字元會將此目的地規則套用於網格中的所有服務。
    apiVersion: "networking.istio.io/v1beta1"
    kind: "DestinationRule"
    metadata:
      name: "destination-mtls"
    spec:
      host: "*.local"
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    
  4. 套用目的地規則。
    kubectl apply -f destination-mtls.yaml -n NAMESPACE
    
  5. 若要為其他命名空間中的服務網格工作負載啟用 mTLS,請在每個命名空間中重複執行這些步驟。

此外,出於非鑑別原因(例如,將資料流量遞送到不同版本的服務),也會使用目的地規則。 為服務建立的任何目的地規則還必須包含設定為 mode: ISTIO_MUTUAL 的相同 TLS 區塊。 此區塊會封鎖規則置換在此部分中配置的網格範圍的 mTLS 設定。