快速写一个kubernetes webhook+使用cert-manager实现自动更新证书

准入控制器

用途:

拦截apiserver请求,对请求进行验证或者修改,比如说添加标签,效验自定义资源字段是否准确或许增加默认值,超卖设置,增加sidecar容器等等

分类:
  • 内置准入器,默认开启的noderestriction准入器,主要是限制对节点一些标签的修改操作

    内置准入器官网

  • 动态准入器,HTTP回调机制,类似于拦截器

    1. ValidatingAdmissionWebhook准入控制器 主要作用就是对操作做验证性质的准入,并行操作

    2. MutatingAdmissionWebhook准入控制器 主要作用就是对操作做修改性质的准入,串行操作,不具备明确的顺序,需要注意操作对象的范围,防止出现预期之外的修改操作。img

开发:

准入控制器其实就是一个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服务

  1. 将准入程序以deployment或者其他工作负载形式部署在集群中

  2. 使用自签证书,因为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
    
  3. 部署准入器声明资源

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值