Kubernetes ReplicaSet失败,错误为:spec.template.metadata.labels

Kubernetes ReplicaSet失败,错误为:spec.template.metadata.labels,kubernetes,Kubernetes,为了我的学习目的,我正在尝试对replicaSet做一些研究。我成功地用matchLabels创建了一个复制集。为了测试matchExpression选择器,我首先创建了一个pod,然后创建了一个新的副本集,以测试副本集是否能够检查正在运行的pod中的标签。但这失败了。以下是我到目前为止所做的 首先创建一个带有特定标签的吊舱。Pod运行成功 创建具有匹配表达式的复制集,该表达式的值与pod中指定的标签相匹配 在第二步之后,我得到了一个错误。下面是YAML文件和错误。 你能帮我理解这里的问题吗 这

为了我的学习目的,我正在尝试对replicaSet做一些研究。我成功地用matchLabels创建了一个复制集。为了测试matchExpression选择器,我首先创建了一个pod,然后创建了一个新的副本集,以测试副本集是否能够检查正在运行的pod中的标签。但这失败了。以下是我到目前为止所做的

  • 首先创建一个带有特定标签的吊舱。Pod运行成功
  • 创建具有匹配表达式的复制集,该表达式的值与pod中指定的标签相匹配
  • 在第二步之后,我得到了一个错误。下面是YAML文件和错误。 你能帮我理解这里的问题吗

    这是pod-definition.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-app
      labels:
        tier: frontend1
    
    spec:
      containers:
      - name: nginx-c
        image: nginx
    
    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
    
    这是replicset-definition.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-app
      labels:
        tier: frontend1
    
    spec:
      containers:
      - name: nginx-c
        image: nginx
    
    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

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-app
      labels:
        tier: frontend1
    
    spec:
      containers:
      - name: nginx-c
        image: nginx
    
    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
    
    ReplicaSet“ReplicaSet-2”无效: spec.template.metadata.labels:无效值: 映射[字符串]字符串{“层”:“nginx”}:
    选择器
    与模板不匹配
    标签


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

    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
    

    要使用
    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,以满足
    副本
    字段中定义的要求

    谢谢,迪内什。我只是编辑了我的问题,以便更清楚我的要求。我想检查replicaSet是否能够匹配template部分中未定义的正在运行的POD的表达式。在kubernetes文档中,明确提到replicaSet中,.spec.template.metadata.labels必须匹配spec.selector,否则它将被API拒绝。您可以将
    nginx
    添加到
    值:
    字段中,这样pod将落入RS控制。这就是您试图实现的目标吗?谢谢@KFC_uu,现在可以了,因此matchExpressions或matchLabels需要至少一个与模板下定义的标签匹配的条件才能创建复制集。我将
    matchExpressions
    更改为
    {key:tier,operator:In,values:[frontend1,nginx]}