如何将限制范围应用于 kubernetes 中的所有命名空间

问题描述 投票:0回答:3

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

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

默认情况下,它会应用于我所在的命名空间。我想让这个设置成为通用的

我该怎么办呢。使其成为全局设置。

kubernetes kubernetes-helm amazon-eks kyverno
3个回答
2
投票

使用像 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

1
投票

根据我的调查,这在清单文件中本机是不可能的,但在这里我使用 bash 实现了一个技巧脚本来执行此操作,如果您使用

kubectl
部署清单,则使用此辅助脚本:

#!/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

1
投票

经过大量研究,我得到了一个更好的解决方案,

Kyverno
,被采用为 CNCF 孵化项目成熟度级别。它可以实现满足我的用例的集群级别策略。链接在这里:

https://kyverno.io/

© www.soinside.com 2019 - 2024. All rights reserved.