ReplicaSet因无效而失败:spec.template.metadata.labels

时间:2020-02-12 08:55:59

标签: kubernetes

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

  1. 首先使用特定标签创建了一个广告连播。 Pod成功运行。
  2. 使用matchExpressions创建一个副本集,将其值与容器中指定的标签相匹配。

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

这是pod-definition.yaml

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

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

这是副本集-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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

要使用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,并仅再创建一个Pod来满足replicas字段中定义的要求。