服务选择器与部署选择器匹配标签

Tob*_*ias 8 kubernetes

我知道服务使用选择器来确定哪些 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、DeploymentReplicaSet、 和DaemonSet,支持基于集的需求... 参考

我的理解是,早期唯一支持的语法是基于相等的语法,就像我们在规范中所采用的那样service,而现在,当您使用的资源支持新语法时,您需要使用matchLabelsor matchExpressions


小智 9

就这么简单 - 在服务中,spec.selector您可以仅通过标签来确定要将流量路由到哪些 pod。

在另一方面,在Deployment spec.selector你有两个选择来决定哪个节点舱将被安排在,它们是:matchExpressionsmatchLabels

如果它回答了您的问题,请告诉我:)

  • 我认为这没有意义...我的部署中未在节点中定义“spec.selector”,并且无论如何都会安排服务...在“spec.template”部署中有一个针对节点选择器的特定配置.spec.nodeSelector` (2认同)

Jon*_*nas 5

Deployment 如何使用 spec.selector

当 aDeployment更改时,ReplicaSet会创建一个新的。该ReplicaSet负责管理豆荚。它使用spec.selector来了解它应该管理哪些 Pod。

例子:

如果replicas: 1更改Deployment为例如创建replicas: 2一个新ReplicaSet的,它会观察Pod 使用spec.selector匹配标签匹配 Pod。它只能看到1个副本开始,但现在它的理想状态是replicas: 2因此它是负责从创建另外一个吊舱templateDeployment

选择器语法

有两种方法来声明labelsspec.selector的`部署。

  • matchLabels - 您声明标签
  • matchExpressions - 你为标签写一个表达式

有关替代方案的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.

  • 这根本没有回答我的问题 (2认同)