gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:05:19 25 4
gpt4 key购买 nike

我在看一些更老的 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: development , namespace: staging , 和 namespace: production也完成同样的事情?是否有一个用例可以使用另一个?
我想使用 environment 的一个好处是你可以把所有的东西都放在 default里吗?命名空间同时保持 Pod 分离?

最佳答案

TL;博士;
您指的是两个完全不同的 Kubernetes 对象,它们是 NamespaceLabels/Selectors
命名空间

Kubernetes supports multiple virtual clusters backed by the same physical cluster. These virtual clusters are called namespaces.


为什么要使用 Kubernetes 命名空间?这个问题的答案在 What is a Kubernetes Namespace? 中有很好的描述文章。
  • Allowing teams or projects to exist in their own virtual clusters without fear of impacting each other’s work.
  • Enhancing role-based access controls (RBAC) by limiting users and processes to certain namespaces.
  • Enabling the dividing of a cluster’s resources between multiple teams and users via resource quotas.
  • Providing an easy method of separating development, testing, and deployment of containerized applications enabling the entire lifecycle to take place on the same cluster.

简而言之,命名空间允许您分隔对象。旁边 default你有几个 namespaces喜欢 kube-system它是由 Kubernetes 系统创建的。在那 namespace你有像 kube-dns 这样的系统 pods 或 kube-proxy负责网络配置。
另一个例子是许多 Helm Charts配置为将对象部署在不同的 namesapcedefault .
部分资源是 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所有情况下的命名空间(创建、删除、获取等)。
您可以配置 Quotanamespace限制数量或 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 .

  • 标签/选择器

    Labels are key/value pairs that are attached to objects, such as pods. Labels are intended to be used to specify identifying attributes of objects that are meaningful and relevant to users, but do not directly imply semantics to the core system. Labels can be used to organize and to select subsets of objects.

    Labels / Selectors常用连接 Application with Services .部署和服务相同 labels/selectors这样他们就是 connected .
    用例
    您已经测试了一些特定的软件,并且您已经使用了 2 个带有标签的 pod env: prod , app: nginx和 2 个带标签的 env: devapp: nginx .现在您可以删除具有特定 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
    结论

    The production and staging are similar: environment: staging and environment: production.


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

    I guess one benefit of using environment is you can put everything in the default namespace while keeping Pods separated?


    在某些情况下是的,但是对于每个命令,您都需要指定 label .
    如果您要列出所有 namespaces 中的资源你可以使用 --all-namespaces例如, $ kubectl get po --all-namespaces或旗帜 -A喜欢 $ kubectl get po -A 附加链接
  • Namespaces Walkthrough
  • Share a Cluster with Namespaces
  • Kubernetes best practices: Organizing with Namespaces
  • Managing Resources

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

    关于kubernetes - deployment.yaml 中的环境与命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66246165/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com