Admission Webhook 简介 + 示例

1. 简介

本文只做简单介绍以及示例,更多信息请查看官网
官网链接:https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/

1.1 作用范围

当用户的请求到达kube-apiserver

1.2 可选操作

-MutatingWebhookConfiguration:修改 用户请求的配置
-ValidatingWebhookConfiguration:验证 用户请求的配置是否合法
顺序:先进行修改MutatingWebhookConfiguration再进行验证ValidatingWebhookConfiguration

1.3 先决条件

  • k8s版本1.9.0及以上,开启功能admissionregistration.k8s.io/v1alpha1
  • 开启功能MutatingWebhookConfigurationValidatingWebhookConfiguration
    每个kube-apiserver实例需要在enable-admission-plugins里添加支持
  • 后端server
    webhook的本质是个http server,因此,需要用代码实现这么一个server,供kube-apiserver调用,推荐使用Deployment+Service发布后端服务
  • 证书以及Secret
    用于kube-apiserverwebhook通信时使用,生成证书并创建SecretDeployment挂载
  • 创建MutatingWebhookConfigurationValidatingWebhookConfiguration资源

1.4 参数说明

1.4.1 官网yaml模板
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: "pod-policy.example.com"
webhooks:
- name: "pod-policy.example.com"
  rules:
  - apiGroups:   [""]
    apiVersions: ["v1"]
    operations:  ["CREATE"]
    resources:   ["pods"]
    scope:       "Namespaced"
  clientConfig:
    service:
      namespace: "example-namespace"
      name: "example-service"
    caBundle: "Ci0tLS0tQk...<`caBundle` is a PEM encoded CA bundle which will be used to validate the webhook's server certificate.>...tLS0K"
  admissionReviewVersions: ["v1", "v1beta1"]
  sideEffects: None
  timeoutSeconds: 5
---
# Deprecated in v1.16 in favor of admissionregistration.k8s.io/v1
apiVersion: admissionregistration.k8s.io/v1beta1
kind: ValidatingWebhookConfiguration
metadata:
  name: "pod-policy.example.com"
webhooks:
- name: "pod-policy.example.com"
  rules:
  - apiGroups:   [""]
    apiVersions: ["v1"]
    operations:  ["CREATE"]
    resources:   ["pods"]
    scope:       "Namespaced"
  clientConfig:
    service:
      namespace: "example-namespace"
      name: "example-service"
    caBundle: "Ci0tLS0tQk...<`caBundle` is a PEM encoded CA bundle which will be used to validate the webhook's server certificate>...tLS0K"
  admissionReviewVersions: ["v1beta1"]
  timeoutSeconds: 5

注意:

  • webhooks.name是一个DNS子域名
  • 当使用clientConfig.service时,server端的证书必须对<svc_name>.<svc_namespace>.svc验证有效
  • 默认超时时长:
    admissionregistration.k8s.io/v1 10s
    admissionregistration.k8s.io/v1beta1 30秒

1.4.2 Webhook request and response

1.4.2.1 Webhook request
  • POST请求
  • Content-Type: application/json
  • 参数内容是AdmissionReview,参数内容见此标题链接,不进行展示
1.4.2.1 Webhook response
  • http状态码返回200
  • Content-Type: application/json
  • 参数内容AdmissionReview
    • uid:取request里的uid
    • allowed:true or false
{
  "apiVersion": "admission.k8s.io/v1beta1",
  "kind": "AdmissionReview",
  "response": {
    "uid": "<value from request.uid>",
    "allowed": true
  }
}

2. 示例MutatingWebhookConfiguration

2.1 查看是否支持admissionregistration.k8s.io/v1alpha1

[root@10 ~]# kubectl api-versions | grep admissionregistration.k8s.io/v1beta1
admissionregistration.k8s.io/v1beta1

2.2 查看是否开启MutatingWebhookConfigurationValidatingWebhookConfiguration

[root@10 ~]# kubectl -n kube-system get po $(kubectl -n kube-system get po | grep apiserver | awk '{print $1}') -oyaml | grep enable-admission-plugins
    - --enable-admission-plugins=NodeRestriction

如果没有的话,需要enable

// 默认路径/etc/kubernetes/manifests/kube-apiserver.yaml
- --enable-admission-plugins=NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook

2.3 创建mutatingWebhookConfiguration

vi编译名为node-pool-mutating-webhook-config.yaml的yaml,格式如下

apiVersion: admissionregistration.k8s.io/v1beta1
kind: MutatingWebhookConfiguration
metadata:
  name: node-pool-config
  labels:
    app: node-pool-config
webhooks:
- clientConfig:
    caBundle: _CA_PEM_B64
    url: https://_F5_ADDRESS:30043/caas/rest/openapi/nodes/pools/mutate
  failurePolicy: Ignore
  name: mutate.node-pool.harmonycloud.cn
  rules:
    - apiGroups:
      - "*"
      apiVersions:
      - v1
      operations:
      - CREATE
      resources:
      - pods
  namespaceSelector:
    matchLabels:
      node-pool-mutating-webhook: enabled

需要注意的是:
-caBundlekube-apiserver访问自定义的webhook服务时需要的加密认证数据,这边我们先预留参数,在下一步生成证书里再替换_CA_PEM_B64

  • url
    _F5_ADDRESS可以是serviceName.namespace,也可以是某个nginx-ingress或者f5的ip
    端口默认为443,可自行修改
    接口路径自行修改
  • rules
    规则里是配置对什么样的资源进行监听,在这里我们配置的是监听v1版本的任意pod创建
  • namespaceSelector
    配置需要监听的namespace

2.4 生成证书和Secret

2.4.1 如果没有ca证书,可以生成

脚本如下:

openssl req -nodes -new -x509  -days 36500 -keyout ca.key -out ca.crt -subj "/CN=Admission Controller Webhook CA/subjectAltName=IP.1=${masterIp}"

openssl genrsa -out webhook-server-tls.key 2048

echo subjectAltName = IP:${masterIp} > extfile.cnf

openssl req -new -key webhook-server-tls.key -subj "/CN=${masterIp}/subjectAltName=IP.1=${masterIp}" | openssl x509 -days 36500 -req -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out webhook-server-tls.crt

kubectl -n kube-system create secret tls webhook-server-tls \
    --cert "webhook-server-tls.crt" \
    --key "webhook-server-tls.key"

ca_pem_b64="$(openssl base64 -A <"ca.crt")"
sed -e 's@${CA_PEM_B64}@'"$ca_pem_b64"'@g' <"node-pool-mutating-webhook-config.yaml"
2.4.2 如果已有证书
// 假设ca.crt路径位于/root/
[root@10 ~]# openssl base64 -A < "/root/ca.crt"
LS0tLS1CRUdJTiBDRVJUxxxxxx

可以使用这个内容替换掉node-pool-mutating-webhook-config.yaml里的_CA_PEM_B64

2.5 创建DeploymentService

自行创建这两个资源

注意,Deployment里需要挂载前面创建的Secretwebhook-server-tls
_F5_ADDRESS需要替换为serviceName.namespace,或者是某个nginx-ingress或者f5的ip

2.6 验证效果

2.6.1 创建MutatingWebhookConfiguration
[root@10 ~]# kubectl create -f node-pool-mutating-webhook-config.yaml
mutatingwebhookconfiguration.admissionregistration.k8s.io/node-pool-config created
2.6.2 修改namespace

根据node-pool-mutating-webhook-config.yaml里的matchLabels,修改某个分区的metadata.labels属性

2.6.3 在该分区下创建pod

测试podbusybox.yaml如下

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: cicd
  labels:
    app: test-pod
spec:
  containers:
  - name: test-container
    image: busybox
    command: ['sh', '-c', 'echo Hello Harmonycloud! && sleep 3600']

执行创建命令

[root@10 ~]# kubectl create -f busybox.yaml
pod/test-pod created

至此,大功告成!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容