組態驗證問題
看似有效的組態被拒絕
使用 istioctl validate -f 和 istioctl analyze 更深入地了解為什麼組態被拒絕。使用與控制平面版本相似版本的 istioctl CLI。
最常回報的組態問題是 YAML 縮排和陣列表示法 (-
) 錯誤。
請手動驗證您的設定是否正確,必要時請參考Istio API 參考文件。
接受無效組態
驗證是否存在一個名為 istio-validator-
,後接 <revision>-
(如果不是預設版本),再後接 Istio 系統命名空間(例如,istio-validator-myrev-istio-system
)的 validatingwebhookconfiguration
,且該設定正確。無效設定的 apiVersion
、apiGroup
和 resource
應列在 validatingwebhookconfiguration
的 webhooks
區段中。
$ 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 設定。
驗證
istiod
pod 是否正在執行$ kubectl -n istio-system get pod -lapp=istiod NAME READY STATUS RESTARTS AGE istiod-5dbbbdb746-d676g 1/1 Running 0 2d
檢查 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
如果修補失敗,請驗證 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 hosts
或 no 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