k8s 可以使用 Namespaces(命名空间)创建多个虚拟集群。

# 何时使用多个 Namespaces

当团队或项目中具有许多用户时,可以考虑使用 Namespace 来区分,a 如果是少量用户集群,可以不需要考虑使用 Namespace,如果需要它们提供特殊性质时,可以开始使用 Namespace。

Namespace 为名称提供了一个范围。资源的 Names 在 Namespace 中具有唯一性。

Namespace 是一种将集群资源划分为多个用途(通过 resource quota)的方法。

在未来的 k8s 版本中,默认情况下,相同 Namespace 中的对象将具有相同的访问控制策略。

对于稍微不同的资源没必要使用多个 Namespace 来划分,例如同意软件的不同版本,可以使用 labels(标签)来区分同一 Namespace 中的资源。

# 使用 Namespaces

Namespace 的创建、删除和查看。

# 创建

(1) 命令行直接创建
$ kubectl create namespace new-namespace

(2) 通过文件创建
$ cat my-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: new-namespace

$ kubectl create -f ./my-namespace.yaml

注意:命名空间名称满足正则表达式 a-z0-9?,最大长度为 63 位

# 删除

$ kubectl delete namespaces new-namespace

注意:

  1. 删除一个 namespace 会自动删除所有属于该 namespace 的资源。
  2. default 和 kube-system 命名空间不可删除。
  3. PersistentVolumes 是不属于任何 namespace 的,但 PersistentVolumeClaim 是属于某个特定 namespace 的。
  4. Events 是否属于 namespace 取决于产生 events 的对象。

# 查看 Namespaces

使用以下命令列出群集中的当前的 Namespace:

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

k8s 从两个初始的 Namespace 开始:

  • default
  • kube-system 由 k8s 系统创建的对象的 Namespace

# Setting the namespace for a request

要临时设置 Request 的 Namespace,请使用--namespace 标志。

例如:

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

# Setting the namespace preference

可以使用 kubectl 命令创建的 Namespace 可以永久保存在 context 中。

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

# 所有对象都在 Namespace 中?

大多数 k8s 资源(例如 pod、services、replication controllers 或其他)都在某些 Namespace 中,但 Namespace 资源本身并不在 Namespace 中。而低级别资源(如 Node 和 persistentVolumes)不在任何 Namespace 中。Events 是一个例外:它们可能有也可能没有 Namespace,具体取决于 Events 的对象。

Last Updated: 6/17/2023, 6:57:19 PM