Kubernetes 空间对象

Table of Contents

同一个物理机群支持划分出多个虚拟集群,这些虚拟集群被称为命名空间(namespace)。

1. 用途

命名空间用于很多跨多个团队或者项目的用户场景。几个或者几十个用户的集群,不需要考虑命名空间。当你需要的时候,再开始使用。

资源名称在同一个命名空间中是唯一的(跨空间允许相同),命名空间之间的名字是唯一的。命名空间不支持嵌套,同一个资源只能属于一个空间。

命名空间是多个用户之间划分集群资源的一种方法(通过资源配额)。

轻微不同的资源,不需要使用命名空间来区分,比如同一个软件的不同版本,可通过 Label 来区分。

2. 使用

空间的创建和删除在命名空间管理员指导文档中有描述。

注意: 避免创建空间时使用 kube- 前缀,因为它是为 Kubernetes 系统内部空间保留的。

2.1. 查看空间列表

$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   1d
kube-node-lease   Active   1d
kube-public       Active   1d
kube-system       Active   1d

Kubernetes 会创建四个初始的空间:

  • default 未指定其它命名空间的资源使用的默认空间;
  • kube-system 系统创建的对象所使用的命名空间;
  • kube-public 自动创建,所有用户都可使用,为集群所用;
  • kube-node-lease 该空间是为了与每个节点关联的租赁对象,随着集群的扩展,这么做可以提高节点心跳的性能;1

2.2. 请求中设置命名空间

设置 --namespace 标识,比如:

kubectl run nginx --image=nginx --namespace=<insert-namespace-name-here>
kubectl get pods --namespace=<insert-namespace-name-here>

2.3. 设置空间首选项(preference)

你可以为所有的 kubectl 子命令的上下文中设置空间:

kubectl config set-context --current --namespace=<insert-namespace-name-here>
# Validate it
kubectl config view --minify | grep namespace:

3. 命名空间和 DNS

当创建一个 Service 时,Kubernetes 会创建一个对应的 DNS 条目,形式为: <service-name>.<namespace-name>.svc.cluster.local 。 如果容器使用 <service-name> 将被解析到本地命名空间的服务。如果希望跨命名空间访问,需要使用完全限定域名(FQDN)。

4. 并非所有对象都在命名空间中

大部分的 Kubernetes 资源(比如:pods,services,RC 等)都是在某些命名空间中的。然而有些空间的资源不在命名空间中。 而且,低级别的资源,比如节点和 persistentVolumes,就不属于任何空间。

在查询资源时,可通过指定 -namespace=true/false 来查看哪些资源不在命名空间中。

# In a namespace
kubectl api-resources --namespaced=true

# Not in a namespace
kubectl api-resources --namespaced=false

Footnotes:

First created: 2021-02-20 16:49:05
Last updated: 2022-12-11 Sun 12:49
Power by Emacs 29.0.91 (Org mode 9.6.6)