默认情况下,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总使用量 |
| 请求的总内存使用量 |
| 阶段处于挂起或活动状态的活动Pod总数。 |
| 服务总数 |
| 复制控制器总数 |
| 资源配额总数 |
| 秘密总数 |
| 持续批量索赔总数 |
可以在名称空间中创建此资源配额:
./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
希望您可以应用名称空间,资源配额和限制,以便在不同环境中共享集群。
- 资料来源: http : //blog.couchbase.com/2016/march/kubernetes-namespaces-resource-quota-limits-qos-cluster
翻译自: https://www.javacodegeeks.com/2016/03/kubernetes-namespaces-resource-quota-limits-qos-cluster.html