背景
要给每个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.Serviceif 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 = falseadmissionResponse.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。