我正在查看一些较旧的 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 :(得分:2)
TL;博士;
您指的是两个完全不同的 Kubernetes 对象,它们是 Namespace 和 Labels/Selectors
Kubernetes 支持由同一个物理集群支持的多个虚拟集群。这些虚拟集群称为命名空间。
为什么要使用 Kubernetes 命名空间? What is a Kubernetes Namespace? 文章中详细描述了此问题的答案。
<块引用>简而言之,命名空间允许您分隔对象。除了 default
,还有一些 namespaces
,比如 kube-system
,它是由 Kubernetes 系统创建的。在该 namespace
中,您有 kube-dns
或 kube-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: prod
、app: nginx
的 Pod 和 2 个标签为 env: dev
和 app: 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
production
和 staging
很相似:environment: staging
和 environment: production
。
这是两个不同的对象 - Namespace
是某种虚拟集群,可帮助我们组织项目或环境。 Labels
是分配给 Kubernetes 资源(如 Pod、部署等)的键值对。
我想使用 environment 的一个好处是您可以将所有内容都放在默认命名空间中,同时保持 Pod 分离?
在某些情况下是的,但对于每个命令,您都需要指定 label
。
如果您要列出所有 namespaces
中的资源,您可以使用 --all-namespaces
例如,$ kubectl get po --all-namespaces
或标志 -A
像 $ kubectl get po -A
其他链接
如果您还有其他问题,请告诉我。