使用Kubernetes命名空间管理环境

Kubernetes提供的优势之一是能够比传统部署策略更轻松,更好地管理各种环境。对于大多数非常规应用程序,您具有测试,临时和生产环境。您可以在阶段和生产中使用相同的配置来启动单独的资源集群(例如VM),但这可能会导致成本高昂,并且很难管理环境之间的差异。
Kubernetes包含一个很酷的功能,叫做[namespaces] [4],它使您能够管理同一集群中的不同环境。例如,您可以在同一台计算机群集中拥有不同的测试和暂存环境,从而可能节省资源。您也可以在同一群集中运行不同类型的服务器,批处理或其他作业,而不必担心它们会相互影响。

默认命名空间

在Kubernetes中指定名称空间是可选的,因为默认情况下,Kubernetes使用“默认”名称空间。如果您刚刚创建了集群,则可以使用以下命令检查默认名称空间是否存在:

$ 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。因此,例如,您可能拥有一个Elasticsearch服务,只要访问它的容器位于同一名称空间中,就可以通过DNS名称弹性搜索来访问该服务。

您仍然可以通过完整的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,内存或磁盘资源的生产量不足。 。正确设置资源限制并测试它们是否正常工作需要花费大量时间和精力,因此除非您可以通过与暂存或测试在同一群集中运行生产来显着节省资金,否则您可能并不想这样做。

无论您是否在同一集群中运行暂存和生产,命名空间都是在同一集群中对不同应用程序进行分区的一种好方法。命名空间还将充当您可以应用资源限制的级别,因此将来会在命名空间级别上寻找更多的资源管理功能。

-由Google开发倡导者Ian Lewis发表