配置验证 Webhook
pilot.validation.istio.io
- 服务地址路径为/admitpilot
,负责验证 Pilot 使用的配置(例如VirtualService
、Authentication)。mixer.validation.istio.io
- 服务地址路径为/admitmixer
,负责验证 Mixer 使用的配置。
两个 webhook 都是在 istio-galley
服务的 443 端口上提供服务。每个 webhook 都有自己的 clientConfig
、 namespaceSelector
和 rules
部分。 这两个 webhook
都适用于所有的命名空间。 namespaceSelector
应该设置为空。两个规则都适用于 Istio CRD。
验证 istio-galley
validationwebhookconfiguration
配置存在并正确。 apiVersion
、apiGroup
和 resource
无效配置的资源应会在两个 webhooks
之一的条目中被列出。
如 validatingwebhookconfiguration
不存在,则需要验证 istio-galley-configuration
configmap
是否存在。istio-galley
使用此 configmap 中的数据来创建和更新 validatingwebhookconfiguration
。
$ kubectl -n istio-system get configmap istio-galley-configuration -o jsonpath='{.data}'
map[validatingwebhookconfiguration.yaml:apiVersion: admissionregistration.k8s.io/v1beta1
kind: ValidatingWebhookConfiguration
metadata:
name: istio-galley
namespace: istio-system
labels:
app: istio-galley
chart: galley-1.0.0
release: istio
heritage: Tiller
webhooks:
- name: pilot.validation.istio.io
service:
name: istio-galley
namespace: istio-system
path: "/admitpilot"
rules:
- operations:
(... snip ...)
如果 istio-galley-configuration
中的 webhook 数组为空,且是使用的是 helm template
或 helm 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 正在运行:
$ kubectl -n istio-system get pod -listio=galley
NAME READY STATUS RESTARTS AGE
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
失败则会打印相关错误。
$ for pod in $(kubectl -n istio-system get pod -listio=galley -o jsonpath='{.items[*].metadata.name}'); do \
kubectl -n istio-system logs ${pod} \
done
- 如果 patch 失败,则需验证 Galley 的 RBAC 配置:
$ kubectl get clusterrole istio-galley-istio-system -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
app: istio-galley
name: istio-galley-istio-system
rules:
- apiGroups:
- admissionregistration.k8s.io
resources:
verbs:
- '*'
- apiGroups:
- config.istio.io
resources:
- '*'
verbs:
- get
- list
- watch
- apiGroups:
- '*'
resourceNames:
- istio-galley
resources:
- deployments
verbs:
- get
istio-galley
需对于 validatingwebhookconfigurations
写访问权以创建和更新 istio-galley
validatingwebhook
配置。
验证是失败关闭的(fail-close)。如果 istio-galley
pod 没有准备好,则无法创建和更新相关配置。这种情况下,会提示如下错误: no such host
(Kubernetes 1.9) 或 no endpoints available
(>=1.10)的错误。
$ kubectl -n istio-system get endpoints istio-galley
NAME ENDPOINTS AGE
istio-galley 10.48.6.108:10514,10.48.6.108:443 3d
如果 pod 或 endpoint 尚未就绪,请检查 pod 日志和状态,以获取有关 webhook pod 无法启动和提供流量的原因。
$ for pod in $(kubectl -n istio-system get pod -listio=galley -o jsonpath='{.items[*].metadata.name}'); do \
done