本文已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
使用 Kubernetes 命名空间来管理环境
Kubernetes 提供的一个优势是可以比传统的部署策略更容易、更好地管理各种环境。对于大多数重要的应用程序,您都有测试、预演和生产环境。您可以使用相同的配置在预演和生产中启动一个单独的资源集群(例如虚拟机),但这可能成本高昂,并且管理环境之间的差异可能很困难。
Kubernetes 包括一个很酷的功能,称为[命名空间][4],它使您可以在同一集群中管理不同的环境。例如,您可以在同一台机器集群中拥有不同的测试和预演环境,从而可能节省资源。您还可以在同一集群中运行不同类型的服务器、批处理或其他作业,而无需担心它们会相互影响。
默认命名空间
在 Kubernetes 中指定命名空间是可选的,因为默认情况下 Kubernetes 使用“default”命名空间。如果您刚刚创建了一个集群,则可以使用以下命令检查默认命名空间是否存在
$ kubectl get namespaces
NAME LABELS STATUS
default Active
kube-system Active
在这里,您可以看到默认命名空间存在并且处于活动状态。命名空间的状态稍后在关闭和删除命名空间时使用。
创建新的命名空间
您可以像创建任何其他资源一样创建命名空间。创建一个 my-namespace.yaml 文件并添加以下内容
kind: Namespace
apiVersion: v1
metadata:
name: my-namespace
labels:
name: my-namespace
然后您可以运行此命令来创建它
$ kubectl create -f my-namespace.yaml
服务名称
使用命名空间,您的应用程序可以指向静态服务端点,这些端点不会根据环境而更改。例如,您的 MySQL 数据库服务在生产和预演中都可以命名为 mysql,即使它运行在同一基础设施上。
这是因为集群中的每个资源默认情况下只会“看到”同一命名空间中的其他资源。这意味着您可以通过创建具有相同名称的 pod、服务和复制控制器来避免命名冲突,前提是它们位于不同的命名空间中。在命名空间内,服务的简短 DNS 名称解析为该命名空间内服务的 IP。例如,您可能有一个可以通过 DNS 名称 elasticsearch 访问的 Elasticsearch 服务,只要访问它的容器位于同一命名空间中。
您仍然可以通过完整的 DNS 名称来查找其他命名空间中的服务,其形式为 SERVICE-NAME.NAMESPACE-NAME。例如,生产环境和 canary 环境分别为 elasticsearch.prod 或 elasticsearch.canary。
一个例子
让我们看一个示例应用程序。假设您想在 Kubernetes 中部署您的音乐商店服务 MyTunes。您可以在同一集群中运行应用程序生产和预演环境以及一些一次性应用程序。您可以通过运行一些命令来更好地了解正在发生的事情
~$ kubectl get namespaces
NAME LABELS STATUS
default Active
mytunes-prod Active
mytunes-staging Active
my-other-app Active
在这里您可以看到一些正在运行的命名空间。接下来,让我们列出预演中的服务
~$ kubectl get services --namespace=mytunes-staging
NAME LABELS SELECTOR IP(S) PORT(S)
mytunes name=mytunes,version=1 name=mytunes 10.43.250.14 80/TCP
104.185.824.125
mysql name=mysql name=mysql 10.43.250.63 3306/TCP
接下来检查生产
~$ kubectl get services --namespace=mytunes-prod
NAME LABELS SELECTOR IP(S) PORT(S)
mytunes name=mytunes,version=1 name=mytunes 10.43.241.145 80/TCP
104.199.132.213
mysql name=mysql name=mysql 10.43.245.77 3306/TCP
请注意,IP 地址因使用的命名空间而异,即使服务本身的名称相同。此功能使配置您的应用程序非常容易 — 因为您只需将您的应用程序指向服务名称 — 并且有可能使您在预演或测试环境中配置您的应用程序与在生产环境中完全相同。
注意事项
虽然您可以在同一集群中运行预演和生产环境,并通过这样做节省资源和资金,但您需要小心设置资源限制,以使您的预演环境不会使生产耗尽 CPU、内存或磁盘资源。正确设置资源限制并测试它们是否有效需要大量时间和精力,因此,除非您可以通过在与预演或测试相同的集群中运行生产来显着节省资金,否则您可能真的不想这样做。
无论您是否在同一集群中运行预演和生产,命名空间都是在同一集群中划分不同应用程序的好方法。命名空间也将作为您可以应用资源限制的级别,因此请在未来关注命名空间级别上的更多资源管理功能。