Namespace 是 Kubernetes 中的一种逻辑分区机制,用于将集群中的资源划分成不同的环境或团队。每个 Namespace 充当一个独立的命名空间,允许多个用户和团队在同一 Kubernetes 集群中独立工作,而不会发生资源冲突。这种设计使得 Kubernetes 特别适合于多租户环境。

Namespace 的主要功能

  1. 资源隔离
  • Namespace 提供了资源的逻辑隔离。不同 Namespace 中的资源(如 Pods、Services、ConfigMaps 等)相互独立,避免了名称冲突。例如,可以在不同的 Namespace 中使用相同的 Pod 名称,而不会造成干扰。
  1. 访问控制
  • Kubernetes 通过 RBAC(基于角色的访问控制)允许为不同 Namespace 设置不同的权限。这意味着可以限制用户在特定 Namespace 中的操作,从而增强安全性。
  1. 环境管理
  • Namespace 可以用来区分不同的环境,例如开发、测试和生产。每个环境可以有自己的配置和资源,从而简化管理流程。
  1. 资源配额
  • 可以为每个 Namespace 设置资源配额,限制 CPU、内存等资源的使用。这有助于防止某个 Namespace 消耗过多资源,影响其他 Namespace 的正常运行。

默认 Namespace

Kubernetes 集群中默认存在几个 Namespace:

  • default:默认 Namespace,所有没有指定 Namespace 的资源都会被创建在这个 Namespace 中。
  • kube-system:用于存放 Kubernetes 系统组件的 Namespace,例如调度器、API 服务器和 DNS 服务等。
  • kube-public:用于存放所有用户可访问的资源,主要用于公开的配置信息,例如公共服务的 DNS 配置。
  • kube-node-lease:用于存放节点租约信息,帮助 Kubernetes 管理节点的心跳,以确保节点的可用性。

创建和管理 Namespace

创建 Namespace

可以使用以下命令创建一个新的 Namespace:

kubectl create namespace my-namespace

这个命令将创建一个名为 my-namespace 的新 Namespace。

查看 Namespace

要查看当前集群中的所有 Namespace,可以使用:

kubectl get namespaces

此命令将列出所有可用的 Namespace。

删除 Namespace

要删除一个 Namespace(及其包含的所有资源),可以使用以下命令:

kubectl delete namespace my-namespace

请注意,删除 Namespace 会删除该 Namespace 中的所有资源,因此需要谨慎操作。

在 Namespace 中工作

在 Kubernetes 中,可以通过指定 Namespace 来创建和管理资源。例如,创建 Deployment 时,可以指定 Namespace:

kubectl create deployment my-deployment --image=nginx --namespace=my-namespace

要在特定 Namespace 中查看资源,可以使用:

kubectl get pods --namespace=my-namespace

如果不指定 Namespace,默认情况下会在 default Namespace 中执行命令。

Namespace 的应用场景

  1. 多租户环境
  • 在一个 Kubernetes 集群中支持多个团队或应用,每个团队使用独立的 Namespace。这样可以确保各团队的开发、测试和生产环境互不干扰。
  1. 环境隔离
  • 使用不同的 Namespace 来隔离开发、测试和生产环境,便于管理和监控。例如,可以为开发环境创建 dev Namespace,为生产环境创建 prod Namespace。
  1. 权限管理
  • 通过为不同 Namespace 设置不同的访问权限,实现细粒度的安全控制。例如,可以允许某些用户在 dev Namespace 中创建和修改资源,但禁止他们在 prod Namespace 中进行任何操作。

Namespace 和 RBAC

使用 Kubernetes 的 RBAC 功能,可以为不同 Namespace 设置不同的访问权限。RBAC 允许通过角色(Role)和角色绑定(RoleBinding)来控制用户在特定 Namespace 中的操作权限。

示例:创建角色和角色绑定
  1. 创建角色:以下 YAML 定义了一个角色,允许在 my-namespace 中获取和列出 Pods。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: my-namespace
  name: my-role
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list"]

使用以下命令创建角色:

kubectl apply -f my-role.yaml
  1. 创建角色绑定:将角色绑定到用户 my-user
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-role-binding
  namespace: my-namespace
subjects:
  - kind: User
    name: my-user
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: my-role
  apiGroup: rbac.authorization.k8s.io

使用以下命令创建角色绑定:

kubectl apply -f my-role-binding.yaml

高级用法

自定义 Namespace

用户可以根据需要创建自定义的 Namespace,以满足特定的业务需求。可以使用标签和注释为 Namespace 添加额外的信息,帮助管理和分类。

手动创建 Namespace 示例
apiVersion: v1
kind: Namespace
metadata:
  name: custom-namespace
  labels:
    purpose: demo
Namespace 的监控

使用监控工具(如 Prometheus 和 Grafana),可以监控各个 Namespace 的资源使用情况。这有助于及时发现问题,例如某个 Namespace 中的资源使用过高,导致其他 Namespace 性能下降。

总结

Kubernetes Namespace 是实现资源隔离和访问控制的重要机制,适合于多租户和多环境的场景。通过 Namespace,用户可以在同一集群中管理多个环境和团队,避免资源冲突,简化管理。同时,结合 RBAC,Namespace 提供了灵活的权限管理能力。合理利用 Namespace,可以提高 Kubernetes 集群的安全性、可用性和管理效率,使其在复杂的企业环境中发挥更大的作用。