准入控制器
用途:
拦截apiserver请求,对请求进行验证或者修改,比如说添加标签,效验自定义资源字段是否准确或许增加默认值,超卖设置,增加sidecar容器等等
分类:
-
内置准入器,默认开启的noderestriction准入器,主要是限制对节点一些标签的修改操作
-
动态准入器,HTTP回调机制,类似于拦截器
-
ValidatingAdmissionWebhook准入控制器 主要作用就是对操作做验证性质的准入,并行操作
-
MutatingAdmissionWebhook准入控制器 主要作用就是对操作做修改性质的准入,串行操作,不具备明确的顺序,需要注意操作对象的范围,防止出现预期之外的修改操作。

-
开发:
准入控制器其实就是一个http服务,可以通过下面demo开发一个简单的webhook服务,也可以借助开源的k8swebhook脚手架进行快速开发Demo
import (
"encoding/json"
"io"
admissionv1 "k8s.io/api/admission/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/serializer"
"net/http"
)
func main() {
h := http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
defer request.Body.Close()
all, err := io.ReadAll(request.Body)
if err != nil {
return
}
//反序列化
reqReview := admissionv1.AdmissionReview{}
r := serializer.NewCodecFactory(runtime.NewScheme()).UniversalDeserializer()
_, _, err = r.Decode(all, nil, &reqReview)
if err != nil {
return
}
respReview := admissionv1.AdmissionReview{
TypeMeta: reqReview.TypeMeta,
Response: &admissionv1.AdmissionResponse{
// todo .add your logic func result
},
}
respBs, err := json.Marshal(respReview)
if err != nil {
return
}
writer.Header().Set("Content-Type", "application/json")
writer.WriteHeader(http.StatusOK)
_, err =writer.Write(respBs)
})
mux := http.NewServeMux()
mux.Handle("POST /webhook", h)
http.ListenAndServeTLS(":443", "", "", mux)
}
部署:
准入程序可以在部署在集群内部,也可以在多集群环境下使用一个准入程序对多个集群进行回调处理,好处就是只需要部署一次,而不用每个集群都部署,但是需要使用kube-client时,需要接入多个集群的kubeconfig,在集群内部部署则只需要配置rbac了;各有各个优势,多集群情况下也可以考虑多集群管理工具实现每个集群都搭建一个webhook服务
-
将准入程序以deployment或者其他工作负载形式部署在集群中
-
使用自签证书,因为webhook和apiserver需要双向认证,wenhook一般使用https
--- apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: mutating-issuer namespace: webhook-system spec: selfSigned: {} --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: mutating-cert namespace: sophon-system spec: dnsNames: - mutating-webhook.webhook-system.svc - mutating-webhook.webhook-system.svc.cluster.local issuerRef: kind: Issuer name: mutating-issuer secretName: mutating-webhook-cert -
部署准入器声明资源
kind: MutatingWebhookConfiguration # 修改类型的准入器
apiVersion: admissionregistration.k8s.io/v1
metadata:
name: mutating-webhook
annotations:
cert-manager.io/inject-ca-from: webhook-system/mutating-cert # 使用certmanager绑定证书, namespace/secretname
webhooks:
- name: mutating-webhook-xxxx
sideEffects: None
clientConfig:
# 准入程序访问配置
service:
namespace: webhook-system
name: mutating-webhook
path: /mutating/xxxx
port: 443
caBundle: "" #上面声明注解后,certmanager会将证书注入
reinvocationPolicy: Never
rules: # 只对创建pod生效
- operations:
- CREATE
apiGroups:
- ''
apiVersions:
- v1
resources:
- pods
scope: '*'
matchPolicy: Equivalent
namespaceSelector:
matchLabels:
xxx: xxx
admissionReviewVersions:
- v1
- v1beta1
failurePolicy: Ignore
objectSelector: {}
timeoutSeconds: 5
1353

被折叠的 条评论
为什么被折叠?



