配置验证 Webhook

    • pilot.validation.istio.io - 服务地址路径为 /admitpilot,负责验证 Pilot 使用的配置(例如 VirtualService 、Authentication)。

    • mixer.validation.istio.io - 服务地址路径为 /admitmixer,负责验证 Mixer 使用的配置。

    两个 webhook 都是在 istio-galley 服务的 443 端口上提供服务。每个 webhook 都有自己的 clientConfignamespaceSelectorrules 部分。 这两个 webhook 都适用于所有的命名空间。 namespaceSelector 应该设置为空。两个规则都适用于 Istio CRD。

    验证 istio-galley validationwebhookconfiguration 配置存在并正确。 apiVersionapiGroupresource 无效配置的资源应会在两个 webhooks 之一的条目中被列出。

    validatingwebhookconfiguration 不存在,则需要验证 istio-galley-configuration configmap 是否存在。istio-galley 使用此 configmap 中的数据来创建和更新 validatingwebhookconfiguration

    1. $ kubectl -n istio-system get configmap istio-galley-configuration -o jsonpath='{.data}'
    2. map[validatingwebhookconfiguration.yaml:apiVersion: admissionregistration.k8s.io/v1beta1
    3. kind: ValidatingWebhookConfiguration
    4. metadata:
    5. name: istio-galley
    6. namespace: istio-system
    7. labels:
    8. app: istio-galley
    9. chart: galley-1.0.0
    10. release: istio
    11. heritage: Tiller
    12. webhooks:
    13. - name: pilot.validation.istio.io
    14. service:
    15. name: istio-galley
    16. namespace: istio-system
    17. path: "/admitpilot"
    18. rules:
    19. - operations:
    20. (... snip ...)

    如果 istio-galley-configuration 中的 webhook 数组为空,且是使用的是 helm templatehelm install 的方式,请验证 —set galley.enabled—set global.configValidation=true 选项是否已经设置。如果并使用 helm 的方式,则需要找到生成的 YAML,其中包含填充的 webhook 数组。

    x509: certificate signed by unknown authority 相关的错误通常由 webhook 配置中 caBundle 为空引起。验证它是否为空(请参阅验证 webhook 配置)。istio-galley 部署可动态使用保存在 istio-galley-configuration configmap 中的 webhook 配置和根证书会从 istio-system 命名空间中保存的 istio.istio-galley-service-account 密钥中加载。

    • 验证 istio-galley pod 正在运行:
    1. $ kubectl -n istio-system get pod -listio=galley
    2. NAME READY STATUS RESTARTS AGE
    3. istio-galley-5dbbbdb746-d676g 1/1 Running 0 2d
    • 确认使用的是 Istio 版本 >= 1.0.0。旧版本的 Galley 不能正确地 re-patch caBundle。这种情况通常发生在重新部署 istio.yaml 时,需要覆盖之前 patch 过的 caBundle
    • 检查 Galley pod 日志是否存在错误。Patch caBundle 失败则会打印相关错误。
    1. $ for pod in $(kubectl -n istio-system get pod -listio=galley -o jsonpath='{.items[*].metadata.name}'); do \
    2. kubectl -n istio-system logs ${pod} \
    3. done
    • 如果 patch 失败,则需验证 Galley 的 RBAC 配置:
    1. $ kubectl get clusterrole istio-galley-istio-system -o yaml
    2. apiVersion: rbac.authorization.k8s.io/v1
    3. kind: ClusterRole
    4. metadata:
    5. app: istio-galley
    6. name: istio-galley-istio-system
    7. rules:
    8. - apiGroups:
    9. - admissionregistration.k8s.io
    10. resources:
    11. verbs:
    12. - '*'
    13. - apiGroups:
    14. - config.istio.io
    15. resources:
    16. - '*'
    17. verbs:
    18. - get
    19. - list
    20. - watch
    21. - apiGroups:
    22. - '*'
    23. resourceNames:
    24. - istio-galley
    25. resources:
    26. - deployments
    27. verbs:
    28. - get

    istio-galley 需对于 validatingwebhookconfigurations 写访问权以创建和更新 istio-galley validatingwebhook 配置。

    验证是失败关闭的(fail-close)。如果 istio-galley pod 没有准备好,则无法创建和更新相关配置。这种情况下,会提示如下错误: no such host (Kubernetes 1.9) 或 no endpoints available (>=1.10)的错误。

    1. $ kubectl -n istio-system get endpoints istio-galley
    2. NAME ENDPOINTS AGE
    3. istio-galley 10.48.6.108:10514,10.48.6.108:443 3d

    如果 pod 或 endpoint 尚未就绪,请检查 pod 日志和状态,以获取有关 webhook pod 无法启动和提供流量的原因。

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