自訂安裝設定

先決條件

開始之前,請檢查以下先決條件

  1. 下載 Istio 版本.
  2. 執行任何必要的平台特定設定
  3. 檢查Pod 和服務的需求

除了安裝任何 Istio 內建的設定檔之外,istioctl install 還提供完整的 API 來客製化設定。

此 API 中的設定參數可以使用命令列上的 --set 選項個別設定。例如,要在預設設定檔中啟用偵錯記錄,請使用此命令

$ istioctl install --set values.global.logging.level=debug

或者,IstioOperator 設定可以在 YAML 檔案中指定,並使用 -f 選項傳遞至 istioctl

$ istioctl install -f samples/operator/pilot-k8s.yaml

識別 Istio 元件

IstioOperator API 將組件定義如下表所示

組件
base
pilot
ingressGateways
egressGateways
cni
istiodRemote

這些組件的每個可配置設定都可以在 API 的 components.<component name> 下找到。 例如,若要使用 API 將 pilot 組件的 enabled 設定變更為 (false),請使用 --set components.pilot.enabled=false,或在 IstioOperator 資源中設定如下

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  components:
    pilot:
      enabled: false

所有組件也都共用一個通用 API,用於變更 Kubernetes 特定設定,位於 components.<component name>.k8s 下,如下節所述。

自訂 Kubernetes 設定

IstioOperator API 允許以一致的方式自訂每個組件的 Kubernetes 設定。

每個組件都有一個 KubernetesResourceSpec,允許變更以下設定。 使用此列表來識別要自訂的設定

  1. 資源
  2. 準備就緒探測 (Readiness probes)
  3. 副本計數 (Replica count)
  4. HorizontalPodAutoscaler
  5. PodDisruptionBudget
  6. Pod 註釋 (Pod annotations)
  7. Service 註釋 (Service annotations)
  8. ImagePullPolicy
  9. 優先級類別名稱 (Priority class name)
  10. 節點選擇器 (Node selector)
  11. 親和性和反親和性 (Affinity and anti-affinity)
  12. 服務 (Service)
  13. 容忍度 (Toleration)
  14. 策略 (Strategy)
  15. 環境變數 (Env)
  16. Pod 安全性環境 (Pod security context)
  17. 磁碟區和磁碟區掛載 (Volumes and volume mounts)

所有這些 Kubernetes 設定都使用 Kubernetes API 定義,因此可以參考 Kubernetes 文件

以下範例覆蓋檔案調整了 Pilot 的資源和水平 Pod 自動縮放設定

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  components:
    pilot:
      k8s:
        resources:
          requests:
            cpu: 1000m # override from default 500m
            memory: 4096Mi # ... default 2048Mi
        hpaSpec:
          maxReplicas: 10 # ... default 5
          minReplicas: 2  # ... default 1

使用 istioctl install 將修改後的設定套用到叢集

$ istioctl install -f samples/operator/pilot-k8s.yaml

使用 Helm API 自訂 Istio 設定

IstioOperator API 包含一個使用 values 欄位傳遞到 Helm API 的介面。

以下 YAML 檔案透過 Helm API 配置全域和 Pilot 設定

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  values:
    pilot:
      traceSampling: 0.1 # override from 1.0
    global:
      monitoringPort: 15014

某些參數將暫時存在於 Helm 和 IstioOperator API 中,包括 Kubernetes 資源、命名空間和啟用設定。 Istio 社群建議使用 IstioOperator API,因為它更一致、經過驗證,並且遵循 社群畢業流程

設定閘道

閘道是一種特殊的組件,因為可以定義多個入口和出口閘道。 在 IstioOperator API 中,閘道定義為列表類型。 default 設定檔安裝一個入口閘道,稱為 istio-ingressgateway。 您可以檢查此閘道的預設值

$ istioctl profile dump --config-path components.ingressGateways
$ istioctl profile dump --config-path values.gateways.istio-ingressgateway

這些命令會顯示閘道的 IstioOperator 和 Helm 設定,它們會一起用於定義產生的閘道資源。 可以像自訂任何其他組件一樣自訂內建閘道。

可以透過新增新的列表項目來建立新的使用者閘道

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  components:
    ingressGateways:
      - name: istio-ingressgateway
        enabled: true
      - namespace: user-ingressgateway-ns
        name: ilb-gateway
        enabled: true
        k8s:
          resources:
            requests:
              cpu: 200m
          serviceAnnotations:
            cloud.google.com/load-balancer-type: "internal"
          service:
            ports:
            - port: 8060
              targetPort: 8060
              name: tcp-citadel-grpc-tls
            - port: 5353
              name: tcp-dns

請注意,Helm 值 (spec.values.gateways.istio-ingressgateway/egressgateway) 由所有入口/出口閘道共用。 如果必須針對每個閘道自訂這些值,建議使用單獨的 IstioOperator CR 為使用者閘道產生資訊清單,與主要的 Istio 安裝分開

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: empty
  components:
    ingressGateways:
      - name: ilb-gateway
        namespace: user-ingressgateway-ns
        enabled: true
        # Copy settings from istio-ingressgateway as needed.
  values:
    gateways:
      istio-ingressgateway:
        debug: error

進階安裝自訂

自訂外部圖表和設定檔

istioctlinstallmanifest generateprofile 命令可以使用以下任何來源的圖表和設定檔

  • 編譯在圖表中。 如果未設定 --manifests 選項,則這是預設值。 編譯在圖表中的內容與 Istio 發行 .tgzmanifests/ 目錄中的內容相同。
  • 本機檔案系統中的圖表,例如 istioctl install --manifests istio-1.24.0/manifests

可以透過編輯 manifests/ 中的檔案來自訂本機檔案系統圖表和設定檔。 對於廣泛的變更,我們建議製作 manifests 目錄的副本,並在那裡進行變更。 但是請注意,必須保留 manifests 目錄中的內容佈局。

設定檔位於 manifests/profiles/ 下,可以編輯,並且可以透過建立具有所需設定檔名稱和 .yaml 副檔名的新檔案來新增設定檔。 istioctl 會掃描 profiles 子目錄,並且所有在那裡找到的設定檔都可以透過 IstioOperatorSpec 設定檔欄位中的名稱來參照。 在套用使用者覆蓋之前,內建設定檔會覆蓋預設設定檔 YAML。 例如,您可以建立一個名為 custom1.yaml 的新設定檔檔案,該檔案會自訂 default 設定檔中的某些設定,然後在該設定檔之上套用使用者覆蓋檔案

$ istioctl manifest generate --manifests mycharts/ --set profile=custom1 -f path-to-user-overlay.yaml

在這種情況下,custom1.yamluser-overlay.yaml 檔案將覆蓋在 default.yaml 檔案上,以取得用作資訊清單產生的最終值。

一般來說,不需要建立新的設定檔,因為可以透過傳遞多個覆蓋檔案來達成類似的結果。 例如,上面的命令等效於傳遞兩個使用者覆蓋檔案

$ istioctl manifest generate --manifests mycharts/ -f manifests/profiles/custom1.yaml -f path-to-user-overlay.yaml

僅當您需要透過 IstioOperatorSpec 中的名稱參照設定檔時,才需要建立自訂設定檔。

修補輸出資訊清單

IstioOperator CR 是 istioctl 的輸入,用於產生包含要套用到叢集的 Kubernetes 資源的輸出資訊清單。 輸出資訊清單可以在產生後,但在套用到叢集之前,透過 IstioOperatoroverlays API 進一步自訂,以新增、修改或刪除資源。

以下範例覆蓋檔案 (patch.yaml) 示範了可以完成的輸出資訊清單修補類型

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: empty
  hub: docker.io/istio
  tag: 1.1.6
  components:
    pilot:
      enabled: true
      namespace: istio-control
      k8s:
        overlays:
          - kind: Deployment
            name: istiod
            patches:
              # Select list item by value
              - path: spec.template.spec.containers.[name:discovery].args.[30m]
                value: "60m" # overridden from 30m
              # Select list item by key:value
              - path: spec.template.spec.containers.[name:discovery].ports.[containerPort:8080].containerPort
                value: 1234
              # Override with object (note | on value: first line)
              - path: spec.template.spec.containers.[name:discovery].env.[name:POD_NAMESPACE].valueFrom
                value: |
                  fieldRef:
                    apiVersion: v2
                    fieldPath: metadata.myPath
              # Deletion of list item
              - path: spec.template.spec.containers.[name:discovery].env.[name:REVISION]
              # Deletion of map item
              - path: spec.template.spec.containers.[name:discovery].securityContext
          - kind: Service
            name: istiod
            patches:
              - path: spec.ports.[name:https-dns].port
                value: 11111 # OVERRIDDEN

將檔案傳遞給 istioctl manifest generate -f patch.yaml 會將上述修補套用到預設設定檔輸出資訊清單。 這兩個修補的資源將如下所示進行修改 (為了簡潔起見,省略了資源的某些部分)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: istiod
spec:
  template:
    spec:
      containers:
      - args:
        - 60m
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              apiVersion: v2
              fieldPath: metadata.myPath
        name: discovery
        ports:
        - containerPort: 1234
---
apiVersion: v1
kind: Service
metadata:
  name: istiod
spec:
  ports:
  - name: https-dns
    port: 11111
---

請注意,修補是按照給定的順序套用的。 每個修補都套用在上一個修補的輸出之上。 修補中輸出資訊清單中不存在的路徑將會建立。

清單項目路徑選取

istioctl --set 旗標和 IstioOperator CR 中的 k8s.overlays 欄位都支援透過 [index][value][key:value] 進行清單項目選擇。 --set 旗標還會在資源中建立路徑中遺失的任何中間節點。

此資訊是否有用?
您是否有任何改進建議?

感謝您的意見回饋!