首页 > 解决方案 > 由于标签格式错误,Jenkins master 无法在 k8s 上启动 slave

问题描述

我已经helmk8s.

我还安装了(通过在values.yaml文件中将它们作为列表传递大约 300 个插件(如果重要的话)。

当我试图启动代理时,事情开始出错了。

这失败并出现以下错误:

.default/api/v1/namespaces/jenkins/pods?labelSelector=jenkins%2Fjenkins-myenv-jenkins-slave%3Dtrue%2Cjenkins%2Flabel%3Djenkins-myenv-jenkins-slave_. Message: unable to parse requirement: invalid label value: "jenkins-myenv-jenkins-slave_": a valid label must be an empty string or consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyValue',  or 'my_value',  or '12345', regex used for validation is '(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?'). Received status: Status(apiVersion=v1, code=400, details=null, kind=Status, message=unable to parse requirement: invalid label value: "jenkins-myenv-jenkins-slave_": a valid label must be an empty string or consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyValue',  or 'my_value',  or '12345', regex used for validation is '(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?'), metadata=ListMeta(_continue=null, remainingItemCount=null, resourceVersion=null, selfLink=null, additionalProperties={}), reason=BadRequest, status=Failure, additionalProperties={}).

我真的很想知道它是如何最终要求一个带有标签的 pod

jenkins-myenv-jenkins-slave_

因为我的values.yaml文件中没有任何地方以_.

这是我的agent配置的第一行values.yaml

agent:
  enabled: true
  image: "jenkins/jnlp-slave"
  tag: "3.27-1"
  customJenkinsLabels: []
  # name of the secret to be used for image pulling
  imagePullSecretName:
  componentName: "jenkins-slave"
  privileged: false

更何况配置部分的相关字段最后好像没有下划线

在此处输入图像描述

标签: jenkinskuberneteskubernetes-helm

解决方案


我建议不要在jenkins中手动定义代理,你应该只配置kubernetes主机地址

使用声明式管道,您可以像这样定义 kubernetes 代理:

   agent {
       kubernetes {
            label "${kubernetesUUID}"
            defaultContainer 'docker'
            yaml readTrusted('kube.yaml')
            idleMinutes idleminutes
        }
    }

文件 kube.yml 将在与 Jenkinsfile 相同的文件夹中进行版本控制

apiVersion: v1
kind: Pod
spec:
    containers:
        - name: jnlp
          image: jenkinsci/jnlp-slave:latest
          args:
              - ${computer.jnlpmac} ${computer.name}
          tty: true
        - name: docker
          image: myimage:version
          tty: true
          command:
              - cat
          volumeMounts:
            - mountPath: /dev/random
              name: host-urandom
    volumes:
    - name: host-urandom
      hostPath:
        path: /dev/urandom

您可以在规范中添加任意数量的容器,但是 jnlp 必须保留。你也应该修复版本,不要让最新版本

您还可以将带有规范的字符串直接传递给 yaml 步骤,而不是使用外部文件。

如果您想让代理在几分钟后启动并且每次构建时不生成新代理,您可以使用步骤 idleMinutes


推荐阅读