通过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)!