1. Kubernetes介绍
Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种便捷的方式来管理容器,使得应用程序可以在多个主机上运行,并能够自动处理容器的调度、网络和存储等方面的问题。Kubernetes具有高度可扩展性和灵活性,被广泛用于构建和管理云原生应用程序。
2.Kubernetes webhook介绍
Kubernetes的Webhook是一种机制,用于与Kubernetes API进行交互和集成。它允许开发人员定义自定义的触发器,当发生特定事件时,可以通过Webhook来执行一些自定义的逻辑。
具体来说,Kubernetes的Webhook能够在以下几个关键事件发生时触发:
-
Mutating Webhook:在创建或更新资源之前,可以对请求进行修改。通过Webhook,可以自定义对请求的修改,例如自动注入某些标签、修改容器的环境变量等。
-
Validation Webhook:在创建或更新资源之前,可以对请求进行验证。通过Webhook,可以自定义验证逻辑,例如检查资源的字段是否符合特定的规则或策略。
使用Webhook可以扩展和定制Kubernetes的行为,使其适应特定的环境和需求。开发人员可以编写Webhook服务,并将其配置到Kubernetes集群中,从而实现对Kubernetes API请求的自定义处理。
3.应用场景
-
安全性增强:通过Admission控制Webhook,可以对Kubernetes资源的创建、更新或删除进行自定义验证,确保只有符合特定条件的请求被允许执行。这可以提高集群的安全性,防止恶意或非法操作。
-
自动化和标准化:使用Mutating Webhook,可以在资源创建或更新之前对请求进行修改。这使得可以对资源应用一致的配置、标签或注解,并自动执行一些常见的操作,如自动添加sidecar容器、注入特定的环境变量等。这样可以实现自动化的部署和配置管理,提高应用程序的可靠性和一致性。
-
灵活性和可扩展性:Webhook机制允许您根据特定需求或场景自定义验证和处理逻辑。这样可以扩展Kubernetes平台的能力,满足特定企业或组织的需求。开发人员可以编写自定义的Webhook服务,根据业务逻辑对请求进行处理,在Kubernetes集群中实现个性化的特性或定制策略。
-
第三方集成和生态系统:Kubernetes的Webhook机制提供了与其他第三方工具和服务集成的桥梁。通过Webhook,可以将Kubernetes与其他服务或系统进行集成,如CI/CD工具、安全审计工具、配置管理工具等,从而构建更强大和完整的开发和运维生态系统。
综上所述,Kubernetes的Webhook在增强安全性、实现自动化、提供灵活性和促进第三方集成方面具有重要的应用意义,可以帮助开发人员更好地管理和扩展Kubernetes平台。
4. Validation Webhook 使用介绍:
4.1 资源配置:
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: "pod-policy.example.com"
webhooks:
- name: "pod-policy.example.com"
rules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE"]
resources: ["pods"]
scope: "Namespaced"
clientConfig:
service:
namespace: "example-namespace"
name: "example-service"
caBundle: <CA_BUNDLE>
admissionReviewVersions: ["v1"]
sideEffects: None
timeoutSeconds: 5
以官网提供的实例为例,要注册准入 Webhook,需要创建 MutatingWebhookConfiguration 或 ValidatingWebhookConfiguration API 对象。 MutatingWebhookConfiguration 或ValidatingWebhookConfiguration 对象的名称必须是有效的 DNS 子域名。
每个 Webhook 必须指定用于确定是否应将对 apiserver 的请求发送到 webhook 的规则列表。 每个规则都指定一个或多个 operations、apiGroups、apiVersions 和 resources 以及资源的 scope:
-
operations 列出一个或多个要匹配的操作。 可以是 CREATE、UPDATE、DELETE、CONNECT 或
*
以匹配所有内容。 -
apiGroups 列出了一个或多个要匹配的 API 组。
""
是核心 API 组。"*"
匹配所有 API 组。 -
apiVersions 列出了一个或多个要匹配的 API 版本。
"*"
匹配所有 API 版本。 -
resources 列出了一个或多个要匹配的资源。
-
"*"
匹配所有资源,但不包括子资源。 -
"*/*"
匹配所有资源,包括子资源。 -
"pods/*" 匹配 pod 的所有子资源。
-
"*/status" 匹配所有 status 子资源。
-
-
scope 指定要匹配的范围。有效值为 "Cluster"、"Namespaced" 和
"*"
。 子资源匹配其父资源的范围。默认值为"*"
。-
"Cluster"表示只有集群作用域的资源才能匹配此规则(API 对象 Namespace 是集群作用域的)。
-
"Namespaced"意味着仅具有名字空间的资源才符合此规则。
-
"*"
表示没有作用域限制。
-
如果传入请求与任何 Webhook 的rules 指定 operations、groups、versions、 resources 和 scope 匹配,则该请求将发送到 Webhook。
4.2 请求
Webhook 发送 POST 请求时,会将请求包装成AdmissionReview,具体参数如下所示:
apiVersion: admission.k8s.io/v1
kind: AdmissionReview
request:
# 唯一标识此准入回调的随机 uid
uid: 705ab4f5-6393-11e8-b7cc-42010a800002
# 传入完全正确的 group/version/kind 对象
kind:
group: autoscaling
version: v1
kind: Scale
# 修改 resource 的完全正确的的 group/version/kind
resource:
group: apps
version: v1
resource: deployments
# subResource(如果请求是针对 subResource 的)
subResource: scale
# 在对 API 服务器的原始请求中,传入对象的标准 group/version/kind
# 仅当 Webhook 指定 `matchPolicy: Equivalent` 且将对 API 服务器的原始请求
# 转换为 Webhook 注册的版本时,这才与 `kind` 不同。
requestKind:
group: autoscaling
version: v1
kind: Scale
# 在对 API 服务器的原始请求中正在修改的资源的标准 group/version/kind
# 仅当 Webhook 指定了 `matchPolicy:Equivalent` 并且将对 API 服务器的原始请求转换为
# Webhook 注册的版本时,这才与 `resource` 不同。
requestResource:
group: apps
version: v1
resource: deployments
# subResource(如果请求是针对 subResource 的)
# 仅当 Webhook 指定了 `matchPolicy:Equivalent` 并且将对
# API 服务器的原始请求转换为该 Webhook 注册的版本时,这才与 `subResource` 不同。
requestSubResource: scale
# 被修改资源的名称
name: my-deployment
# 如果资源是属于名字空间(或者是名字空间对象),则这是被修改的资源的名字空间
namespace: my-namespace
# 操作可以是 CREATE、UPDATE、DELETE 或 CONNECT
operation: UPDATE
userInfo:
# 向 API 服务器发出请求的经过身份验证的用户的用户名
username: admin
# 向 API 服务器发出请求的经过身份验证的用户的 UID
uid: 014fbff9a07c
# 向 API 服务器发出请求的经过身份验证的用户的组成员身份
groups:
- system:authenticated
- my-admin-group
# 向 API 服务器发出请求的用户相关的任意附加信息
# 该字段由 API 服务器身份验证层填充,并且如果 webhook 执行了任何
# SubjectAccessReview 检查,则应将其包括在内。
extra:
some-key:
- some-value1
- some-value2
# object 是被接纳的新对象。
# 对于 DELETE 操作,它为 null。
object:
apiVersion: autoscaling/v1
kind: Scale
# oldObject 是现有对象。
# 对于 CREATE 和 CONNECT 操作,它为 null。
oldObject:
apiVersion: autoscaling/v1
kind: Scale
# options 包含要接受的操作的选项,例如 meta.k8s.io/v CreateOptions、UpdateOptions 或 DeleteOptions。
# 对于 CONNECT 操作,它为 null。
options:
apiVersion: meta.k8s.io/v1
kind: UpdateOptions
# dryRun 表示 API 请求正在以 `dryrun` 模式运行,并且将不会保留。
# 带有副作用的 Webhook 应该避免在 dryRun 为 true 时激活这些副作用。
dryRun: False
可以通过反序列化获取AdmissionReview对象的所有信息,然后根据实际的业务常见,对相关资源的属性进行验证。
4.3 响应
Webhook 会通过状态码、请求头参数对应字段设置为Content-Type: application/json 和一个包含 AdmissionReview 对象的 JSON 序列化格式来发送响应。该 AdmissionReview 对象与发送的版本相同,且其中包含的 response 字段已被有效填充。
response 至少必须包含以下字段:
-
uid,从发送到 Webhook 的 request.uid 中复制而来
-
allowed,设置为true或false
{ "apiVersion": "admission.k8s.io/v1", "kind": "AdmissionReview", "response": { "uid": "<value from request.uid>", "allowed": true } }
Validation Webhook会对请求根据自己的业务逻辑进行校验,其中allowed字段为true则代表认证通过,alliowed为false则代表认证失败。
总结:
通过本文,解释了Kubernetes的概念,介绍了Kubernetes Webhook的类型和应用场景。此外,还以Validation Webhook 为例,介绍资源准入以及请求和响应。Kubernetes Webhook可以帮助用户在Kubernetes平台上完成更复杂的功能,期待读者在实际应用中发挥Webhook机制的优势。