代码之家  ›  专栏  ›  技术社区  ›  strumpy_strudel

部署.yaml中的环境与命名空间

  •  0
  • strumpy_strudel  · 技术社区  · 4 年前

    我在看一些更老的 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 
    

    这个 production staging 相似: environment: staging environment: production .

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

    但不会使用 namespace: development , namespace: staging ,以及 namespace: production 也完成了同样的事情?是否有一个用例可以使用一个而不是另一个?

    我想使用的一个好处是 environment 你可以把所有东西都放进去吗 default 命名空间,同时保持Pod分离?

    0 回复  |  直到 4 年前
        1
  •  2
  •   PjoterS    4 年前

    TL;博士;

    你指的是两个完全不同的Kubernetes对象,它们是 Namespace Labels/Selectors

    命名空间

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

    为什么使用Kubernetes命名空间?这个问题的答案在 What is a Kubernetes Namespace? 文章。

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

    简而言之,名称空间允许您分隔对象。旁边 default 你有几个 namespaces 喜欢 kube-system 它是由Kubernetes系统创建的。在这方面 namespace 你有像这样的系统Pod kube-dns kube-proxy 它们负责网络配置。

    另一个例子是,许多 Helm Charts 被配置为在不同的环境中部署对象 namesapce 违约 .

    一些资源是 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
    ...
    

    如果您没有指定 命名空间 ,Kubernetes将使用 违约 在所有情况下都使用名称空间(创建、删除、获取等)。

    您可以配置 Quota 在里面 命名空间 限制数量或吊舱、服务等。

    $ 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
    

    使用案例

    • 何时删除 命名空间 ,您将删除该特定对象中的所有对象 命名空间 .
    • 如果你有你所有的 pods 在一个 命名空间 ,命令式 $ kubectl delete pod --all 将移除所有吊舱。如果你将它们分开 命名空间 ,它将删除所有 豆荚 从一个特定 命名空间 .

    标签/选择器

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

    Labels / Selectors 通常用于连接 Application with Services 部署和服务是一样的 labels/selectors 他们是这样的 connected .

    使用案例

    您已经测试了一些特定的软件,并使用了2个带有标签的Pod env: prod , app: nginx 2个有标签 env: dev 应用程序:nginx 。现在,您可以删除具有特定值的Pod label .

    $ 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
    

    结论

    这个 production staging 相似: environment: staging environment: production .

    那是两个不同的物体- Namespace 它是一种虚拟集群,帮助我们组织项目或环境。 Labels 是一个键值对,分配给Kubernetes资源,如Pod、Deployment等。

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

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

    如果你列出所有资源 名称空间 你可以用 --all-namespaces 如, $ kubectl get po --all-namespaces 或旗帜 -A 喜欢 $ kubectl get po -A

    其他链接

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

    推荐文章