【问题标题】:Kubernetes Deployment file error: Found invalid field selector for v1.PodSpecKubernetes 部署文件错误:发现 v1.PodSpec 的字段选择器无效
【发布时间】:2018-02-21 03:30:00
【问题描述】:

我在尝试使用 YAML 文件创建部署时收到无效字段选择器错误。错误是error validating data: found invalid field selector for v1.PodSpec,我的文件如下所示。

apiVersion: apps/v1beta1
kind: Deployment
metadata:
 name: zalenium-deployment
spec:
 replicas: 1
 template:
  metadata:
   labels:
    app: zalenium
  spec:
   serviceAccountName: zalenium
   serviceAccount: zalenium
   selector:
    app: zalenium
    role: grid
   containers:
    - name: zalenium-pod
      image: dosel/zalenium
      ports:
      - containerPort: 4444
        protocol: TCP
      volumeMounts:
      - name: zalenium-shared
        mountPath: /tmp/mounted
      - name: zalenium-videos
        mountPath: /home/seluser/videos
      resources:
       requests:
        memory: "250m"
        cpu: "500m"
       limits:
        memory: "1Gi"
   volumes:
   - name: zalenium-shared
     persistentVolumeClaim:
      claimName: zalenium-shared-claim
   - name: zalenium-videos
     persistentVolumeClaim:
      claimName: zalenium-videos-claim

我尝试使用在线 YAML 文件验证器,但它们似乎没有显示格式有任何问题。当我尝试使用 validate=false 标志创建上面的部署时,部署会运行,但随后 pod 会不断崩溃并重新启动 (crashLoopBackOff)。我应该调查什么?我仍然熟悉 k8s,但从错误中我认为它与我部署中的容器规范有关。关于解决这个问题的任何提示?谢谢!

【问题讨论】:

    标签: docker kubernetes yaml selenium-grid kubectl


    【解决方案1】:

    由于错误消息指出选择器是 v1.PodSpecinvalid field - 因此该字段在 .spec.template.spec.selector 处无效。我认为您正在寻找的是.spec.selector

    话虽如此,文档指出:

    如果指定,.spec.selector 必须匹配 .spec.template.metadata.labels,否则会被 API 拒绝。

    因此,您还必须将role: grid 添加到您的元数据标签中(.spec.template.metadata.labels)。你的 .yaml 文件看起来像这样:

    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
     name: zalenium-deployment
    spec:
     selector:
      matchLabels:
       app: zalenium
       role: grid
     replicas: 1
     template:
      metadata:
       labels:
        app: zalenium
        role: grid
      spec:
       serviceAccountName: zalenium
       serviceAccount: zalenium
       containers:
        - name: zalenium-pod
          image: dosel/zalenium
          ports:
          - containerPort: 4444
            protocol: TCP
          volumeMounts:
          - name: zalenium-shared
            mountPath: /tmp/mounted
          - name: zalenium-videos
            mountPath: /home/seluser/videos
          resources:
           requests:
            memory: "250m"
            cpu: "500m"
           limits:
            memory: "1Gi"
       volumes:
       - name: zalenium-shared
         persistentVolumeClaim:
          claimName: zalenium-shared-claim
       - name: zalenium-videos
         persistentVolumeClaim:
          claimName: zalenium-videos-claim
    

    【讨论】:

    • 谢谢!我不知道这个要求,但是即使在添加标签字段之后,也会输出相同的错误
    • 您是否也更改了.spec.selector.matchLabels 字段?这与您的选择器字段不同。 (对我来说 k8s 1.7.3 答案中的 .yaml 文件有效)
    • 谢谢!它现在可以工作了,我最初没有添加 matchLabels 字段。你说得对,我想将选择器用于实际的部署/集线器,而不是它创建的 pod。 matchLabel 是我们为所有 Deployment 对象而不是选择器做的事情,还是仅在这种特定情况下在这里使用?另外,当我尝试将选择器添加到部署创建的每个 pod 时,我会怎么做?再次感谢您的帮助!
    • .spec.selector 是可选的。部署不一定需要它。事实上,如果您在不同的 Deployment 中不小心使用了相同的选择器,也可能很危险(更详细的说明 here)。在撰写本文时,.spec.selector 包含matchExpressions 和/或matchLabels。这在here 中有更详细的记录。
    • 嗨,我也遇到了同样的问题,使用你的code,结果是Waiting, endpoint for service is not ready yet...,然后无限循环..
    猜你喜欢
    • 2017-09-17
    • 2018-03-27
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多