WebHook 是一种 HTTP 回调:一种当有事情发生时的 HTTP POST 请求;一种基于 HTTP POST 方式完成的事件通知。实现了 WebHook 的 Web 应用会在特定事件发生时通过 POST 向某 URL 发送消息。
当 Webhook
模式被启用时,Kubernetes 会在需要确定用户权限时访问外部 REST 服务。
Webhook
模式需要一个通过 --authorization-webhook-config-file=SOME_FILENAME
参数指定的 HTTP 配置文件。
配置文件使用 kubeconfig 文件格式。在文件中,”users” 对应 API 服务器 webhook,”clusters” 指远程服务。
使用 HTTPS 客户端鉴权的配置文件示例:
# Kubernetes API 版本
apiVersion: v1
# API 对象类型
kind: Config
# 远程服务对应的集群。
clusters:
- name: name-of-remote-authz-service
cluster:
# 远程服务验证所需 CA
certificate-authority: /path/to/ca.pem
# 用来访问远程服务的 URL。必须使用 'https'。不可以包含参数。
server: https://authz.example.com/authorize
# API 服务器的 webhook 配置对应的用户
users:
- name: name-of-api-server
user:
client-certificate: /path/to/cert.pem # webhook 插件所使用的证书
client-key: /path/to/key.pem # 与证书对应的密钥
# kubeconfig 文件所需上下文。提供给 API 服务器使用。
current-context: webhook
contexts:
- context:
cluster: name-of-remote-authz-service
user: name-of-api-server
name: webhook
鉴权时,API 服务器使用 POST 方式发送一条 JSON-序列化的 authorization.k8s.io/v1beta1
SubjectAccessReview
对象来描述操作。此对象包含了描述发出请求的用户的字段,还包含了将要被访问的资源信息或请求属性。
请注意,webhook API 对象和其它 Kubernetes API 对象一样遵循版本兼容性规则。
实现者应当注意 beta 版本对象的兼容性承诺是相当宽松的,并检查请求的 “apiVersion” 字段来保证正确的反序列化。此外,API服务器必须启用 authorization.k8s.io/v1beta1
API 扩展组 (--runtime-config=authorization.k8s.io/v1beta1=true
)。
请求体示例:
{
"apiVersion": "authorization.k8s.io/v1beta1",
"kind": "SubjectAccessReview",
"spec": {
"resourceAttributes": {
"namespace": "kittensandponies",
"verb": "get",
"group": "unicorn.example.org",
"resource": "pods"
},
"user": "jane",
"group": [
"group1",
"group2"
]
}
}
远程服务应当填写请求的 status
字段,并且返回是否允许访问的响应。响应体的 spec
字段应当被忽略,且可以被省略。允许访问的响应返回格式如下:
{
"apiVersion": "authorization.k8s.io/v1beta1",
"kind": "SubjectAccessReview",
"status": {
"allowed": true
}
}
远程服务拒绝访问的返回格式如下:
{
"apiVersion": "authorization.k8s.io/v1beta1",
"kind": "SubjectAccessReview",
"status": {
"allowed": false,
"reason": "user does not have read access to the namespace"
}
}
对非资源路径的请求格式如下:
{
"apiVersion": "authorization.k8s.io/v1beta1",
"kind": "SubjectAccessReview",
"spec": {
"nonResourceAttributes": {
"path": "/debug",
"verb": "get"
},
"user": "jane",
"group": [
"group1",
"group2"
]
}
}
非资源路径包括: /api
、/apis
、/metrics
、/resetMetrics
、/logs
、/debug
、
/healthz
、/swagger-ui/
、/swaggerapi/
、/ui
和 /version
。
客户端需要访问 /api
、/api/*
、/apis
、/apis/*
和 /version
来获取服务器上存在资源和版本列表。
对其它非资源路径的访问可以被禁止;这样做并不会影响对 REST API 的访问。
关于 Webhook 模式的更多信息可参阅 authorization.v1beta1 API 对象的参考指南和 webhook.go 文件。
此页是否对您有帮助?
Thanks for the feedback. If you have a specific, answerable question about how to use Kubernetes, ask it on Stack Overflow. Open an issue in the GitHub repo if you want to report a problem or suggest an improvement.