配置验证的问题

看似有效的配置不生效

使用 istioctl validate -f 以及 istioctl analyze 来获取更多为什么配置不生效的信息。使用和控制面版本相似的 istioctl CLI。

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

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

接受无效配置

验证存在正确的名为 istio-validator- 且后跟 <revision>-validatingwebhookconfiguration, 如果不是默认的修订版则后跟 Istio 系统命名空间(例如 istio-validator-myrev-istio-system)。 有效配置的 apiVersionapiGroupresource 应列举在 validatingwebhookconfigurationwebhooks 部分。

  1. $ kubectl get validatingwebhookconfiguration istio-validator-istio-system -o yaml
  2. apiVersion: admissionregistration.k8s.io/v1
  3. kind: ValidatingWebhookConfiguration
  4. metadata:
  5. labels:
  6. app: istiod
  7. install.operator.istio.io/owning-resource-namespace: istio-system
  8. istio: istiod
  9. istio.io/rev: default
  10. operator.istio.io/component: Pilot
  11. operator.istio.io/managed: Reconcile
  12. operator.istio.io/version: unknown
  13. release: istio
  14. name: istio-validator-istio-system
  15. resourceVersion: "615569"
  16. uid: 112fed62-93e7-41c9-8cb1-b2665f392dd7
  17. webhooks:
  18. - admissionReviewVersions:
  19. - v1beta1
  20. - v1
  21. clientConfig:
  22. # caBundle 应该是非空的。webhook
  23. # 服务使用已安装服务帐户密码中的 ca-cert
  24. # 每隔一秒定期(重新)修订一次。
  25. caBundle: LS0t...
  26. # service 对应实现 webhook 的 Kubernetes 服务
  27. service:
  28. name: istiod
  29. namespace: istio-system
  30. path: /validate
  31. port: 443
  32. failurePolicy: Fail
  33. matchPolicy: Equivalent
  34. name: rev.validation.istio.io
  35. namespaceSelector: {}
  36. objectSelector:
  37. matchExpressions:
  38. - key: istio.io/rev
  39. operator: In
  40. values:
  41. - default
  42. rules:
  43. - apiGroups:
  44. - security.istio.io
  45. - networking.istio.io
  46. - telemetry.istio.io
  47. - extensions.istio.io
  48. apiVersions:
  49. - '*'
  50. operations:
  51. - CREATE
  52. - UPDATE
  53. resources:
  54. - '*'
  55. scope: '*'
  56. sideEffects: None
  57. timeoutSeconds: 10

如果 istio-validator- webhook 不存在,那就验证 global.configValidation 安装选项是否被设为 true

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

创建配置失败报错:x509 certificate errors

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

  1. 验证 istiod Pod 是否在运行:

    1. $ kubectl -n istio-system get pod -lapp=istiod
    2. NAME READY STATUS RESTARTS AGE
    3. istiod-5dbbbdb746-d676g 1/1 Running 0 2d
  2. 检查 Pod 日志是否有错误,修复 caBundle 失败的时候会报错:

    1. $ for pod in $(kubectl -n istio-system get pod -lapp=istiod -o jsonpath='{.items[*].metadata.name}'); do \
    2. kubectl -n istio-system logs ${pod} \
    3. done
  3. 如果修复失败,请验证 Istiod 的 RBAC 配置:

    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 配置项。

创建配置报错:no such hostsno endpoints available

校验失败自动关闭。如果 istiod Pod 没有准备就绪, 配置是不会被创建或者更新的,在下面的例子里您可以看到关于 no endpoints available 的错误信息。

检查 istiod Pod 是否运行,并且检查 endpoint 是否准备就绪。

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

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

  1. $ for pod in $(kubectl -n istio-system get pod -lapp=istiod -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=istiod -o name); do \
  2. kubectl -n istio-system describe ${pod} \
  3. done