自学内容网 自学内容网

通过Admission Webhook限制Namespace下Nodeport Service的端口范围

背景

要给每个namspce分配Nodeport 端口范围, 不允许使用范围之外的端口. 实现对平台 nodeport 端口的统一管理

方案

Kubernetes本身不支持直接限制NodePort的范围。可以通过创建一个Admission Webhook来拦截Service创建请求,并在其端口字段中进行检查和限制。

以下是创建Admission Webhook的大致步骤:

创建一个Admission Webhook的服务。

实现一个Admission Controller,用于检查Service创建请求。

配置MutatingWebhookConfiguration和ValidatingWebhookConfiguration,以使Admission Controller能够拦截Service创建事件。

以下是一个简化的Admission Controller的示例代码,用于检查Service的NodePort范围:

import (
    "net/http"
    "github.com/gin-gonic/gin"
    admissionv1 "k8s.io/api/admission/v1"
    corev1 "k8s.io/api/core/v1"
)
 
func ServiceWebhook(c *gin.Context) {
    var admissionResponse = admissionv1.AdmissionResponse{}
    var admissionRequest admissionv1.AdmissionRequest
 
    // 解析请求体
    if err := c.ShouldBindJSON(&admissionRequest); err != nil {
        // 处理错误
    }
 
    // 确保是创建Service的请求
    if admissionRequest.Resource.Resource == "services" && admissionRequest.Operation == admissionv1.Create {
        // 反序列化Service对象
        var service corev1.Service
        if err := json.Unmarshal(admissionRequest.Object.Raw, &service); err != nil {
            // 处理错误
        }
 
        // 检查NodePort范围
        if service.Spec.Type == corev1.ServiceTypeNodePort {
            for _, p := range service.Spec.Ports {
                if p.NodePort < 30000 || p.NodePort > 32767 {
                    admissionResponse.Allowed = false
                    admissionResponse.Result = &metav1.Status{
                        Message: "NodePort port out of range. Must be between 30000-32767",
                    }
                    break
                }
            }
        }
    }
 
    // 返回响应
    c.JSON(http.StatusOK, admissionResponse)
}

在这个示例中,我们定义了一个Webhook,它在Service创建时检查NodePort的值。如果NodePort的值不在30000到32767的范围内,Webhook将拒绝该请求。

注意还需要配置MutatingWebhookConfiguration和ValidatingWebhookConfiguration。


原文地址:https://blog.csdn.net/qq_21047625/article/details/137926123

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!