配置验证的问题

    最常见的配置问题是关于 YAML 文件空格缩进以及数组符号 (-) 的错误。

    手动验证您的配置是否正确,当有必要的时候请参照 Istio API 文档

    验证 istiod-istio-system validationwebhookconfiguration 配置是否存在并且是正确的。无效的 apiVersionapiGroupresource 配置应该在两个 webhook 其中之一被列举出来。

    如果 validatingwebhookconfiguration 不存在,那就验证 istio-validation configmap 是否存在。Istio 使用 configmap 的数据来创建或更新 validatingwebhookconfiguration

    1. $ kubectl -n istio-system get configmap istio-validation -o jsonpath='{.data}'
    2. map[config:apiVersion: admissionregistration.k8s.io/v1beta1
    3. kind: ValidatingWebhookConfiguration
    4. metadata:
    5. name: istiod-istio-system
    6. namespace: istio-system
    7. labels:
    8. app: istiod
    9. release: istio
    10. istio: istiod
    11. webhooks:
    12. - name: validation.istio.io
    13. clientConfig:
    14. service:
    15. name: istiod
    16. namespace: istio-system
    17. caBundle: ""
    18. rules:
    19. - operations:
    20. - CREATE
    21. - UPDATE
    22. apiGroups:
    23. - config.istio.io
    24. - rbac.istio.io
    25. - security.istio.io
    26. - authentication.istio.io
    27. - networking.istio.io
    28. apiVersions:
    29. - "*"
    30. resources:
    31. - "*"
    32. failurePolicy: Fail
    33. sideEffects: None]
    34. (... snip ...)

    校验配置如果失败会自动关闭,正常情况下配置存在并校验通过,webhook 将被调用。在资源创建或更新的时候,如果缺失 caBundle或者错误的证书,亦或网络连接问题都将会导致报错。如果你确信你的配置没有问题,webhook 没有被调用却看不到任何错误信息,你的集群配置肯定有问题。

    x509: certificate signed by unknown authority 错误通常和 webhook 配置中的空 caBundle 有关,所以要确认它不为空 (请查阅)。Istio 有意识的使用 istio-validation configmap 和根证书,调整了 webhook 配置。

    1. 验证 istio-pilot pod 是否在运行:

      1. $ kubectl -n istio-system get pod -lapp=pilot
    2. 检查 pod 日志是否有错误,修复 caBundle 失败的时候会报错:

      1. $ kubectl get clusterrole istiod-istio-system -o yaml
      2. apiVersion: rbac.authorization.k8s.io/v1
      3. kind: ClusterRole
      4. name: istiod-istio-system
      5. rules:
      6. - apiGroups:
      7. - admissionregistration.k8s.io
      8. resources:
      9. - validatingwebhookconfigurations
      10. verbs:
      11. - '*'

      Istio 需要 validatingwebhookconfigurations 的写权限来创建和更新 validatingwebhookconfiguration 配置项。

    如果 istio-pilot pod 没有准备就绪,配置是不会被创建或者更新的,在下面的例子里您可以看到关于 no endpoints available 的错误信息。

    检查 istio-pilot pod 是否运行,并且检查 endpoint 是否准备就绪。

    1. $ kubectl -n istio-system get pod -lapp=pilot
    2. NAME READY STATUS RESTARTS AGE
    3. istio-pilot-5dbbbdb746-d676g 1/1 Running 0 2d

    如果 pod 或者 endpoint 尚未准备就绪,请检查 pod log 和任何导致 webhook pod 无法启动的异常状态,以及服务流量。

    1. $ for pod in $(kubectl -n istio-system get pod -lapp=pilot -o jsonpath='{.items[*].metadata.name}'); do \
    2. kubectl -n istio-system logs ${pod} \
    3. done
    1. $ for pod in $(kubectl -n istio-system get pod -lapp=pilot -o name); do \
    2. kubectl -n istio-system describe ${pod} \