什么是 Kubernetes Namespace?
Namespace 是将集群组织成虚拟子集群的一种方式,当不同的团队或项目共享一个 Kubernetes 集群时,它们会很有帮助。集群中支持任意数量的 Namespace,每个 Namespace 在逻辑上彼此隔离,但能够相互通信。Namespace 不能相互嵌套。
Kubernetes 中存在的任何资源都存在于默认 Namespace 或由集群运维人员创建的 Namespace 中。只有节点和持久性存储卷存在于 Namespace 之外;这些低级别资源始终对集群中的每个 Namespace 可见。

Kubernetes 使用现状

启动 Kubernetes 并正常运行
Kubernetes 中的“default”Namespace 是什么?
Kubernetes 附带三个即时可用的 Namespace。它们分别是:
- default:顾名思义,这是每个 Kubernetes 命令默认引用的 Namespace,也是默认情况下每个 Kubernetes 资源所在的位置。在创建新的 Namespace 之前,整个集群都驻留在“default”中。
- kube-system:用于 Kubernetes 组件,应避免使用。
- kube-public:用于公共资源。不建议用户使用。
为何使用 Kubernetes Namespace?
Kubernetes Namespace 有许多应用场景,包括:
- 允许团队或项目位于其自身的虚拟集群中,而不必担心会影响彼此的工作。
- 通过将用户和流程限制在特定 Namespace 中来增强基于角色的访问控制 (RBAC)。
- 支持通过资源配额在多个团队和用户之间划分集群资源。
- 提供一种简单方法来分离容器化应用的开发、测试和部署,使整个生命周期能够在同一集群上进行。
何时应使用多个 Kubernetes Namespace?
小型团队或小型企业可能会完全满足于使用默认 Namespace。如果不需要将开发人员或用户彼此隔离,这种情况尤其合适。但是,拥有多个 Namespace 有很多好处,包括:
- 隔离。大型或不断发展的团队可以使用 Namespace 将项目和微服务相互隔离。团队可以在不同的工作空间中重复使用相同的资源名称,而且不会有任何问题。此外,对一个工作空间中的项目执行操作永远不会影响其他工作空间。
- 企业。使用单个集群进行开发、测试和生产的企业可以使用 Namespace 来对开发和测试环境进行沙箱处理。这可确保在整个应用生命周期中,开发人员或测试人员在自己的 Namespace 中所做的更改不会影响生产代码。
- 权限。Namespace 支持使用 Kubernetes RBAC,因此团队可以定义将权限或能力列表分组到单个名称下的角色。这可以确保只有授权用户才能访问给定 Namespace 中的资源。
- 资源控制。通过定义 CPU 或内存利用率的资源配额,可以对 Namespace 设置策略驱动的资源限制。这可以确保每个项目或 Namespace 都拥有运行所需的资源,并且没有一个 Namespace 会占用所有可用资源。
- 性能。使用 Namespace 有助于提高给定集群的性能。如果一个集群针对不同的项目划分为多个 Namespace,Kubernetes API 在执行操作时需要搜索的项目将会减少。这可以减少延迟并提高集群上运行的每个应用的整体性能。
Pod 如何跨 Kubernetes Namespace 进行通信?
尽管 Namespace 彼此分离,但它们可以轻松地相互通信。Kubernetes DNS 服务目录支持使用扩展形式的 DNS 寻址,按名称轻松找到任何服务:
..svc.cluster.local
只需将 Namespace 名称添加到服务名称中,即可访问集群上任何 Namespace 中的服务。例如,要访问开发 Namespace 中的工资单服务,您可以使用以下地址:
payroll.development
要访问生产 Namespace 中的工资单服务,您可以使用:
payroll.production
请注意,可以选择利用网络策略来控制 Namespace 之间的访问。例如,网络策略可以允许或拒绝来自其他 Namespace 的所有流量。网络策略仅适用于连接,不能替代执行数据包检查的防火墙。
与 Namespace 相关的基本 kubectl 命令有哪些?
查找当前 Kubernetes Namespace 的命令是什么?
集群中的所有 Namespace 都可以使用以下命令显示:
kubectl get namespace
这将返回集群中所有 Namespace 的列表,包括默认 Namespace,以及它们的状态和使用年限。
创建新的 Kubernetes Namespace 的命令是什么?
只需使用以下命令即可创建 Namespace:
kubectl create namespace
与任何其他 Kubernetes 资源一样,也可以创建并应用 YAML 文件来创建 Namespace:
newspace.yaml:
kind: Namespace
apiVersion: v1
metadata:
name: newspace
labels:
name: newspacekubectl apply -f newspace.yaml
如何在 Kubernetes Namespace 之间切换?
要在创建 Namespace 后对其进行寻址,操作必须在命令中包含 –namepsace= 选项。由于这可能会变得很麻烦,可以使用 kubectl config 命令在集群上下文中设置 Namespace 来更改默认 Namespace。
例如,要从默认 Namespace 更改为名为“testing”的 Namespace,需要输入:
kubectl config set-context --current --namespace=testing
这将针对未来所有的 kubectl 命令将默认 Namespace 更改为“testing”。
如何重命名 Kubernetes Namespace?
重命名 Kubernetes Namespace 并非常规做法,因此请谨慎选择 Namespace(默认 Namespace 之外)。
如何删除 Kubernetes Namespace?
可使用以下命令删除 Namespace:
kubectl delete namespaces
由于删除是一个异步活动,因此在删除 Namespace 之前,它将显示为“terminating”。
关于删除 Kubernetes Namespace 的警告
删除 Namespace 是一个最终行为。Namespace 中的所有内容(包括所有服务、正在运行的 Pod 和工件)都将被删除。垃圾收集将在该 Namespace 中存在的任何内容上运行。在执行此操作之前,请确保 Namespace 中的所有内容均是应删除的。
相关解决方案和产品
实验:应用现代化
在几周内将您的应用迁移到云中。
Tanzu Kubernetes for Operation
现代多云容器基础架构的基础。
Tanzu Application Platform
在 Kubernetes 中为多云开发人员提供卓越的体验。