在当今的云原生应用开发中,Kubernetes 已经成为了最受欢迎的容器编排平台。然而,随着容器化应用的快速增长,安全性成为了一个不容忽视的问题。为了增强 Kubernetes 集群的安全性,Admission Webhook 应运而生。本文将深入探讨 Admission Webhook,解释它的作用、工作原理以及如何部署和使用它来提高 Kubernetes 集群的安全性。
Admission Webhook是什么
从 Kubernetes v1.7 开始,引入了对外部准入控制器的支持; 它提供了两个选项,用于将自定义业务逻辑添加到 API 服务器,以便在创建对象时修改对象并验证策略。
当一个请求调用API Service的时候,会依次经过认证、授权和准入控制。Webhook属于准入控制的范畴。
Admission Webhook顾名思义就是一个Http回调函数,接收Request请求,通过MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook 两个特殊控制器,修改和验证相关请求内容。
工作原理和步骤
- 用户发送一个 Kubernetes 资源创建、更新或删除的请求;
- 请求到达 Kubernetes API Server;
- 经过认证、授权;
- Kubernetes API Server 将请求发送给Mutating Admission Controller 进行处理;
- Admission Webhook 对请求进行审查和修改,并返回处理结果给 Admission Controller;
- Kubernetes API Server 将请求发送给Validating Admission Controller 进行处理;
- Admission Webhook 对请求进行校验,并返回处理结果给 Admission Controller;
- Admission Controller 根据 Admission Webhook 的处理结果决定是否允许请求通过。
Admission Webhook 的优势
Admission Webhook 提供了多种优势,有助于增强 Kubernetes 集群的安全性:
- 动态审查和修改:Admission Webhook 可以对请求进行动态审查和修改,以确保符合安全策略和最佳实践。
- 强制执行策略:通过 Admission Webhook,可以强制执行一致的策略和标准,确保所有资源都符合预期的安全要求。
- 防止恶意操作:Admission Webhook 可以拦截恶意请求并阻止它们对 Kubernetes 集群造成安全威胁。
- 定制化需求: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-samplenamespace: defaultlabels:app: nginx
spec:deployment:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80service:type: NodePortports:- port: 80targetPort: 80nodePort: 30080
通过配置,拦截创建和更新。
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:creationTimestamp: nullname: mutating-webhook-configuration
webhooks:
- admissionReviewVersions:- v1clientConfig:service:name: webhook-servicenamespace: systempath: /mutate-apps-aaa-cn-v1-applicationfailurePolicy: Failname: mapplication.kb.iorules:- apiGroups:- apps.aaa.cnapiVersions:- v1operations:- CREATE- UPDATEresources:- applicationssideEffects: 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开发进阶》
如有侵权,请及时与我沟通。