命名空间是一种将集群组织成虚拟子集群的方法——当不同的团队或项目共享一个 Kubernetes 集群时,它们会很有帮助。集群内支持任意数量的命名空间,每个命名空间在逻辑上彼此分离,但能够相互通信。命名空间不能相互嵌套。Kubernetes 中存在的任何资源都存在于默认命名空间或集群操作员创建的命名空间中。只有节点和持久存储卷存在于命名空间之外;这些低级资源对集群中的每个命名空间始终可见。
Kubernetes 中的“默认”命名空间是什么?
Kubernetes 提供了三个开箱即用的命名空间。他们是:
- default:顾名思义,这是每个 Kubernetes 命令默认引用的命名空间,也是每个 Kubernetes 资源默认所在的位置。在创建新的命名空间之前,整个集群都处于“默认”状态。
- kube-system:用于 Kubernetes 组件 ,应避免使用。
- kube-public: 用于公共资源。不推荐用户使用。
为什么使用 Kubernetes 命名空间?
Kubernetes 命名空间有很多用例,包括:
- 允许团队或项目存在于自己的虚拟集群中,而不必担心影响彼此的工作。
- 通过将用户和进程限制到某些命名空间来增强基于角色的访问控制 (RBAC)。
- 通过资源配额实现集群资源在多个团队和用户之间的划分。
- 提供一种分离容器化应用程序的开发、测试和部署的简单方法,使整个生命周期能够在同一个集群上进行。
什么时候应该使用多个 Kubernetes 命名空间?
小型团队或小型组织可能会完全满足使用默认命名空间。如果不需要将开发人员或用户彼此隔离,这一点尤其重要。但是,拥有多个命名空间有许多有用的好处,包括:
- 隔离。 大型或成长中的团队可以使用命名空间将他们的项目和微服务相互隔离。团队可以毫无问题地在不同的工作区中重复使用相同的资源名称。此外,对一个工作区中的项目执行操作永远不会影响其他工作区。
- 组织。 使用单个集群进行开发、测试和生产的组织可以使用命名空间来沙箱开发和测试环境。这可确保生产代码不受开发人员或测试人员在整个应用程序生命周期中在他们自己的命名空间中所做的更改的影响。
- 权限。 命名空间支持使用 Kubernetes RBAC,因此团队可以定义角色,将权限或能力列表分组到一个名称下。这可以确保只有授权用户才能访问给定命名空间中的资源。
- 资源控制。 通过定义 CPU 或内存利用率的资源配额,可以在命名空间上设置策略驱动的资源限制。这可以确保每个项目或命名空间都有运行所需的资源,并且没有一个命名空间占用所有可用资源。
- 表现。 使用命名空间有助于提高给定集群的性能。如果一个集群被划分为不同项目的多个命名空间,Kubernetes API 在执行操作时将有更少的项目来搜索。这可以减少延迟并加快集群上运行的每个应用程序的整体应用程序性能。
Pod 如何跨 Kubernetes 命名空间进行通信?
尽管命名空间彼此分离,但它们可以轻松地相互通信。通过使用 DNS 寻址的扩展形式,Kubernetes DNS 服务目录可以通过名称轻松定位任何服务:
..svc.cluster.local
只需将命名空间名称添加到服务名称即可访问集群上任何命名空间中的服务。例如,要访问 development 命名空间中的工资单服务,您将使用地址
payroll.development
要访问生产命名空间中的工资单服务,您将使用:
payroll.production
请注意,可以选择使用网络策略来控制命名空间之间的访问。例如,网络策略可以允许或拒绝来自其他命名空间的所有流量。网络策略仅适用于连接,不能替代执行数据包检查的防火墙。
与命名空间相关的基本 kubectl 命令有哪些?
查找当前 Kubernetes 命名空间的命令是什么?
可以使用命令显示集群中的所有命名空间:
kubectl get namespace
这将返回集群中所有命名空间的列表,包括默认命名空间,以及它们的状态和年龄。
创建新的 Kubernetes 命名空间的命令是什么?
命名空间只需使用以下命令创建:
kubectl create namespace
与任何其他 Kubernetes 资源一样,也可以创建 YAML 文件并将其应用于创建命名空间:
newspace.yaml:
种类:命名空间
apiVersion:v1
元数据:
名称:新空间
标签:
名称:newspacekubectl apply -f newspace.yaml
如何在 Kubernetes 命名空间之间切换?
要在创建命名空间后对其进行寻址,操作必须在命令中包含 –namepsace= 选项。由于这会变得很麻烦,因此可以通过使用 kubectl config 命令在集群上下文中设置命名空间来更改默认命名空间。
例如,要将默认命名空间更改为名为“testing”的命名空间,您需要输入:
kubectl config set-context --current --namespace=testing
这会将默认命名空间设置为“testing”,以供将来所有 kubectl 命令使用。
如何重命名 Kubernetes 命名空间?
重命名 Kubernetes 命名空间不是标准做法,因此请谨慎选择命名空间(默认值之外)。
如何删除 Kubernetes 命名空间?
使用以下命令删除命名空间:
kubectl delete namespaces
由于删除是异步活动,因此命名空间将显示为“终止”,直到命名空间被删除。
关于删除 Kubernetes 命名空间的警告
删除命名空间是最后的动作。命名空间中的所有内容,包括所有服务、正在运行的 pod 和工件都将被删除。垃圾收集将在该命名空间中存在的任何东西上运行。在执行此操作之前,请确保应删除命名空间中的所有内容。