Namespace
概述
1、在 Kubernetes 中,命名空间(Namespace)提供一种机制,将同一集群中的资源划分为相互隔离的组
2、同一命名空间内的资源名称要唯一,但跨命名空间时没有这个要求
3、命名空间作用域仅针对带有命名空间的对象,例如 Deployment、Service 等, 这种作用域对集群访问的对象不适用,例如 StorageClass、Node、PersistentVolume 等
何时使用多个命名空间
1、命名空间适用于存在很多跨多个团队或项目的用户的场景
(1)对于只有几到几十个用户的集群,根本不需要创建或考虑命名空间
(2)当需要命名空间提供的功能时,请开始使用它们
2、命名空间为名称提供了一个范围
(1)资源的名称需要在命名空间内是唯一的,但不能跨命名空间
(2)命名空间不能相互嵌套,每个 Kubernetes 资源只能在一个命名空间中
3、命名空间是在多个用户之间划分集群资源的一种方法(通过资源配额)
4、不必使用多个命名空间来分隔仅仅轻微不同的资源,例如同一软件的不同版本:应该使用 Labels 来区分同一命名空间中的不同资源
5、说明:对于生产集群,请考虑不要使用 default 命名空间,而是创建其他命名空间来使用
Kubernetes 启动时会创建四个初始命名空间
1、default:Kubernetes 包含这个命名空间,以便于你无需创建新的命名空间即可开始使用新集群
2、kube-node-lease
(1)该命名空间包含用于与各个节点关联的 Lease(租约)对象
(2)节点租约允许 kubelet 发送心跳,由此控制面能够检测到节点故障
3、kube-public
(1)所有的客户端(包括未经身份验证的客户端)都可以读取该命名空间
(2)该命名空间主要预留为集群使用,以便某些资源需要在整个集群中可见可读
(3)该命名空间的公共属性只是一种约定而非要求
4、kube-system:该命名空间用于 Kubernetes 系统创建的对象
使用命名空间
1、创建命名空间
(1)说明: 避免使用前缀 kube- 创建命名空间,因为它是为 Kubernetes 系统命名空间保留的
(2)根据 yaml 文件创建命名空间
apiVersion: v1
kind: Namespace
metadata:
name: <insert-namespace-name-here>
kubectl create -f <insert-yaml-directory-here>
(3)直接创建指定名称的命名空间
kubectl create namespace <insert-namespace-name-here>
(4)请注意,命名空间的名称必须是一个合法的 DNS 标签
(5)可选字段 finalizers 允许观察者们在命名空间被删除时清除资源,如果指定了一个不存在的终结器,命名空间仍会被创建,但如果用户试图删除它,它将陷入 Terminating 状态
2、删除命名空间
kubectl delete namespaces <insert-some-namespace-name>
(1)这会删除命名空间下的所有内容
(2)删除是异步的,所以有一段时间会看到命名空间处于 Terminating 状态
3、查看命名空间
(1)列出集群中现有的命名空间
kubectl get namespaces
(2)获取特定命名空间的摘要
kubectl get namespaces <name>
(3)获取详细信息
kubectl describe namespaces <name>
(4)请注意,这些详情同时显示了资源配额(如果存在)以及资源限制区间
(5)资源配额跟踪并聚合 Namespace 中资源的使用情况,并允许集群运营者定义 Namespace 可能消耗的 Hard 资源使用限制
(6)限制区间定义了单个实体在一个 Namespace 中可使用的最小 / 最大资源量约束
(7)命名空间可以处于下列两个阶段中的一个
(8)Active 命名空间正在被使用中
(9)Terminating 命名空间正在被删除,且不能被用于新对象
命名空间和 DNS
1、当创建一个服务时, Kubernetes 会创建一个相应的 DNS 条目
2、该条目的形式是 <服务名称>.<命名空间名称>.svc.cluster.local,这意味着如果容器只使用 <服务名称>,它将被解析到本地命名空间的服务。这对于跨多个命名空间(如开发、测试、生产) 使用相同的配置非常有用。如果希望跨命名空间访问,则需要使用完全限定域名(FQDN)
3、因此,所有的命名空间名称都必须是合法的 RFC 1123 DNS 标签
并非所有对象都在命名空间中
1、大多数 kubernetes 资源(例如 Pod、Service、副本控制器等)都位于某些命名空间中
2、但是命名空间资源本身并不在命名空间中。而且底层资源, 例如:节点和持久化卷不属于任何命名空间
3、查看哪些 Kubernetes 资源在命名空间中,哪些不在命名空间中
(1)位于命名空间中的资源
kubectl api-resources --namespaced=true
(2)不在命名空间中的资源
kubectl api-resources --namespaced=false
自动打标签
1、特性状态: Kubernetes 1.21 [beta]
2、Kubernetes 控制面会为所有命名空间设置一个不可变更的标签 kubernetes.io/metadata.name,只要 NamespaceDefaultLabelName 这一特性门控被启用。 标签的值是命名空间的名称
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战