【一分钟快学】最简 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 集群的行为。

相关推荐
一只栖枝2 小时前
华为 HCIE 大数据认证中 Linux 命令行的运用及价值
大数据·linux·运维·华为·华为认证·hcie·it
uzong4 小时前
技术故障复盘模版
后端
GetcharZp4 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
wuicer4 小时前
ubuntu 20.04 安装anaconda以及安装spyder
linux·运维·ubuntu
桦说编程4 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研4 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi5 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国6 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy6 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
小晶晶京京6 小时前
day34-LNMP详解
linux·运维·服务器