在Kubernetes中,我们有多个环境,由不同的名称空间分隔。我想确保一组节点只由特定的名称空间/环境使用。1.具有特定标签的节点应拒绝不属于命名空间的所有pod1.特定名称空间中的单元应始终选择已配置标签的节点。实现它的方法是什么?听说过变异webhook准入控制器,任何人都有一个样本,看看它是如何工作的。
9vw9lbht1#
您可以使用变更webhook来变更来自特定名称空间的传入pod请求,以便在pod规范中添加节点关联或节点选择器。nodeSelector准入控制器here.guide的一个例子如何使用它。
nodeSelector
准备API服务器
假设您的集群已部署了kubeadm,则kube-apiserver.yaml文件是Kubernetes API服务器的配置清单。它位于/etc/kubernetes/manifests中。在--admission-control= flag中添加PodNodeSelector准入控制器然后向节点添加标签
kubectl label node kubeprod01 env=production
然后在命名空间的注解中使用该标签。
apiVersion: v1 kind: Namespace metadata: annotations: scheduler.alpha.kubernetes.io/node-selector: env=production
通过变更webhook添加节点关联的示例。
func mutatePods(ar v1beta1.AdmissionReview, o *options) *v1beta1.AdmissionResponse { var reviewResponse = &v1beta1.AdmissionResponse{ Allowed: true, } podResource := metav1.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"} if ar.Request.Resource != podResource { glog.Errorf("expect resource to be %s", podResource) return nil } raw := ar.Request.Object.Raw pod := v1.Pod{} // glog.V(2).Infof("Object: %v", string(raw)) if err := json.Unmarshal(raw, &pod); err != nil { glog.Error(err) return nil } addPodAffinityPatch := fmt.Sprintf(`[ {"op":"add","path":"/spec/affinity","value":{"nodeAffinity":{"preferredDuringSchedulingIgnoredDuringExecution":[{"preference":{"matchExpressions":[{"key":"%s","operator":"NotIn","values":["%s"]}]},"weight":1}]}}} ]`, o.PodAffinityKey, o.PodAffinityValue) glog.V(2).Infof("patching pod") reviewResponse.Patch = []byte(addPodAffinityPatch) pt := v1beta1.PatchTypeJSONPatch reviewResponse.PatchType = &pt return reviewResponse }
hjqgdpho2#
这可以通过名称空间中的节点选择器注解来完成,请参见此处的示例
xoshrz7s3#
要确保一组节点仅专用于命名空间中的资源,您应该使用以下组合:
podSelector
taint
如何创建专用于仅使用一组节点的命名空间:https://stackoverflow.com/a/74617601/5482942此外,我发现阅读使用名称空间的动机也很有用。实际上,通常不建议在同一个k8s集群中有多个环境(开发、测试、暂存、生产)。最佳做法是为每个环境使用专用群集。要保存成本,您可以使用以下各项:
3条答案
按热度按时间9vw9lbht1#
您可以使用变更webhook来变更来自特定名称空间的传入pod请求,以便在pod规范中添加节点关联或节点选择器。
nodeSelector
准入控制器here.guide的一个例子如何使用它。准备API服务器
假设您的集群已部署了kubeadm,则kube-apiserver.yaml文件是Kubernetes API服务器的配置清单。它位于/etc/kubernetes/manifests中。在--admission-control= flag中添加PodNodeSelector准入控制器
然后向节点添加标签
然后在命名空间的注解中使用该标签。
通过变更webhook添加节点关联的示例。
hjqgdpho2#
这可以通过名称空间中的节点选择器注解来完成,请参见此处的示例
xoshrz7s3#
要确保一组节点仅专用于命名空间中的资源,您应该使用以下组合:
podSelector
* 仅在集合的节点上强制调度资源 *taint
* 用于拒绝调度不在该集合 * 的节点上的命名空间中的任何其他资源如何创建专用于仅使用一组节点的命名空间:https://stackoverflow.com/a/74617601/5482942
此外,我发现阅读使用名称空间的动机也很有用。
实际上,通常不建议在同一个k8s集群中有多个环境(开发、测试、暂存、生产)。
最佳做法是为每个环境使用专用群集。
要保存成本,您可以使用以下各项: