deployment.yaml 中的环境与命名空间

时间:2021-02-17 16:37:02

标签: kubernetes

我正在查看一些较旧的 deployment.yaml 文件,我对 environment: 的使用感到好奇。

这是上下文:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: client-deployment-dev
  # namespace: development        # wouldn't this accomplish the same thing?
spec:
  replicas: 1
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      component: client
      environment: development       #here
  template:
    metadata:
      labels:
        component: client
        environment: development      #here
    spec:
      containers:
        - name: client
          image: client
          ports:
            - containerPort: 3000
          env:
          - name: DOMAIN
            valueFrom:
              secretKeyRef:
                name: app-dev-secrets
                key: DOMAIN 

productionstaging 很相似:environment: stagingenvironment: production

这显然使环境保持分离并防止 kubectl apply -f ... 定位错误的环境(即意外地将开发配置应用于生产)。

但是使用 namespace: developmentnamespace: stagingnamespace: production 是否也能完成同样的事情?有一个用例可以使用另一个吗?

我想使用 environment 的一个好处是您可以将所有内容都放在 default 命名空间中,同时保持 Pod 分离?

1 个答案:

答案 0 :(得分:2)

TL;博士;

您指的是两个完全不同的 Kubernetes 对象,它们是 NamespaceLabels/Selectors

命名空间

<块引用>

Kubernetes 支持由同一个物理集群支持的多个虚拟集群。这些虚拟集群称为命名空间。

为什么要使用 Kubernetes 命名空间? What is a Kubernetes Namespace? 文章中详细描述了此问题的答案。

<块引用>
  • 允许团队或项目存在于自己的虚拟集群中,而不必担心影响彼此的工作。
  • 通过将用户和进程限制到某些命名空间来增强基于角色的访问控制 (RBAC)。
  • 通过资源配额在多个团队和用户之间分配集群资源。
  • 提供一种将容器化应用的开发、测试和部署分开的简单方法,使整个生命周期能够在同一个集群上进行。

简而言之,命名空间允许您分隔对象。除了 default,还有一些 namespaces,比如 kube-system,它是由 Kubernetes 系统创建的。在该 namespace 中,您有 kube-dnskube-proxy 之类的系统 Pod,它们负责网络配置。

另一个例子是,许多 Helm Charts 被配置为在与 namesapce 不同的 default 中部署对象。

有些资源是namespaced

$ kubectl api-resources
NAME                              SHORTNAMES   APIVERSION                        NAMESPACED   KIND
bindings                                       v1                                true         Binding
componentstatuses                 cs           v1                                false        ComponentStatus
configmaps                        cm           v1                                true         ConfigMap
endpoints                         ep           v1                                true         Endpoints
...

这意味着他们需要定义命名空间,否则你会发现找不到资源的错误。

$ kubectl get po
No resources found in default namespace.
$ kubectl get pod --namespace kube-system
NAME                                                        READY   STATUS    RESTARTS   AGE
event-exporter-gke-666b7ffbf7-kjcn2                         2/2     Running   0          2m42s
fluentbit-gke-njk6d                                         2/2     Running   0          2m30s
fluentbit-gke-wlwsp                                         2/2     Running   0          2m29s
...

如果您不指定 namespace,Kubernetes 将在所有情况下(创建、删除、获取等)使用 default 命名空间。

您可以在 Quota 中配置 namespace 以限制数量或 Pod、服务等。

$ kubectl describe namespaces
Name:         default
Labels:       <none>
Annotations:  <none>
Status:       Active

Resource Quotas
 Name:                       gke-resource-quotas
 Resource                    Used  Hard
 --------                    ---   ---
 count/ingresses.extensions  0     100
 count/jobs.batch            0     5k
 pods                        0     1500
 services                    1     500

用例

  • 当您移除 namespace 时,您将移除该特定 namespace 中的所有对象。
  • 如果您将所有的 pods 放在一个 namespace 中,像 $ kubectl delete pod --all 这样的命令将删除所有 pod。如果您用 namespace 将它们分开,则会从一个特定的 pods 中删除所有 namespace

标签/选择器

<块引用>

标签是附加到对象(例如 pod)上的键/值对。标签旨在用于指定对用户有意义和相关的对象的标识属性,但不直接暗示核心系统的语义。标签可用于组织和选择对象的子集。

Labels / Selectors 通常用于连接 Application with Services。部署和服务具有相同的 labels/selectors,因此它们是 connected

用例

您已经测试了一些特定的软件,并使用了 2 个标签为 env: prodapp: nginx 的 Pod 和 2 个标签为 env: devapp: nginx 的 Pod。现在您可以删除带有特定 label 的 Pod。

$ kubectl get po --show-labels
NAME     READY   STATUS    RESTARTS   AGE   LABELS
dev-1    1/1     Running   0          8s    app=nginx,env=dev
dev-2    1/1     Running   0          14s   app=nginx,env=dev
pord-1   1/1     Running   0          64s   app=nginx,env=prod
pord-2   1/1     Running   0          26s   app=nginx,env=prod
$ kubectl delete po -l env=prod
pod "pord-1" deleted
pod "pord-2" deleted
$ kubectl get po --show-labels
NAME    READY   STATUS    RESTARTS   AGE   LABELS
dev-1   1/1     Running   0          70s   app=nginx,env=dev
dev-2   1/1     Running   0          76s   app=nginx,env=dev

结论

<块引用>

productionstaging 很相似:environment: stagingenvironment: production

这是两个不同的对象 - Namespace 是某种虚拟集群,可帮助我们组织项目或环境。 Labels 是分配给 Kubernetes 资源(如 Pod、部署等)的键值对。

<块引用>

我想使用 environment 的一个好处是您可以将所有内容都放在默认命名空间中,同时保持 Pod 分离?

在某些情况下是的,但对于每个命令,您都需要指定 label

如果您要列出所有 namespaces 中的资源,您可以使用 --all-namespaces 例如,$ kubectl get po --all-namespaces 或标志 -A$ kubectl get po -A

其他链接

如果您还有其他问题,请告诉我。