目录

用kubebuilder实现webhook

概述

在之前的文章 自己动手写Kubernetes的webhook,详细的介绍了如何用 Python 实现自定义的 webhook。然而,这个 webhook 离生产部署还是有一定距离的,比较好的方案是用 kubebuilder 来实现一个,本文主要介绍如果从0开始实现一个 kubebuilder 版本的 webhook。

下载kubebuilder

首先根据操作系统的类型,下载 kubebuilder,官网也提供了简易的脚本。

1
2
curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/`go env GOOS`/`go env GOARCH`
chmod +x kubebuilder && mv kubebuilder /usr/local/bin/

实现webhook

然后需要区分实现的 webhook 的类型,一般来说分为自定义类型资源的 webhook,另外就是针对 Kubernetes 本身核心类型的,也叫 core type,主要是指 Pod,Deployment 之类的。

自定义资源的webhook

自定义资源的 webhook 是大部分文章都有介绍的内容,本文也做一些说明,但是不展开说,主要还是针对核心类型的。

核心资源的webhook

关于如何通过 kubebuilder 来生产 core type 类型资源的 webhook,大部分资料还停留在 2021 年左右,那么 2024 年底了,用新版本的 kubebuilder 应该如何给 core type 资源生成脚手架和部署测试呢,下文将进行分享和讲解。

开发环境

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mkdir service-register-webhook
cd service-register-webhook
go mod init github/runzhliu/service-register-webhook
kubebuilder init --domain runzhliu.cn --license none --owner runzhliu

kubebuilder create api --group core --version v1 --kind Pod
kubebuilder create webhook --group core --version v1 --kind Pod --defaulting --programmatic-validation

# 自签名证书
mkdir -p /tmp/k8s-webhook-server/serving-certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /tmp/k8s-webhook-server/serving-certs/tls.key \
  -out /tmp/k8s-webhook-server/serving-certs/tls.crt \
  -config openssl.cnf

# 将自签名证书base64
cat /tmp/k8s-webhook-server/serving-certs/tls.crt | base64 | tr -d '\n'

mkdir -p /tmp/test/serving-certs
cd /tmp/test/serving-certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout tls.key \
  -out tls.crt \
  -subj "/CN=your-webhook-service.your-namespace.svc"

webhook证书准备

可以自签,包括 key 和 crt,另外 crt 要给到 webhook 的 yaml 文件,因为 kube-apiserver 需要这个证书去访问 webhook。

参考资料

  1. 实现默认/验证webhook
  2. Getting Started to Write Your First Kubernetes Admission Webhook Part 2
  3. webhook for core types
  4. 使用kubebuilder开发kubernetes核心资源的webhook
注意
本文最后更新于 2024年10月22日,文中内容可能已过时,请谨慎参考。