了解Kubernetes三大门神之一Webhook

在当今的云原生应用开发中,Kubernetes 已经成为了最受欢迎的容器编排平台。然而,随着容器化应用的快速增长,安全性成为了一个不容忽视的问题。为了增强 Kubernetes 集群的安全性,Admission Webhook 应运而生。本文将深入探讨 Admission Webhook,解释它的作用、工作原理以及如何部署和使用它来提高 Kubernetes 集群的安全性。

Admission Webhook是什么

从 Kubernetes v1.7 开始,引入了对外部准入控制器的支持; 它提供了两个选项,用于将自定义业务逻辑添加到 API 服务器,以便在创建对象时修改对象并验证策略。
在这里插入图片描述
当一个请求调用API Service的时候,会依次经过认证、授权和准入控制。Webhook属于准入控制的范畴。
Admission Webhook顾名思义就是一个Http回调函数,接收Request请求,通过MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook 两个特殊控制器,修改和验证相关请求内容。

工作原理和步骤

  1. 用户发送一个 Kubernetes 资源创建、更新或删除的请求;
  2. 请求到达 Kubernetes API Server;
  3. 经过认证、授权;
  4. Kubernetes API Server 将请求发送给Mutating Admission Controller 进行处理;
  5. Admission Webhook 对请求进行审查和修改,并返回处理结果给 Admission Controller;
  6. Kubernetes API Server 将请求发送给Validating Admission Controller 进行处理;
  7. Admission Webhook 对请求进行校验,并返回处理结果给 Admission Controller;
  8. Admission Controller 根据 Admission Webhook 的处理结果决定是否允许请求通过。

Admission Webhook 的优势

Admission Webhook 提供了多种优势,有助于增强 Kubernetes 集群的安全性:

  1. 动态审查和修改:Admission Webhook 可以对请求进行动态审查和修改,以确保符合安全策略和最佳实践。
  2. 强制执行策略:通过 Admission Webhook,可以强制执行一致的策略和标准,确保所有资源都符合预期的安全要求。
  3. 防止恶意操作:Admission Webhook 可以拦截恶意请求并阻止它们对 Kubernetes 集群造成安全威胁。
  4. 定制化需求:Admission Webhook 提供了灵活的定制化选项,可以根据特定的业务需求来定义审查规则和处理逻辑。

Admission Webhook如何实现

参考《Kubernetes Operator开发进阶》,做一个简单的实现,启动一个nginx实例,当执行yaml文件时将replicas从1改为3。代码在github的https://github.com/daniel-hutao/Advanced-Kubernetes-Operator中,进入ch7的application-operator/config/apps_v1_application.yaml。

apiVersion: apps.aaa.cn/v1
kind: Application
metadata:
  name: nginx-sample
  namespace: default
  labels:
    app: nginx
spec:
  deployment:
    replicas: 1
    selector:
      matchLabels:
        app: nginx
    template:
      metadata:
        labels:
          app: nginx
      spec:
        containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
              - containerPort: 80
  service:
    type: NodePort
    ports:
      - port: 80
        targetPort: 80
        nodePort: 30080

通过配置,拦截创建和更新。

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  creationTimestamp: null
  name: mutating-webhook-configuration
webhooks:
- admissionReviewVersions:
  - v1
  clientConfig:
    service:
      name: webhook-service
      namespace: system
      path: /mutate-apps-aaa-cn-v1-application
  failurePolicy: Fail
  name: mapplication.kb.io
  rules:
  - apiGroups:
    - apps.aaa.cn
    apiVersions:
    - v1
    operations:
    - CREATE
    - UPDATE
    resources:
    - applications
  sideEffects: None

具体代码看apis/apps/v1/application_webhook.go

// MutatingAdmissionWebhook的具体实现将Replicas改为3
func (r *Application) Default() {
	applicationlog.Info("default", "name", r.Name)

	if r.Spec.Deployment.Replicas == nil {
		r.Spec.Deployment.Replicas = new(int32)
		*r.Spec.Deployment.Replicas = 3
	}
}

// ValidatingAdmissionWebhook的实现,Replicas不能超过10个
func (r *Application) validateApplication() error {
	if *r.Spec.Deployment.Replicas > 10 {
		return fmt.Errorf("replicas too many error")
	}
	return nil
}

环境配置可以参考1分钟了解 Kubernetes王牌Operator,使用Kubebuilder的create webhook命令可以轻松创建一套webhook代码。

总结

Admission Webhook 是提高 Kubernetes 集群安全性的关键组件之一。通过动态审查和修改请求,它可以强制执行安全策略、防止恶意操作,并满足定制化需求。部署 Admission Webhook 需要一些配置和验证步骤,但一旦成功完成,它将为您的 Kubernetes 集群带来更高的安全性和可靠性。

参考:
Kubernetes Sidecar Container Injection
《Kubernetes Operator开发进阶》
如有侵权,请及时与我沟通。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值