
kube-apiserver -h | grep enable-admission-plugins
MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook,则说明当前集群已开启动态准入控制器插件。如下图所示:

caBundle 字段( ValidatingWebhookConfiguration 和 MutatingAdmissionWebhook 资源清单中的 caBundle 字段)绑定受信任的颁发机构证书(CA)来核验 Webhook 服务端的证书是否可信任。本文介绍了 制作自签证书 及 使用 K8S CSR API 签发证书 两种推荐的颁发证书方法。ValidatingWebhookConfiguration 和 MutatingAdmissionWebhook 使用 clientConfig.service 配置时(Webhook 服务在集群内),为服务器端颁发的证书域名必须为 <svc_name>.<svc_namespace>.svc。ca.key。openssl genrsa -out ca.key 2048
ca.key 生成 ca.crt。
"webserver.default.svc" 为 Webhook 服务端在集群中的域名,-days 参数用于设置证书有效时间。openssl req -x509 -new -nodes -key ca.key -subj "/CN=webserver.default.svc" -days 10000 -out ca.crt
server.key。openssl genrsa -out server.key 2048
csr.conf。示例如下: [ req ]default_bits = 2048prompt = nodefault_md = sha256distinguished_name = dn[ dn ]C = cnST = shaanxiL = xi'anO = defaultOU = webseverCN = webserver.default.svcsubjectAltName = @alt_names[ alt_names ]DNS.1 = webserver.default.svc[ v3_ext ]authorityKeyIdentifier=keyid,issuer:alwaysbasicConstraints=CA:FALSEkeyUsage=keyEncipherment,dataEnciphermentextendedKeyUsage=serverAuth,clientAuthsubjectAltName=@alt_names
csr.conf 生成证书签名请求。openssl req -new -key server.key -out server.csr -config csr.conf
ca.key、ca.crt 和 server.csr 颁发生成服务器证书(x509签名)。openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \\-CAcreateserial -out server.crt -days 10000 \\-extensions v3_ext -extfile csr.conf
openssl x509 -noout -text -in ./server.crt
ca.crt:为颁发机构证书。ca.key:为颁发机构证书密钥,用于服务端证书颁发。server.crt:为颁发的服务端证书。server.key:为颁发的服务端证书密钥。USERNAME='webserver.default.svc' # 设置需要创建的用户名为 Webhook 服务在集群中的域名# 使用 Openssl 生成自签证书 keyopenssl genrsa -out ${USERNAME}.key 2048# 使用 Openssl 生成自签证书 CSR 文件, CN 代表用户名,O 代表组名openssl req -new -key ${USERNAME}.key -out ${USERNAME}.csr -subj "/CN=${USERNAME}/O=${USERNAME}"# 创建 Kubernetes 证书签名请求(CSR)cat <<EOF | kubectl apply -f -apiVersion: certificates.k8s.io/v1beta1kind: CertificateSigningRequestmetadata:name: ${USERNAME}spec:request: $(cat ${USERNAME}.csr | base64 | tr -d '\\n')usages:- digital signature- key encipherment- server authEOF# 证书审批允许信任kubectl certificate approve ${USERNAME}# 获取自签证书 CRTkubectl get csr ${USERNAME} -o jsonpath={.status.certificate} > ${USERNAME}.crt
${USERNAME}.crt:为 Webhook 服务端证书。${USERNAME}.key:为 Webhook 服务端证书密钥。ValidatingWebhookConfiguration 资源在 TKE 中实现一个动态准入 Webhook 调用示例。
为了确保可访问性,示例代码 Fork 自 原代码库,示例代码实现了一个简单的动态准入 Webhook 请求和响应的接口,具体接口格式请参见 Webhook 请求和响应 。示例代码可在 示例代码 中获取,本文将使用其作为 Webhook 服务端代码。caBundle 内容。base64 编码 ca.crt 生成 caBundle 字段内容。cat ca.crt | base64 --wrap=0
caBundle 字段内容。获取步骤如下:clusters.cluster[].certificate-authority-data 字段进行获取,该字段已进行 base64 编码,无需再进行处理。ca.crt(颁发机构证书)、server.crt(HTTPS 证书)及 server.key(HTTPS 密钥) 到项目主目录。如下图所示:


docker build -t webserver .
controller.yaml 如下所示:

ValidatingWebhookConfiguration 的资源,修改适配项目中的 admission.yaml 文件。如下图所示:
本示例配置的 Webhook 触发规则为:当创建 pods类型、API 版本 “v1” 时触发调用,clientConfig 配置对应上述在集群中创建的 Webhook 后端服务,caBundle 字段内容为证书颁发方法一获取的 ca.crt 内容。



allowed: true 配置项,即可创建成功该测试 pod。如下图所示:

controller.yaml 和 admission.yaml 资源。当再次尝试创建 pods 资源时请求被动态准入拦截,则说明配置的动态准入策略已生效。如下图所示:

文档反馈