我知道服务使用选择器来确定哪些 Pod 通过它们的标签将流量路由到。
apiVersion: v1
kind: Service
metadata:
name: svc
spec:
ports:
- name: tcp
protocol: TCP
port: 443
targetPort: 443
selector:
app: nginx
Run Code Online (Sandbox Code Playgroud)
这一切都很好。
现在这个选择器和spec.selector
来自部署的选择器有什么区别。我知道使用它是为了使部署可以匹配和管理其 pod。
但是我不明白为什么我需要额外的matchLabels
声明并且不能像在服务中那样做。这在语义上有什么用?
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
Run Code Online (Sandbox Code Playgroud)
提前致谢
ton*_*ton 10
为什么我需要额外的 matchLabels 声明并且不能像在服务中那样做。这在语义上有什么用?
因为service
规范仅支持基于相等的选择器,并且是支持两种语法(基于相等和基于集合deployment
)的较新资源。
该 API 目前支持两种类型的选择器:基于相等的选择器和基于集合的选择器。标签选择器可以由多个以逗号分隔的要求组成。如果有多个要求,则必须满足所有要求,因此逗号分隔符充当逻辑 AND (&&) 运算符。 参考
该Service
规范仅使用“基于相等”的标签选择器语法。
较新的资源,例如 Job、
Deployment
、ReplicaSet
、 和DaemonSet
,支持基于集的需求... 参考
我的理解是,早期唯一支持的语法是基于相等的语法,就像我们在规范中所采用的那样service
,而现在,当您使用的资源支持新语法时,您需要使用matchLabels
or matchExpressions
。
小智 9
就这么简单 - 在服务中,spec.selector
您可以仅通过标签来确定要将流量路由到哪些 pod。
在另一方面,在Deployment
spec.selector
你有两个选择来决定哪个节点舱将被安排在,它们是:matchExpressions
,matchLabels
。
如果它回答了您的问题,请告诉我:)
当 aDeployment
更改时,ReplicaSet
会创建一个新的。该ReplicaSet
负责管理豆荚。它使用spec.selector
来了解它应该管理哪些 Pod。
例子:
如果replicas: 1
更改Deployment
为例如创建replicas: 2
一个新ReplicaSet
的,它会观察Pod 使用spec.selector
匹配标签匹配 Pod。它只能看到1个副本开始,但现在它的理想状态是replicas: 2
因此它是负责从创建另外一个吊舱template
中Deployment
。
有两种方法来声明labels
下spec.selector
的`部署。
有关替代方案的kubectl explain deployment.spec.selector
完整说明,请参阅spec.selector
。
标签和选择器是 Kubernetes 中的一个通用概念,在多个地方使用。另一个示例是如何过滤要查看或使用的资源kubectl
。例如,您可以使用以下命令为应用程序选择 Pod:
kubectl get pod -l=app=myappname
Run Code Online (Sandbox Code Playgroud)
(如果您的 Pod 标有app: myappname
.
归档时间: |
|
查看次数: |
2266 次 |
最近记录: |