03-Kubernetes命名空间
1、什么是命名空间
Kubernetes支持多个虚拟集群,它们底层依赖于同一个物理集群。这些虚拟集群被称为命名空间。
命名空间(namespace)是Kubernetes集群级别的资源,可以给不同的用户、租户、环境或者项目创建对应的命名空间,例如,可以给test
、devloment
、production
环境分别创建各自的命名空间。
2、命名空间的应用场景
命名空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑命名空间。
2.1 查看命名空间及其资源对象
k8s集群默认提供了几个名称空间用于特定目的,例如,kube-system主要用于运行系统级资源,存放k8s一些组件的。而default则为那些未指定名称空间的资源操作提供一个默认值。
使用kubectl get namespaces
可以查看namespace资源,使用kubectl describe namespace $NAME
可以查看特定的名称空间的详细信息。
kubectl get ns
kubectl get namespaces
kubectl describe namespaces kube-system
kubectl describe ns kubernetes-dashboard
2.2 管理命名空间资源
-
namespace资源属性较少,通常只需要指定名称即可创建,如
kubectl create namespace qa
。 -
namespace资源的名称仅能由
字母、数字、下划线、连接线等字符
组成。 -
删除namespace资源会级联删除其包含的所有其他资源对象。
3、命名空间使用案例
3.1 创建命名空间
kubectl create namespace test
3.2 切换命名空间
kubectl config set-context --current --namespace=test
切换后kubeconfig
文件也会自动改变:
3.3 查看哪些资源属于命名空间级别
kubectl api-resources --namespaced=true
命名空间级别的资源有:
3.4 命名空间资源限额
namespace是命名空间,里面有很多资源,那么我们可以对命名空间资源做个限制,防止该命名空间部署的资源超过限制。
我们可以在创建命名空间的时候就对该命名空间的资源进行限额。
通过资源清单对命名空间进行资源限额:
# namespace-test.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
spec:
finalizers:
- kubernetes
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-quota
namespace: test
spec:
hard:
requests.cpu: "2"
requests.memory: 2Gi
limits.cpu: "4"
limits.memory: 4Gi
创建的ResourceQuota对象将在test名字空间中添加以下限制:
- 每个容器必须设置内存请求(memory request),内存限额(memory limit),cpu请求(cpu request)和cpu限额(cpu limit)。
- 所有容器的内存请求总额不得超过2GiB。
- 所有容器的内存限额总额不得超过4 GiB。
- 所有容器的CPU请求总额不得超过2 CPU。
- 所有容器的CPU限额总额不得超过4CPU。
更新资源配置清单:
kubectl apply -f namespace-test.yaml
Kubernetes会自动创建命名空间并设置资源限额:
在有资源限额的命名空间中创建Pod必须设置资源限额,否则创建Pod会失败!
# pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test
namespace: test
labels:
name: pod-test
spec:
containers:
- name: pod-test
image: tomcat:8.5-jre8-alpine
ports:
- containerPort: 8080
imagePullPolicy: IfNotPresent
更新资源配置文件:
kubectl apply -f pod-test.yaml
由于没有设置资源限额,所以报错如下:
修改之后的资源配置文件:
# pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test
namespace: test
labels:
name: pod-test
spec:
containers:
- name: pod-test
image: tomcat:8.5-jre8-alpine
resources:
requests:
memory: "128Mi"
cpu: "500m"
limits:
memory: "256Mi"
cpu: "1000m"
ports:
- containerPort: 8080
imagePullPolicy: IfNotPresent
更新资源配置清单:
kubectl apply -f pod-test.yaml
kubectl get pods -n test -o wide
Pod成功创建: