准入控制器是kubernetes中用于拦截并处理资源请求的插件,实现动态准入控制的关键手段之一是使用golang编写外部webhook类型的控制器。具体步骤包括:1.搭建基础结构,使用golang写一个监听/mutate和/validate路径的https webhook服务;2.解析请求内容,从admissionreview结构中提取资源信息;3.编写mutating逻辑(如为pod添加标签)和validating逻辑(如拒绝无资源限制的容器);4.部署到集群,配置validatingwebhookconfiguration并生成tls证书,确保服务可被访问。通过以上步骤即可完成基本的admission controller实现。

编写 Kubernetes 的 Admission Controller 是实现动态准入控制的关键手段之一。Golang 作为 Kubernetes 的原生开发语言,自然是首选。下面从几个关键点出发,带你了解如何用 Golang 实现一个基本的 K8s Admission Controller。

Admission Controller(准入控制器)是 Kubernetes 中用于拦截并处理资源请求的插件。它可以修改或拒绝 API 请求,在对象被持久化之前进行额外校验或注入配置。例如:

Kubernetes 支持内置和外部准入控制器,我们这里说的是构建外部的、可部署的 webhook 类型控制器。
立即学习“go语言免费学习笔记(深入)”;
Admission Controller 本质上是一个 HTTPS Webhook 服务,监听特定路径并返回响应。你不需要自己实现整个 Kubernetes API,只需要处理
/mutate
/validate

package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.POST("/mutate", mutateHandler)
r.POST("/validate", validateHandler)
fmt.Println("Starting server on :443")
// 注意:需要 TLS 证书
r.RunTLS(":443", "server.crt", "server.key")
}关键点:
/healthz
Kubernetes 发送的请求体是
AdmissionReview
type AdmissionReview struct {
Request *AdmissionRequest `json:"request,omitempty"`
Response *AdmissionResponse `json:"response,omitempty"`
}
type AdmissionRequest struct {
UID string `json:"uid"`
Kind metav1.GroupVersionKind `json:"kind"`
Resource metav1.GroupVersionResource `json:"resource"`
Object runtime.RawExtension `json:"object"`
}解析建议:
json.Unmarshal
k8s.io/apimachinery
Object.Raw
Pod
func mutatePod(raw []byte) ([]byte, error) {
var pod corev1.Pod
if err := json.Unmarshal(raw, &pod); err != nil {
return nil, err
}
if pod.Labels == nil {
pod.Labels = make(map[string]string)
}
pod.Labels["managed-by"] = "my-admission-controller"
return json.Marshal(pod)
}然后构造 Patch,并封装成
AdmissionResponse
遍历每个容器,检查
Resources.Limits
for _, container := range pod.Spec.Containers {
if container.Resources.Limits.Cpu().IsZero() ||
container.Resources.Limits.Memory().IsZero() {
return false, "container missing resource limits"
}
}验证失败时,返回
AdmissionResponse{Allowed: false}写好代码只是第一步,还需要在 Kubernetes 中注册这个 webhook。创建一个
ValidatingWebhookConfiguration
MutatingWebhookConfiguration
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: my-validator
webhooks:
- name: my-validator.example.com
clientConfig:
service:
namespace: default
name: my-admission-service
caBundle: <base64 encoded CA cert>
rules:
- apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
operationTypes: ["CREATE"]
failurePolicy: Fail
sideEffects: None
timeoutSeconds: 5注意点:
实现一个 Admission Controller 并不复杂,但需要注意很多细节。主要包括:
AdmissionReview
基本上就这些步骤。虽然看起来有点多,但每一步都不难,只要一步步来就行。
以上就是如何用Golang编写K8s Admission Controller 解析动态准入控制的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号