searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Kubernetes webhook基础知识介绍

2023-09-04 10:12:47
7
0

1. Kubernetes介绍

       Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种便捷的方式来管理容器,使得应用程序可以在多个主机上运行,并能够自动处理容器的调度、网络和存储等方面的问题。Kubernetes具有高度可扩展性和灵活性,被广泛用于构建和管理云原生应用程序。

 

2.Kubernetes webhook介绍

       Kubernetes的Webhook是一种机制,用于与Kubernetes API进行交互和集成。它允许开发人员定义自定义的触发器,当发生特定事件时,可以通过Webhook来执行一些自定义的逻辑。

具体来说,Kubernetes的Webhook能够在以下几个关键事件发生时触发:

  1. Mutating Webhook:在创建或更新资源之前,可以对请求进行修改。通过Webhook,可以自定义对请求的修改,例如自动注入某些标签、修改容器的环境变量等。

  2. Validation Webhook:在创建或更新资源之前,可以对请求进行验证。通过Webhook,可以自定义验证逻辑,例如检查资源的字段是否符合特定的规则或策略。

使用Webhook可以扩展和定制Kubernetes的行为,使其适应特定的环境和需求。开发人员可以编写Webhook服务,并将其配置到Kubernetes集群中,从而实现对Kubernetes API请求的自定义处理。

 

3.应用场景

  1. 安全性增强:通过Admission控制Webhook,可以对Kubernetes资源的创建、更新或删除进行自定义验证,确保只有符合特定条件的请求被允许执行。这可以提高集群的安全性,防止恶意或非法操作。

  2. 自动化和标准化:使用Mutating Webhook,可以在资源创建或更新之前对请求进行修改。这使得可以对资源应用一致的配置、标签或注解,并自动执行一些常见的操作,如自动添加sidecar容器、注入特定的环境变量等。这样可以实现自动化的部署和配置管理,提高应用程序的可靠性和一致性。

  3. 灵活性和可扩展性:Webhook机制允许您根据特定需求或场景自定义验证和处理逻辑。这样可以扩展Kubernetes平台的能力,满足特定企业或组织的需求。开发人员可以编写自定义的Webhook服务,根据业务逻辑对请求进行处理,在Kubernetes集群中实现个性化的特性或定制策略。

  4. 第三方集成和生态系统: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机制的优势。

0条评论
0 / 1000
Ssssss云
4文章数
0粉丝数
Ssssss云
4 文章 | 0 粉丝
Ssssss云
4文章数
0粉丝数
Ssssss云
4 文章 | 0 粉丝
原创

Kubernetes webhook基础知识介绍

2023-09-04 10:12:47
7
0

1. Kubernetes介绍

       Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种便捷的方式来管理容器,使得应用程序可以在多个主机上运行,并能够自动处理容器的调度、网络和存储等方面的问题。Kubernetes具有高度可扩展性和灵活性,被广泛用于构建和管理云原生应用程序。

 

2.Kubernetes webhook介绍

       Kubernetes的Webhook是一种机制,用于与Kubernetes API进行交互和集成。它允许开发人员定义自定义的触发器,当发生特定事件时,可以通过Webhook来执行一些自定义的逻辑。

具体来说,Kubernetes的Webhook能够在以下几个关键事件发生时触发:

  1. Mutating Webhook:在创建或更新资源之前,可以对请求进行修改。通过Webhook,可以自定义对请求的修改,例如自动注入某些标签、修改容器的环境变量等。

  2. Validation Webhook:在创建或更新资源之前,可以对请求进行验证。通过Webhook,可以自定义验证逻辑,例如检查资源的字段是否符合特定的规则或策略。

使用Webhook可以扩展和定制Kubernetes的行为,使其适应特定的环境和需求。开发人员可以编写Webhook服务,并将其配置到Kubernetes集群中,从而实现对Kubernetes API请求的自定义处理。

 

3.应用场景

  1. 安全性增强:通过Admission控制Webhook,可以对Kubernetes资源的创建、更新或删除进行自定义验证,确保只有符合特定条件的请求被允许执行。这可以提高集群的安全性,防止恶意或非法操作。

  2. 自动化和标准化:使用Mutating Webhook,可以在资源创建或更新之前对请求进行修改。这使得可以对资源应用一致的配置、标签或注解,并自动执行一些常见的操作,如自动添加sidecar容器、注入特定的环境变量等。这样可以实现自动化的部署和配置管理,提高应用程序的可靠性和一致性。

  3. 灵活性和可扩展性:Webhook机制允许您根据特定需求或场景自定义验证和处理逻辑。这样可以扩展Kubernetes平台的能力,满足特定企业或组织的需求。开发人员可以编写自定义的Webhook服务,根据业务逻辑对请求进行处理,在Kubernetes集群中实现个性化的特性或定制策略。

  4. 第三方集成和生态系统: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机制的优势。

文章来自个人专栏
我与云原生的那些事
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0