【问题标题】:ReplicaSet fails with invalid: spec.template.metadata.labelsReplicaSet 因无效而失败:spec.template.metadata.labels
【发布时间】:2020-05-27 18:46:40
【问题描述】:

出于学习目的,我正在尝试对副本集进行一些研究。我能够使用 matchLabels 成功创建一个副本集。为了测试 matchExpression 选择器,我首先创建了一个 pod,然后创建了一个新的副本集来测试副本集是否能够检查正在运行的 pod 中的标签。但这因错误而失败。这是我到目前为止所做的。

  1. 首先创建了一个带有特定标签的 pod。 Pod 运行成功。
  2. 创建一个具有 matchExpressions 的副本集,该值与 pod 中指定的标签匹配。

在第二步之后我得到了错误。以下是 YAML 文件和错误。 你能帮我理解这里的问题吗?

这里是 pod-definition.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-app
  labels:
    tier: frontend1

spec:
  containers:
  - name: nginx-c
    image: nginx

这里是replicaset-definition.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-2
spec:
  replicas: 2
  selector:
    matchExpressions:
      - {key: tier, operator: In, values: [frontend1]}
  template:
    metadata:
      labels:
        tier: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

创建副本集时出错:

master $ kubectl create -f /root/replicaset-definition.yaml

ReplicaSet“replicaset-2”无效: spec.template.metadata.labels:无效值: map[string]string{"tier":"nginx"}: selector 不匹配模板 labels

【问题讨论】:

  • 您可以将nginx 添加到您的values: 字段中,这样吊舱将落入RS 控制。这是你试图达到的目标吗?
  • 感谢@KFC_ 现在可以使用,因此 matchExpressions 或 matchLabels 需要至少一个与模板下定义的标签匹配的条件才能创建副本集。我将matchExpressions 更改为{key: tier, operator: In, values: [frontend1, nginx]}

标签: kubernetes


【解决方案1】:

您可以通过更改模板部分中的标签来尝试以下操作吗?

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-2
spec:
  replicas: 2
  selector:
    matchExpressions:
      - {key: tier, operator: In, values: [frontend1]}
  template:
    metadata:
      labels:
        tier: frontend1
    spec:
      containers:
      - name: nginx
        image: nginx

【讨论】:

  • 谢谢迪内什。我刚刚编辑了我的问题,以更清楚地说明我的要求。我想检查 replicaSet 是否能够匹配模板部分中未定义的正在运行的 pod 的表达式。
  • 在 kubernetes 文档中,明确提到在 ReplicaSet 中,.spec.template.metadata.labels 必须匹配 spec.selector,否则会被 API 拒绝。 kubernetes.io/docs/concepts/workloads/controllers/replicaset
【解决方案2】:

要使用matchExpressions 使 pod 落入新创建的 ReplicaSet 的范围内,您必须在 RS 中使用与已创建的 pod 中定义的标签相同的标签,或者您必须在表达式中添加额外的标签,使其如下所示:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-2
spec:
  replicas: 2
  selector:
    matchExpressions:
    - key: tier
      operator: In
      values:
      - frontend1
      - nginx
  template:
    metadata:
      labels:
        tier: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

这样,RS 将把已经存在的 pod 识别为它自己的,并且只创建一个更多的 pod 来满足replicas 字段中定义的要求。

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 2017-03-25
    • 2014-12-31
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2018-09-12
    • 2019-02-23
    相关资源
    最近更新 更多