目录
目标
版本
官网
概述
namespace(命名空间、名称空间)
注意事项
基本命令
查看namespace列表
查看所有Pod的namespace
查看单个Pod的namespace
查看同一个namespace下的所有Pod
查看单个namespace资源配额
查看单个Pod详情
查看所有namespace资源配额
创建namespace
删除namespace
资源配额
目标
了解命名空间的使用场景和使用方法,通过案例实战理解命名空间对资源的逻辑隔离方法。
版本
Kubernets v1.25.0
官网
命名空间的基本概念https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/
Compute Resource Quotahttps://kubernetes.io/docs/concepts/policy/resource-quotas/
Resource Management for Pods and Containershttps://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
概述
namespace(命名空间、名称空间)
官网定义
In Kubernetes, namespaces provide a mechanism for isolating groups of resources within a single cluster. Names of resources need to be unique within a namespace, but not across namespaces. Namespace-based scoping is applicable only for namespaced objects (e.g. Deployments, Services, etc.) and not for cluster-wide objects (e.g. StorageClass, Nodes, PersistentVolumes, etc.).
翻译
在 Kubernetes 中,命名空间提供了一种在单个集群内隔离资源组的机制。资源的名称在一个命名空间内必须唯一,但在不同的命名空间之间可以重复。基于命名空间的作用范围仅适用于命名空间范围的对象(例如 Deployments、Services 等),而不适用于集群范围的对象(例如 StorageClass、Nodes、PersistentVolumes 等)。
理解
- namespace在同一个K8s集群中对资源进行逻辑上的隔离。比如:隔离不同的团队、隔离不同的项目、隔离项目运行的环境(开发环境、测试环境、生产环境)等。
- 在同一个namespace下,资源的名称必须唯一,比如创建Pod时要求名称不能重复。
注意事项
官网描述(摘抄自不同的段落)
It is not necessary to use multiple namespaces to separate slightly different resources, such as different versions of the same software: use labels to distinguish resources within the same namespace.
For a production cluster, consider not using the
default
namespace. Instead, make other namespaces and use those.Avoid creating namespaces with the prefix
kube-
, since it is reserved for Kubernetes system namespaces.By creating namespaces with the same name as public top-level domains, Services in these namespaces can have short DNS names that overlap with public DNS records. Workloads from any namespace performing a DNS lookup without a trailing dot will be redirected to those services, taking precedence over public DNS.
翻译
- 不需要使用多个命名空间来区分略有不同的资源,例如同一软件的不同版本:可以使用标签来区分同一命名空间中的资源。
- 对于生产环境的集群,建议不要使用默认的命名空间。相反,应创建其他命名空间并使用它们。
- 避免创建以kube-为前缀的命名空间,因为该前缀是为Kubernetes系统命名空间保留的。
- 通过创建与公共顶级域名(TLD)同名的命名空间,这些命名空间中的服务可以具有与公共DNS记录重叠的简短DNS名称。任何命名空间中的工作负载,如果进行DNS查找且没有尾部点(dot),将会被重定向到这些服务,优先于公共DNS。
理解
- 资源的不同版本用标签区分,而不是创建多个不同的命名空间。
- 生产环境下自定义命名空间,不建议使用默认的命名空间。
- 命名空间不要用以kube-开头。
- 命名空间不要用域名命名,比如com、org、net等。
补充
- 名称必须是小写字母和数字,且只能包含字母、数字和连字符-。
- 名称必须以字母或数字开始和结束。
基本命令
查看namespace列表
kubectl get ns
kubectl get namespace
查看所有Pod的namespace
kubectl get pods --all-namespaces
查看单个Pod的namespace
kubectl describe pod Pod的名称
查看同一个namespace下的所有Pod
kubectl get pods -n namespace的全名
查看单个namespace资源配额
kubectl get resourcequota --namespace=namespace名称
kubectl get resourcequota -n namespace名称
查看单个Pod详情
kubectl describe pod pod名称 -n namespace名称
查看所有namespace资源配额
kubectl get resourcequota --all-namespaces
创建namespace
kubectl create ns namespace名称
删除namespace
kubectl delete namespace namespace名称
资源配额
第一步:查看资源配额相关的字段。
kubectl explain resourcequota
第二步:通过YAML定义namespace。我定义的namespace名称是my-namespace。内容如下。
vi test.yaml
apiVersion: v1
kind: ResourceQuota
metadata:name: customize-resource-quotasnamespace: my-namespace
第三步:查看resourcequota.spec及resourcequota.spec下的hard字段,在官方文档可以看到这个字段可以限制各种资源。
kubectl explain resourcequota.spec
- limits.cpu:所有运行状态的Pod最大CPU使用总量。
- requests.cpu:所有Pod启动时请求的CPU总量,不能超过limits.cpu。
- limits.memory:所有运行状态Pod的内存限制总和。
- requests.memory:所有Pod请求的内存总量,不能超过limits.memory。
第四步:创建命名空间并限制该命名空间的资源。
kubectl create ns my-namespace
kubectl apply -f test.yaml
第五步:核查刚才我们自定义的命名空间资源配额是否生效。
kubectl get resourcequota --namespace=my-namespace
kubectl get resourcequota -n my-namespace
第六步:创建YAML文件并写入基本配置信息。这个YAML是用来创建Pod的。
apiVersion: v1
kind: Pod
metadata:name: quota-testnamespace: my-namespacelabels:app: quota-app
spec:containers:- name: tomcatimage: 192.168.192.200/library/tomcat:8.0imagePullPolicy: Alwaysports:- containerPort: 8080
第七步:查看YAML创建Pod资源配额的方法。我配置Pod资源限制是500毫核CPU(0.5个CPU核心)和128兆内存;请求限制是250毫核CPU(0.25个CPU核心)和64兆内存。
kubectl explain pod.spec.containers.resources
apiVersion: v1
kind: Pod
metadata:name: quota-testnamespace: testlabels:app: quota-app
spec:containers:- name: tomcatimage: 192.168.192.200/library/tomcat:8.0imagePullPolicy: Alwaysports:- containerPort: 8080resources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"
第八步:创建Pod并查看资源配额。发现my-namespace这个命名空间下的资源使用情况与我刚才配置的Pod资源吻合,说明资源配额功能成功实现。
kubectl apply -f quota-test.yml
kubectl describe pod quota-test -n my-namespace
kubectl get resourcequota -n my-namespace