一篇图文说清楚k8s中namespce的用途
一、namespace 的用途
在 K8s 中,名字空间(Namespace) 提供一种逻辑上的隔离组,同一个组的资源可见。
要求同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求。

名字空间作用域仅针对带有名字空间的对象, 例如 Deployment、Service、pod、configmap、secret 等,而对集群范围的对象如 StorageClass、Node、PersistentVolume 等不适用。

Kubernetes 启动时会创建四个初始名字空间:
default
Kubernetes 包含这个名字空间,以便于你无需创建新的名字空间即可开始使用新集群。
kube-node-lease
该名字空间包含用于与各个节点关联的 Lease(租约)对象。 节点租约允许 kubelet 发送心跳, 由此控制面能够检测到节点故障。
kube-public
所有的客户端(包括未经身份验证的客户端)都可以读取该名字空间。 该名字空间主要预留为集群使用,以便某些资源需要在整个集群中可见可读。 该名字空间的公共属性只是一种约定而非要求。
kube-system
该名字空间用于 Kubernetes 系统创建的对象。
二、何时使用多个namespace
名字空间适用于存在很多跨多个团队或项目的用户的场景。
对于只有几到几十个用户的集群,根本不需要创建或考虑名字空间。当需要名字空间提供的功能时,请开始使用它们。

- 名字空间为名称提供了一个范围。资源的名称需要在名字空间内是唯一的,但不能跨名字空间。 名字空间不能相互嵌套,每个 Kubernetes 资源只能在一个名字空间中。
- 名字空间是在多个用户之间划分集群资源的一种方法(通过资源配额)。
- 不必使用多个名字空间来分隔仅仅轻微不同的资源,例如同一软件的不同版本: 应该使用标签来区分同一名字空间中的不同资源。
说明:
对于生产集群,请考虑不要使用 default 名字空间,而是创建其他名字空间来使用。
三、设置和使用namespace
kubectl get namespace
NAME STATUS AGE
default Active 1d
kube-node-lease Active 1d
kube-public Active 1d
kube-system Active 1d
为请求设置名字空间:
要为当前请求设置名字空间,请使用 --namespace 参数。
例如:
kubectl run nginx --image=nginx --namespace=<名字空间名称>
kubectl get pods --namespace=<名字空间名称>
设置名字空间偏好:
你可以永久保存名字空间,以用于对应上下文中所有后续 kubectl 命令。
kubectl config set-context --current --namespace=
<名字空间名称>
# 验证
kubectl config view --minify | grep namespace:
常用命令:
# 查看所有名字空间
kubectl get namespaces
# 或简写为
kubectl get ns
# 创建一个新的名字空间
kubectl create namespace my-app
# 在特定名字空间中创建资源(以 Nginx Pod 为例)
kubectl run nginx --image=nginx -n my-app
# 查看特定名字空间中的所有 Pod
kubectl get pods -n my-app
# 将操作上下文切换到某个名字空间(之后的所有命令默认在该名字空间执行)
kubectl config set-context --current --namespace=my-app
在YAML文件中指定:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: my-app # 指定该 Pod 属于 my-app 名字空间
spec:
containers:
- name: nginx
image: nginx:latest
四、名字空间和 DNS
当你创建一个服务时, Kubernetes 会创建一个相应的 DNS 条目。

上面的条目形式意味着如果容器只使用 <服务名称>,它将被解析到本地名字空间的服务。
这对于跨多个名字空间(如开发、测试和生产) 使用相同的配置非常有用。如果你希望跨名字空间访问,则需要使用完全限定域名(FQDN)。
说明:并非所有对象都在名字空间中
大多数 kubernetes 资源(例如 Pod、Service、副本控制器等)都位于某些名字空间中。 但是名字空间资源本身并不在名字空间中。而且底层资源, 例如节点和持久化卷不属于任何名字空间。
查看哪些 Kubernetes 资源在名字空间中,哪些不在名字空间中:
# 位于名字空间中的资源
kubectl api-resources --namespaced=true# 不在名字空间中的资源
kubectl api-resources --namespaced=false
更多推荐


所有评论(0)