【问题标题】:kubernetes jenkins plugin does not create 2 containerskubernetes jenkins 插件不会创建 2 个容器
【发布时间】:2020-07-29 15:12:22
【问题描述】:

我有 2 个 Jenkins 实例,一个使用 1.8 版,第二个使用 1.18 版。

最旧的版本能够创建两个容器。

Agent specification [Kubernetes Pod Template] (mo-aio-build-supplier): 
* [jnlp] mynexus.services.com/mo-base/jenkins-slave-mo-aio:1.8.2-ca(resourceRequestCpu: 0.25, resourceRequestMemory: 256Mi, resourceLimitCpu: 1, resourceLimitMemory: 1.5Gi)
* [postgres] mynexus.services.com:443/mo-base/mo-base-postgresql-95-openshift

最新版本无法创建postgres容器

Container postgres exited with error 1. Logs: mkdir: cannot create directory '/home/jenkins': Permission denied

两者都使用相同的podTemplate

 podTemplate(
            name: label,
            label: label,
            cloud: 'openshift',
            serviceAccount: 'jenkins',
            containers: [
                    containerTemplate(
                            name: 'jnlp',
                            image: 'mynexus.services.theosmo.com/jenkins-slave-mo-aio:v3.11.104-14_jdk8',
                            resourceRequestCpu: env.CPU_REQUEST,
                            resourceLimitCpu: env.CPU_LIMIT,
                            resourceRequestMemory: env.RAM_REQUEST,
                            resourceLimitMemory: env.RAM_LIMIT,
                            workingDir: '/tmp',
                            args: '${computer.jnlpmac} ${computer.name}',
                            command: ''
                    ),
                    containerTemplate(
                            name: 'postgres',
                            image: 'mynexus.services.theosmo.com:443/mo-base/mo-base-postgresql-95-openshift',
                            envVars: [
                                envVar(key: "POSTGRESQL_USER", value: "admin"),
                                envVar(key: "POSTGRESQL_PASSWORD", value: "admin"),
                                envVar(key: "POSTGRESQL_DATABASE", value: "supplier_data"),
                            ]
                    )
            ],
            volumes: [emptyDirVolume(mountPath: '/dev/shm', memory: true)]
    )

另外,我注意到最新版本创建的 YAML 有点奇怪

apiVersion: "v1"
kind: "Pod"
metadata:
  annotations:
    buildUrl: "http://jenkins.svc:80/job/build-supplier/473/"
  labels:
    jenkins: "slave"
    jenkins/mo-aio-build-supplier: "true"
  name: "mo-aio-build-supplier-xfgmn-qmrdl"
spec:
  containers:
  - args:
    - "********"
    - "mo-aio-build-supplier-xfgmn-qmrdl"
    env:
    - name: "JENKINS_SECRET"
      value: "********"
    - name: "JENKINS_TUNNEL"
      value: "jenkins-jnlp.svc:50000"
    - name: "JENKINS_AGENT_NAME"
      value: "mo-aio-build-supplier-xfgmn-qmrdl"
    - name: "JENKINS_NAME"
      value: "mo-aio-build-supplier-xfgmn-qmrdl"
    - name: "JENKINS_AGENT_WORKDIR"
      value: "/tmp"
    - name: "JENKINS_URL"
      value: "http://jenkins.svc:80/"
    - name: "HOME"
      value: "/home/jenkins"
    image: "mynexus.services.com/mo-base/jenkins-slave-mo-aio:1.8.2-ca"
    imagePullPolicy: "IfNotPresent"
    name: "jnlp"
    resources:
      limits:
        memory: "1.5Gi"
        cpu: "1"
      requests:
        memory: "256Mi"
        cpu: "0.25"
    securityContext:
      privileged: false
    tty: false
    volumeMounts:
    - mountPath: "/dev/shm"
      name: "volume-0"
      readOnly: false
    - mountPath: "/tmp"
      name: "workspace-volume"
      readOnly: false
    workingDir: "/tmp"
  - env:
    - name: "POSTGRESQL_DATABASE"
      value: "supplier_data"
    - name: "POSTGRESQL_USER"
      value: "admin"
    - name: "HOME"
      value: "/home/jenkins"
    - name: "POSTGRESQL_PASSWORD"
      value: "admin"
    image: "mynexus.services.com:443/mo-base/mo-base-postgresql-95-openshift"
    imagePullPolicy: "IfNotPresent"
    name: "postgres"
    resources:
      limits: {}
      requests: {}
    securityContext:
      privileged: false
    tty: false
    volumeMounts:
    - mountPath: "/dev/shm"
      name: "volume-0"
      readOnly: false
    - mountPath: "/home/jenkins/agent"
      name: "workspace-volume"
      readOnly: false
    workingDir: "/home/jenkins/agent"
  nodeSelector: {}
  restartPolicy: "Never"
  serviceAccount: "jenkins"
  volumes:
  - emptyDir:
      medium: "Memory"
    name: "volume-0"
  - emptyDir: {}
    name: "workspace-volume"

正如你在上面看到的:

  • postgres 容器位于 env 树下

有什么建议吗?提前致谢

【问题讨论】:

    标签: jenkins kubernetes kubernetes-pod


    【解决方案1】:

    据我检查there

    问题

    从 Kubernetes Plugin 版本 1.18.0 开始,pod 容器的默认工作目录从 /home/jenkins 更改为 /home/jenkins/agent。但是默认的 HOME 环境变量执行仍然指向 /home/jenkins。此更改的影响是,如果 pod 容器映像没有 /home/jenkins 目录,该目录对运行用户具有足够的权限,则构建将无法直接在其 HOME 目录 /home/jenkins 下执行任何操作。

    分辨率

    这个问题有不同的解决方法:

    更改默认的 HOME 变量

    最简单且首选的解决方法是在 Jenkins 启动时添加系统属性 -Dorg.csanchez.jenkins.plugins.kubernetes.PodTemplateBuilder.defaultHome=/home/jenkins/agent。这需要重新启动。

    此解决方法将反映 1.18.0 之前的 kubernetes 插件的行为,但在新的工作目录 /home/jenkins/agent 上

    使用 /home/jenkins 作为工作目录

    解决方法是将 pod 容器的工作目录改回 /home/jenkins。此解决方法仅在使用 YAML 定义代理 pod 模板 (see JENKINS-60977) 时才有可能。

    为 Jenkins 准备映像

    一种解决方法可能是确保代理 pod 中使用的映像具有 /home/jenkins 目录,该目录归根组所有,并且可由根组写入,如 OpenShift Container Platform 特定指南中所述。


    另外还有 jenkins 上的issue


    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 2021-10-01
      • 2021-09-06
      • 2016-09-13
      • 1970-01-01
      相关资源
      最近更新 更多