組態驗證問題

看似有效的組態被拒絕

使用 istioctl validate -fistioctl analyze 更深入地了解為什麼組態被拒絕。使用與控制平面版本相似版本的 istioctl CLI。

最常回報的組態問題是 YAML 縮排和陣列表示法 (-) 錯誤。

請手動驗證您的設定是否正確,必要時請參考Istio API 參考文件

接受無效組態

驗證是否存在一個名為 istio-validator-,後接 <revision>-(如果不是預設版本),再後接 Istio 系統命名空間(例如,istio-validator-myrev-istio-system)的 validatingwebhookconfiguration,且該設定正確。無效設定的 apiVersionapiGroupresource 應列在 validatingwebhookconfigurationwebhooks 區段中。

$ kubectl get validatingwebhookconfiguration istio-validator-istio-system -o yaml
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  labels:
    app: istiod
    install.operator.istio.io/owning-resource-namespace: istio-system
    istio: istiod
    istio.io/rev: default
    operator.istio.io/component: Pilot
    operator.istio.io/managed: Reconcile
    operator.istio.io/version: unknown
    release: istio
  name: istio-validator-istio-system
  resourceVersion: "615569"
  uid: 112fed62-93e7-41c9-8cb1-b2665f392dd7
webhooks:
- admissionReviewVersions:
  - v1beta1
  - v1
  clientConfig:
    # caBundle should be non-empty. This is periodically (re)patched
    # every second by the webhook service using the ca-cert
    # from the mounted service account secret.
    caBundle: LS0t...
    # service corresponds to the Kubernetes service that implements the webhook
    service:
      name: istiod
      namespace: istio-system
      path: /validate
      port: 443
  failurePolicy: Fail
  matchPolicy: Equivalent
  name: rev.validation.istio.io
  namespaceSelector: {}
  objectSelector:
    matchExpressions:
    - key: istio.io/rev
      operator: In
      values:
      - default
  rules:
  - apiGroups:
    - security.istio.io
    - networking.istio.io
    - telemetry.istio.io
    - extensions.istio.io
    apiVersions:
    - '*'
    operations:
    - CREATE
    - UPDATE
    resources:
    - '*'
    scope: '*'
  sideEffects: None
  timeoutSeconds: 10

如果 istio-validator- webhook 不存在,請驗證 global.configValidation 安裝選項是否設定為 true

驗證設定是失敗關閉(fail-close)的。如果設定存在且範圍正確,則會調用 webhook。如果缺少 caBundle、憑證錯誤或網路連線問題,則在建立/更新資源時會產生錯誤訊息。如果您沒有看到任何錯誤訊息,並且沒有調用 webhook,而 webhook 設定是有效的,則表示您的叢集設定錯誤。

建立組態失敗並出現 x509 憑證錯誤

x509: certificate signed by unknown authority 相關錯誤通常是由於 webhook 設定中的 caBundle 為空所導致。請驗證它不是空的(請參閱驗證 webhook 設定)。Istio 會主動協調使用 istio-validation configmap 和根憑證的 webhook 設定。

  1. 驗證 istiod pod 是否正在執行

    $  kubectl -n istio-system get pod -lapp=istiod
    NAME                            READY     STATUS    RESTARTS   AGE
    istiod-5dbbbdb746-d676g   1/1       Running   0          2d
    
  2. 檢查 pod 日誌是否有錯誤。無法修補 caBundle 應會印出錯誤訊息。

    $ for pod in $(kubectl -n istio-system get pod -lapp=istiod -o jsonpath='{.items[*].metadata.name}'); do \
        kubectl -n istio-system logs ${pod} \
    done
    
  3. 如果修補失敗,請驗證 Istiod 的 RBAC 設定

    $ kubectl get clusterrole istiod-istio-system -o yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
      name: istiod-istio-system
    rules:
    - apiGroups:
      - admissionregistration.k8s.io
      resources:
      - validatingwebhookconfigurations
      verbs:
      - '*'
    

    Istio 需要 validatingwebhookconfigurations 的寫入權限才能建立和更新 validatingwebhookconfiguration

建立組態失敗並出現 no such hostsno endpoints available 錯誤

驗證是失敗關閉的。如果 istiod pod 尚未準備就緒,則無法建立和更新設定。在這種情況下,您會看到關於 no endpoints available 的錯誤。

驗證 istiod pod 是否正在執行,且端點是否已就緒。

$  kubectl -n istio-system get pod -lapp=istiod
NAME                            READY     STATUS    RESTARTS   AGE
istiod-5dbbbdb746-d676g   1/1       Running   0          2d
$ kubectl -n istio-system get endpoints istiod
NAME           ENDPOINTS                          AGE
istiod         10.48.6.108:15014,10.48.6.108:443   3d

如果 pod 或端點尚未就緒,請檢查 pod 日誌和狀態,以了解 webhook pod 無法啟動和提供流量的任何原因。

$ for pod in $(kubectl -n istio-system get pod -lapp=istiod -o jsonpath='{.items[*].metadata.name}'); do \
    kubectl -n istio-system logs ${pod} \
done
$ for pod in $(kubectl -n istio-system get pod -lapp=istiod -o name); do \
    kubectl -n istio-system describe ${pod} \
done
這個資訊對您有幫助嗎?
您有任何改進建議嗎?

感謝您的回饋!