Kubernetes命名空间,资源配额和集群中QoS的限制

默认情况下,Kubernetes集群中的所有资源都是在默认名称空间中创建的。 一个Pod将以不受限制的CPU和内存请求/限制运行。

Kubernetes命名空间允许将创建的资源划分为逻辑命名的组。 每个名称空间都提供:

  • 避免名称冲突的独特资源范围
  • 确保对受信任用户具有适当权限的策略
  • 指定资源消耗约束的能力

这允许Kubernetes集群按多个组共享资源,并为每个组提供不同级别的QoS。

在一个名称空间中创建的资源对于其他名称空间是隐藏的。 可以创建多个名称空间,每个名称空间都可能具有不同的约束。

默认的Kubernetes命名空间

默认情况下,用户在Kubernetes集群中创建的每个资源都在默认名称空间(称为default

./kubernetes/cluster/kubectl.sh get namespace
NAME          LABELS    STATUS    AGE
default       <none>    Active    1m
kube-system   <none>    Active    1m

任何Pod,服务或复制控制器都将在此命名空间中创建。 kube-system名称空间保留给Kubernetes集群创建的资源使用。

可以看到有关名称空间的更多详细信息:

./kubernetes/cluster/kubectl.sh describe namespaces default
Name:    default
Labels:    <none>
Status:    Active
 
No resource quota.
 
Resource Limits
 Type        Resource    Min    Max    Request    Limit    Limit/Request
 ----        --------    ---    ---    -------    -----    -------------
 Container    cpu        -    -    100m    -    -

此描述显示资源配额(如果存在)以及资源限制范围。

因此,让我们创建一个Couchbase复制控制器,如下所示:

./kubernetes/cluster/kubectl.sh run couchbase --image=arungupta/couchbase

检查现有的复制控制器:

./kubernetes/cluster/kubectl.sh get rc
CONTROLLER   CONTAINER(S)   IMAGE(S)              SELECTOR        REPLICAS   AGE
couchbase    couchbase      arungupta/couchbase   run=couchbase   1          5m

默认情况下,仅显示用户名称空间中的资源。 可以使用--all-namespaces选项显示所有名称空间中的资源:

./kubernetes/cluster/kubectl.sh get rc --all-namespaces
NAMESPACE     CONTROLLER                       CONTAINER(S)           IMAGE(S)                                                SELECTOR                           REPLICAS   AGE
default       couchbase                        couchbase              arungupta/couchbase                                     run=couchbase                      1          5m
kube-system   heapster-v11                     heapster               gcr.io/google_containers/heapster:v0.18.4               k8s-app=heapster,version=v11       1          6m
kube-system   kube-dns-v9                      etcd                   gcr.io/google_containers/etcd:2.0.9                     k8s-app=kube-dns,version=v9        1          6m
                                               kube2sky               gcr.io/google_containers/kube2sky:1.11                                                     
                                               skydns                 gcr.io/google_containers/skydns:2015-10-13-8c72f8c                                         
                                               healthz                gcr.io/google_containers/exechealthz:1.0                                                   
kube-system   kube-ui-v4                       kube-ui                gcr.io/google_containers/kube-ui:v4                     k8s-app=kube-ui,version=v4         1         6m
kube-system   l7-lb-controller-v0.5.2          default-http-backend   gcr.io/google_containers/defaultbackend:1.0             k8s-app=glbc,version=v0.5.2        1         6m
                                               l7-lb-controller       gcr.io/google_containers/glbc:0.5.2                                                        
kube-system   monitoring-influxdb-grafana-v2   influxdb               gcr.io/google_containers/heapster_influxdb:v0.4         k8s-app=influxGrafana,version=v2   1         6m
                                               grafana                beta.gcr.io/google_containers/heapster_grafana:v2.1.1

如您所见, arungupta/couchbase映像在default名称空间中运行。 所有其他资源都在kube-system名称空间中运行。

让我们检查此复制控制器的上下文:

./kubernetes/cluster/kubectl.sh config view couchbase
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://104.197.10.200
  name: couchbase-on-kubernetes_kubernetes
contexts:
- context:
    cluster: couchbase-on-kubernetes_kubernetes
    user: couchbase-on-kubernetes_kubernetes
  name: couchbase-on-kubernetes_kubernetes
current-context: couchbase-on-kubernetes_kubernetes
kind: Config
preferences: {}
users:
- name: couchbase-on-kubernetes_kubernetes
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    token: 1RUrsvA5RDwwRNf0eOvz86elmniOK0oj
- name: couchbase-on-kubernetes_kubernetes-basic-auth
  user:
    password: cZ9fZSuzIqq5kdnj
    username: admin

查找contexts.context.name属性以查看现有上下文。 稍后将对此进行操作。

在新的Kubernetes命名空间中创建资源

首先创建一个新的名称空间。 可以使用以下配置文件完成此操作:

apiVersion: v1
kind: Namespace
metadata:
  name: development
  labels:
    name: development

命名空间创建为:

./kubernetes/cluster/kubectl.sh create -f myns.yaml 
namespace "development" created

然后查询所有名称空间将给出:

./kubernetes/cluster/kubectl.sh get namespace
NAME          LABELS             STATUS    AGE
default       <none>             Active    9m
development   name=development   Active    13s
kube-system   <none>             Active    8m

可以使用--namespace选项在此新名称空间中创建新的复制控制器:

./kubernetes/cluster/kubectl.sh --namespace=development run couchbase --image=arungupta/couchbase
replicationcontroller "couchbase" created

所有名称空间中的资源列表如下所示:

./kubernetes/cluster/kubectl.sh get rc --all-namespaces
NAMESPACE     CONTROLLER                       CONTAINER(S)           IMAGE(S)                                                SELECTOR                           REPLICAS   AGE
default       couchbase                        couchbase              arungupta/couchbase                                     run=couchbase                      1          4m
development   couchbase                        couchbase              arungupta/couchbase                                     run=couchbase                      1          2m
kube-system   heapster-v11                     heapster               gcr.io/google_containers/heapster:v0.18.4               k8s-app=heapster,version=v11       1          31m
. . .

如图所示,有两个具有arungupta/couchbase映像的复制控制器-一个在default名称空间中,另一个在development名称空间中。

为现有资源设置Kubernetes命名空间

如果已经创建资源,则可以为其分配一个名称空间。

在先前创建的资源上,可以在名称空间中设置新的上下文:

./kubernetes/cluster/kubectl.sh config set-context dev --namespace=development --cluster=couchbase-on-kubernetes_kubernetes --user=couchbase-on-kubernetes_kubernetes
context "dev" set.

现在查看上下文显示:

./kubernetes/cluster/kubectl.sh config view couchbase
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://104.197.10.200
  name: couchbase-on-kubernetes_kubernetes
contexts:
- context:
    cluster: couchbase-on-kubernetes_kubernetes
    user: couchbase-on-kubernetes_kubernetes
  name: couchbase-on-kubernetes_kubernetes
- context:
    cluster: couchbase-on-kubernetes_kubernetes
    namespace: development
    user: couchbase-on-kubernetes_kubernetes
  name: dev
current-context: couchbase-on-kubernetes_kubernetes
kind: Config
preferences: {}
users:
- name: couchbase-on-kubernetes_kubernetes
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    token: 1RUrsvA5RDwwRNf0eOvz86elmniOK0oj
- name: couchbase-on-kubernetes_kubernetes-basic-auth
  user:
    password: cZ9fZSuzIqq5kdnj
    username: admin

contexts.context数组中的第二个属性显示已创建一个新的上下文。 它还显示当前上下文仍然是couchbase-on-kubernetes_kubernetes 。 由于在该上下文中未指定名称空间,因此它属于默认名称空间。

更改上下文:

./kubernetes/cluster/kubectl.sh config use-context dev
switched to context "dev".

请参阅复制控制器列表:

./kubernetes/cluster/kubectl.sh get rc
CONTROLLER   CONTAINER(S)   IMAGE(S)   SELECTOR   REPLICAS   AGE

显然,在这种情况下没有运行复制控制器。 让我们在这个新的名称空间中创建一个新的复制控制器:

./kubernetes/cluster/kubectl.sh run couchbase --image=arungupta/couchbase
replicationcontroller "couchbase" created

并查看所有名称空间中的复制控制器列表:

./kubernetes/cluster/kubectl.sh get rc --all-namespaces
NAMESPACE     CONTROLLER                       CONTAINER(S)           IMAGE(S)                                                SELECTOR                           REPLICAS   AGE
default       couchbase                        couchbase              arungupta/couchbase                                     run=couchbase                      1          16m
development   couchbase                        couchbase              arungupta/couchbase                                     run=couchbase                      1          4s
kube-system   heapster-v11                     heapster               gcr.io/google_containers/heapster:v0.18.4               k8s-app=heapster,version=v11       1          17m
. . .

现在,您可以看到在两个不同名称空间中运行的两个arungupta/couchbase复制控制器。

在命名空间中删除Kubernetes资源

可以通过完全限定资源名称来删除资源:

./kubernetes/cluster/kubectl.sh --namespace=default delete rc couchbase
replicationcontroller "couchbase" deleted

同样,可以将其他复制控制器删除为:

./kubernetes/cluster/kubectl.sh --namespace=development delete rc couchbase
replicationcontroller "couchbase" deleted

最后,请参阅所有名称空间中所有复制控制器的列表:

./kubernetes/cluster/kubectl.sh get rc --all-namespaces
NAMESPACE     CONTROLLER                       CONTAINER(S)           IMAGE(S)                                                SELECTOR                           REPLICAS   AGE
kube-system   heapster-v11                     heapster               gcr.io/google_containers/heapster:v0.18.4               k8s-app=heapster,version=v11       1          3h
kube-system   kube-dns-v9                      etcd                   gcr.io/google_containers/etcd:2.0.9                     k8s-app=kube-dns,version=v9        1          3h
. . .

这确认已删除所有用户创建的复制控制器。

使用Kubernetes命名空间的资源配额和限制

可以为每个命名空间分配资源配额。

默认情况下,pod将以不受限制的CPU和内存请求/限制运行。 指定配额可以限制可以在命名空间的所有Pod中消耗多少群集资源。

可以使用配置文件指定资源配额:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota
spec:
  hard:
    cpu: "20"
    memory: 1Gi
    pods: "10"
    replicationcontrollers: "20"
    resourcequotas: "1"
    services: "5"

配额系统支持以下资源:

资源资源 描述
cpu 请求的CPU总使用量
memory 请求的总内存使用量
pods 阶段处于挂起或活动状态的活动Pod总数。
services 服务总数
replicationcontrollers 复制控制器总数
resourcequotas 资源配额总数
secrets 秘密总数
persistentvolumeclaims 持续批量索赔总数


可以在名称空间中创建此资源配额:

./kubernetes/cluster/kubectl.sh --namespace=development create -f quota.yaml
resourcequota "quota" created

创建的配额可以视为:

./kubernetes/cluster/kubectl.sh --namespace=development describe quota
Name:            quota
Namespace:        development
Resource        Used    Hard
--------        ----    ----
cpu            0    20
memory            0    1Gi
pods            0    10
replicationcontrollers    0    20
resourcequotas        1    1
services        0    5

现在,如果您尝试创建有效的复制控制器,请执行以下操作:

./kubernetes/cluster/kubectl.sh --namespace=development run couchbase --image=arungupta/couchbase
replicationcontroller "couchbase" created

但是再次描述配额显示:

./kubernetes/cluster/kubectl.sh --namespace=development describe quota
Name:            quota
Namespace:        development
Resource        Used    Hard
--------        ----    ----
cpu            0    20
memory            0    1Gi
pods            0    10
replicationcontrollers    1    20
resourcequotas        1    1
services        0    5

我们预计将创建一个新的Pod作为此复制控制器的一部分,但它不存在。 因此,让我们描述一下复制控制器:

./kubernetes/cluster/kubectl.sh --namespace=development describe rc
Name:        couchbase
Namespace:    development
Image(s):    arungupta/couchbase
Selector:    run=couchbase
Labels:        run=couchbase
Replicas:    0 current / 1 desired
Pods Status:    0 Running / 0 Waiting / 0 Succeeded / 0 Failed
No volumes.
Events:
  FirstSeen    LastSeen    Count    From                SubobjectPath    Reason        Message
  ─────────    ────────    ─────    ────                ─────────────    ──────        ───────
  1m        24s        4    {replication-controller }            FailedCreate    Error creating: Pod "couchbase-" is forbidden: must make a non-zero request for memory since it is tracked by quota.

默认情况下,pod会消耗所有可用的cpu和内存。 应用资源配额后,必须指定一个明确的值。 或者,可以使用以下配置文件为容器指定默认值:

apiVersion: v1
kind: LimitRange
metadata:
  name: limits
spec:
  limits:
  - default:
      cpu: 200m
      memory: 512Mi
    defaultRequest:
      cpu: 100m
      memory: 256Mi
    type: Container

这限制了Pod可以占用的CPU和内存。 让我们将这些限制应用为:

./kubernetes/cluster/kubectl.sh --namespace=development create -f limits.yaml 
limitrange "limits" created

现在,当您再次描述复制控制器时,它将显示:

./kubernetes/cluster/kubectl.sh --namespace=development describe rc
Name:        couchbase
Namespace:    development
Image(s):    arungupta/couchbase
Selector:    run=couchbase
Labels:        run=couchbase
Replicas:    1 current / 1 desired
Pods Status:    1 Running / 0 Waiting / 0 Succeeded / 0 Failed
No volumes.
Events:
  FirstSeen    LastSeen    Count    From                SubobjectPath    Reason            Message
  ─────────    ────────    ─────    ────                ─────────────    ──────            ───────
  8m        2m        14    {replication-controller }            FailedCreate        Error creating: Pod "couchbase-" is forbidden: must make a non-zero request for memory since it is tracked by quota.
  2m        2m        1    {replication-controller }            SuccessfulCreate    Created pod: couchbase-gzk0l

这显示了吊舱的成功创建。

现在,当您描述配额时,它也会显示正确的值:

./kubernetes/cluster/kubectl.sh --namespace=development describe quota
Name:            quota
Namespace:        development
Resource        Used        Hard
--------        ----        ----
cpu            100m        20
memory            268435456    1Gi
pods            1        10
replicationcontrollers    1        20
resourcequotas        1        1
services        0        5

资源配额提供有关如何设置/更新这些值的更多详细信息。

创建另一个配额会出现以下错误:

./kubernetes/cluster/kubectl.sh --namespace=development create -f quota.yaml
Error from server: error when creating "quota.yaml": ResourceQuota "quota" is forbidden: limited to 1 resourcequotas

在Pod创建期间指定限制

限制也可以在广告连播创建期间指定:

如果每个Pod的内存限制限制为1g,则有效的Pod定义为:

apiVersion: v1
kind: Pod
metadata:
  name: couchbase-pod
spec:
  containers:
  - name: couchbase
    image: couchbase
    ports:
    - containerPort: 8091
    resources:
      limits:
        cpu: "1"
        memory: 512Mi

这是因为Pod仅请求0.5G的内存。 无效的pod定义为:

apiVersion: v1
kind: Pod
metadata:
  name: couchbase-pod
spec:
  containers:
  - name: couchbase
    image: couchbase
    ports:
    - containerPort: 8091
    resources:
      limits:
        cpu: "1"
        memory: 2G

这是因为Pod请求2G内存。 创建这样的Pod会产生以下错误:

./kubernetes/cluster/kubectl.sh --namespace=development create -f couchbase-pod.yaml 
Error from server: error when creating "couchbase-pod.yaml": Pod "couchbase-pod" is forbidden: unable to admit pod without exceeding quota for resource memory:  limited to 1Gi but require 2805306368 to succeed

希望您可以应用名称空间,资源配额和限制,以便在不同环境中共享集群。

翻译自: https://www.javacodegeeks.com/2016/03/kubernetes-namespaces-resource-quota-limits-qos-cluster.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值