如何对kubernetes中的所有名称空间应用限制范围

dffbzjpn  于 2022-11-02  发布在  Kubernetes
关注(0)|答案(3)|浏览(200)

如何将此文件应用于所有命名空间:

apiVersion: v1
kind: LimitRange
metadata:
  name: resource-limits
spec:
  limits:
    -
      type: Pod
      max:
        cpu: 1000m
        memory: 1Gi
      min:
        cpu: 500m
        memory: 500Mi

默认情况下,它会应用到我使用的命名空间。我想让这个设置成为一个通用设置
我怎么能做到呢。把这个设为全局设置。

pinkon5k

pinkon5k1#

根据我的调查,这在manifest文件中是不可能的,但是在这里我使用bash实现了一个trick-script,如果您使用kubectl部署manifest,则使用下面的辅助脚本:


# !/bin/bash

namespaces=$(echo `kubectl get namespaces -o=jsonpath='{range.items[*]} {.metadata.name}{end}'`)

for ns in $namespaces; do kubectl apply -f path-to-manifest-file.yaml --namespace $ns; done

也许你会说为什么我在一个循环中而不是在一行中应用它,方法是添加与命名空间一样多的--namespace标志!实际上,我尝试过这样做,但看起来kubectl命令在通过变量传递时并不考虑多个--namespace,如下所示:

(base) 
╰─$ namespace_flags=`kubectl get namespaces -o=jsonpath='{range.items[*]} --namespace {.metadata.name}{end}'`

╰─$ echo $namespace_flags
--namespace default--namespace kube-node-lease--namespace kube-public--namespace kube-system--namespace newrelic

(base) 
╰─$ kubectl get pods ${namespace_flags[@]}
Error from server (NotFound): pods " --namespace default --namespace kube-node-lease --namespace kube-public --namespace kube-system --namespace newrelic" not found
ryhaxcpt

ryhaxcpt2#

在做了大量的研究之后,我得到了一个更好的解决方案,Kyverno,它被采用作为CNCF孵化项目的成熟度级别。它可以实现集群级别的策略,这满足了我的用例。链接在这里:
https://kyverno.io/

wnavrhmk

wnavrhmk3#

使用Kyverno之类的准入控制器可以很容易地完成这一点。Kyverno具有“generate“功能,可用于基于触发器(例如创建名称空间)生成任何Kubernetes资源
下面是一个Kyverno策略实现此目的的示例。https://kyverno.io/policies/best-practices/add_ns_quota/add_ns_quota/

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: add-ns-quota
  annotations:
    policies.kyverno.io/title: Add Quota
    policies.kyverno.io/category: Multi-Tenancy
    policies.kyverno.io/subject: ResourceQuota, LimitRange
    policies.kyverno.io/description: >-
      To better control the number of resources that can be created in a given
      Namespace and provide default resource consumption limits for Pods,
      ResourceQuota and LimitRange resources are recommended.
      This policy will generate ResourceQuota and LimitRange resources when
      a new Namespace is created.      
spec:
  rules:
  - name: generate-resourcequota
    match:
      resources:
        kinds:
        - Namespace
    generate:
      apiVersion: v1
      kind: ResourceQuota
      name: default-resourcequota
      synchronize: true
      namespace: "{{request.object.metadata.name}}"
      data:
        spec:
          hard:
            requests.cpu: '4'
            requests.memory: '16Gi'
            limits.cpu: '4'
            limits.memory: '16Gi'
  - name: generate-limitrange
    match:
      resources:
        kinds:
        - Namespace
    generate:
      apiVersion: v1
      kind: LimitRange
      name: default-limitrange
      synchronize: true
      namespace: "{{request.object.metadata.name}}"
      data:
        spec:
          limits:
          - default:
              cpu: 500m
              memory: 1Gi
            defaultRequest:
              cpu: 200m
              memory: 256Mi
            type: Container

相关问题