什么是Namespace
在 Kubernetes 中,命名空间提供了一种在单个集群中隔离资源组的机制。资源名称在命名空间内必须是唯一的,但跨命名空间不需要。基于命名空间的范围仅适用于命名空间对象(例如部署、服务等),不适用于集群范围的对象(例如 StorageClass、Nodes、PersistentVolumes 等)。
Namespacer常用操作
ps1: namespace 缩写为ns
ps2: 命名空间命名是注意不要使用kube-前缀,这是kubenets系统命名空间保留的。
- 查询命名空间 kubectl get ns
- 创建命名空间 kubectl create ns ns-name
- 删除命名空间 kubectl delete ns ns-name
删除命名空间时需要注意:
1,删除ns会自动删除所有属于ns的资源
2,default 和kube-system命名空间不可删除
3,PersistentVolumes是不属于任何namespace的,但PersistentVolumeClaim是属于某个特定namespace的。
Events是否属于namespace取决于产生events的对象。
使用命名空间
为请求设置命名空间
kubect get pods --namespace=ns-name
设置命名空间首选项
kubectl config set-context --current --namespace=ns-name
kubectl config viw --minify|grep namespace(查看当前ns)
命名空间和DNS
创建service时,会创建相应的[DNS条目](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/)。此条目的格式为<service-name>.,<namespace>.svc.cluster.local.这意味着如果容器仅使用<service-name>,它将解析为名称空间本地的服务。这对于跨多个命名空间(例如 Development、Staging 和 Production)使用相同的配置很有用。如果要跨命名空间进行访问,则需要使用完全限定域名 (FQDN)。
因此,所有命名空间名称都必须是有效的 RFC 1123 DNS 标签。
RFC 1123 标签名称
某些资源类型要求其名称遵循RFC 1123中定义的 DNS 标签标准。这意味着该名称必须:
最多包含 63 个字符
仅包含小写字母数字字符或“-”
以字母数字字符开头
以字母数字字符结尾
并非所有对象都在命名空间中
大多数 Kubernetes 资源(例如 pod、服务、复制控制器等)都位于某些命名空间中。然而,命名空间资源本身并不在命名空间中。并且低级资源,例如 节点和持久卷,不在任何命名空间中。
要查看哪些 Kubernetes 资源在命名空间中,哪些不在命名空间中:
# In a namespace
kubectl api-resources --namespaced=true
# Not in a namespace
kubectl api-resources --namespaced=false
自动贴标
Kubernetes 控制平面设置了一个不可变的标签 kubernetes.io/metadata.name在所有命名空间上,前提是启用了NamespaceDefaultLabelName 功能门。标签的值是命名空间名称。
与命名空间共享集群
查看命名空间
#查看所有namespace
kubectl get ns
#查看特定namespace
kubectl get ns ns-name
#查看namespace祥细信息
kubectl describe ns ns-name
Name: default
Labels: <none>
Annotations: <none>
Status: Active
No resource quota.
Resource Limits
Type Resource Min Max Default
---- -------- --- --- ---
Container cpu - - 100m
请注意,这些详细信息显示资源配额(如果存在)以及资源限制范围。
资源配额跟踪命名空间中资源的聚合使用情况,并允许集群操作员定义命名空间可能消耗的硬资源使用限制。
限制范围定义了单个实体在命名空间中可以消耗的资源量的最小/最大约束。
Kubernetes 从三个初始命名空间开始:
- default 没有其他命名空间的对象的默认命名空间
- kube-systemKubernetes 系统创建的对象的命名空间
- kube-public 此命名空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取。这个命名空间主要是为集群使用保留的,以防某些资源在整个集群中是公开可见和可读的。这个命名空间的公共方面只是一个约定,而不是一个要求。
创建命名空间
- 使用yaml文件
vim first-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: namespace-name
#使用命令
kubetctl create -f ./first-namespace.yaml
- 使用命令行
kubectl crate namespace namespace-name
删除命名空间
- 删除命名空间
kubectl delete namespace namespace-name
PS:删除操作会删除命名空间下的所有内容