【一分钟快学】最简 Kubernetes Mutating Webhooks 上手操作指南

K8S(Kubernetes)中的 mutating webhook 可以被理解为是一个"魔法修改器"。想象一下,当你在餐厅点餐时,你的订单被提交给厨房之前,有一个特别的服务员(mutating webhook)可以根据需要修改你的订单。比如,如果你忘记说不要洋葱,这个服务员可以在订单最终提交给厨房前帮你把洋葱去掉。这样,当你的食物准备好时,它就已经按照你(可能忘记表达的)实际想要的方式进行了调整。

在 Kubernetes 中,当你创建或修改 Kubernetes 资源(如 Pod、Service 等)的请求被发送到 API 服务器时,mutating webhook 就扮演了这样的角色。它位于 API 服务器处理请求的流程中,特别是在请求通过 API 服务器的认证(确定你是谁)和授权(确定你能做什么)之后,但在最终的数据被写入到 etcd 存储之前。

mutating webhook 的作用是对请求中的对象进行"变形"或修改。这可以用于自动注入额外的配置、修正用户提交的数据,或者实施特定的策略(例如,确保所有的 Pod 都绑定到特定的监控或安全策略)。

下面,我会通过一个简单的示例来演示如何使用 mutating webhook 来自动注入容器环境变量。在这个示例中,我们将创建一个 webhook,它会在每个 Pod 中自动添加一个名为 EXAMPLE_ENV 的环境变量,其值设置为 example-value

1. 定义 Mutating Webhook 配置

首先,你需要定义一个 MutatingWebhookConfiguration,这个配置会告诉 Kubernetes API 服务器你的 webhook 应该在哪些请求上被调用。以下是一个简单的示例配置:

yaml 复制代码
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: example-mutating-webhook
webhooks:
  - name: example.webhook.com
    clientConfig:
      service:
        name: example-mutating-webhook-service
        namespace: default
        path: "/mutate"
      caBundle: <CA_BUNDLE>
    rules:
      - operations: ["CREATE"]
        apiGroups: [""]
        apiVersions: ["v1"]
        resources: ["pods"]
    admissionReviewVersions: ["v1"]
    sideEffects: None
    timeoutSeconds: 5
  • clientConfig: 指定如何访问你的 webhook 服务。这里使用 service 指向在 Kubernetes 集群内运行的服务。
  • caBundle: 是用于验证 webhook 服务器证书的 CA 证书的 Base64 编码字符串。
  • rules: 指明了哪些操作和资源会触发这个 webhook。

2. 创建一个简单的 Webhook 服务器

你的 webhook 服务器需要能够处理来自 Kubernetes API 服务器的请求。这个服务器需要接受一个包含 Pod 信息的 AdmissionReview 请求,修改 Pod 定义,然后返回修改后的对象。

以下是一个非常基础的 Python Flask 应用,它作为 webhook 服务器,用来修改 Pod:

python 复制代码
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/mutate', methods=['POST'])
def webhook():
    request_json = request.get_json()
    # 在这里添加逻辑来修改 Pod 定义
    # 例如,为每个容器添加环境变量
    containers = request_json['request']['object']['spec']['containers']
    for container in containers:
        if 'env' not in container:
            container['env'] = []
        container['env'].append({'name': 'EXAMPLE_ENV', 'value': 'example-value'})
    
    admission_response = {
        "response": {
            "uid": request_json['request']['uid'],
            "allowed": True,
            "patch": base64.b64encode(json.dumps([{
                "op": "add",
                "path": "/spec/containers/0/env/-",
                "value": {"name": "EXAMPLE_ENV", "value": "example-value"}
            }]).encode()).decode(),
            "patchType": "JSONPatch"
        }
    }
    return jsonify(admission_response)

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', ssl_context=('path/to/tls.crt', 'path/to/tls.key'))

在上述代码中,/mutate 路径的处理函数读取了传入的 Pod 定义,修改它以包含一个新的环境变量,然后将修改后的定义作为响应返回。

注意事项:

  • 安全: 确保 webhook 服务器使用 TLS,以安全地处理来自 Kubernetes API 服务器的请求。
  • 性能: Webhook 可能会增加 API 服务器的请求处理时间,因此确保你的 webhook 服务器响应迅速,并为其配置合理的超时时间。
  • 错误处理: 你的 webhook 应该能够正确处理错误情况,并返回有意义的错误信息给 API 服务器。
  • 版本兼容性: 确保你的 webhook 逻辑与你正在使用的 Kubernetes API 版本兼容。
  • 测试: 在生产环境部署前,充分测试你的 webhook 以确保其按预期工作,并不会意外地阻止合法的请求。

通过上述步骤和考虑事项,你应该能够开始使用 mutating webhooks 来自定义和增强你的 Kubernetes 集群的行为。

相关推荐
ZSYP-S7 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
只会copy的搬运工19 分钟前
Jenkins 持续集成部署——Jenkins实战与运维(1)
运维·ci/cd·jenkins
catoop27 分钟前
K8s 无头服务(Headless Service)
云原生·容器·kubernetes
娶不到胡一菲的汪大东34 分钟前
Ubuntu概述
linux·运维·ubuntu
阿里嘎多学长44 分钟前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_1 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
灯火不休➴1 小时前
[Xshell] Xshell的下载安装使用、连接linux、 上传文件到linux系统-详解(附下载链接)
linux·运维·服务器
小峰编程1 小时前
独一无二,万字详谈——Linux之文件管理
linux·运维·服务器·云原生·云计算·ai原生
程序员一诺1 小时前
【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
后端·python
张国荣家的弟弟1 小时前
【Yonghong 企业日常问题04】永洪BI可视化工具Linux部署全攻略(部署详解版)
linux·运维·github