Jenkins в Kubernetes - рабочий каталог недоступен с помощью workspaceVolume dynamicPVC - PullRequest
2 голосов
/ 07 августа 2020

Я запускаю Jenkins в кластере EKS с плагином k8s , и я хотел бы написать декларативный конвейер, в котором я указываю шаблон модуля на каждом этапе. Таким образом, базовый пример c будет следующим, в котором на первом этапе создается файл, а на втором печатается:

pipeline{
  agent none
  stages {  
    stage('First sample') {
      agent {
        kubernetes {
          label 'mvn-pod'
          yaml """
spec:
  containers:
  - name: maven
    image: maven:3.3.9-jdk-8-alpine
            """
                        }
                    }
        steps {
            container('maven'){
                sh "echo 'hello' > test.txt"
            }
        }
      }
      
      
    stage('Second sample') {
      agent {
        kubernetes {
          label 'bysbox-pod'
          yaml """
spec:
  containers:
  - name: busybox
    image: busybox
            """
        }
      }
      steps {
        container('busybox'){
            sh "cat test.txt"
        }
      }
    }  
  }
}

Это явно не работает, так как два модуля не работают. У меня нет общей памяти. Читая this do c, я понял, что могу использовать workspaceVolume dynamicPVC () в yaml-объявлении модуля, чтобы плагин создавал и управлял persistentVolumeClaim, в котором, надеюсь, я могу записать данные, которые мне нужно поделиться между этапами.

Теперь, с workspaceVolume dynamicPVC (...), оба pv и pvc успешно созданы, но модуль выдает ошибку и завершает работу. В частности, подготовленные поды следующие:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/psp: eks.privileged
    runUrl: job/test-libraries/job/sample-k8s/12/
  creationTimestamp: "2020-08-07T08:57:09Z"
  deletionGracePeriodSeconds: 30
  deletionTimestamp: "2020-08-07T08:58:09Z"
  labels:
    jenkins: slave
    jenkins/label: bibibu
  name: bibibu-ggb5h-bg68p
  namespace: jenkins-slaves
  resourceVersion: "29184450"
  selfLink: /api/v1/namespaces/jenkins-slaves/pods/bibibu-ggb5h-bg68p
  uid: 1c1e78a5-fcc7-4c86-84b1-8dee43cf3f98
spec:
  containers:
  - image: maven:3.3.9-jdk-8-alpine
    imagePullPolicy: IfNotPresent
    name: maven
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    tty: true
    volumeMounts:
    - mountPath: /home/jenkins/agent
      name: workspace-volume
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-5bt8c
      readOnly: true
  - env:
    - name: JENKINS_SECRET
      value: ...
    - name: JENKINS_AGENT_NAME
      value: bibibu-ggb5h-bg68p
    - name: JENKINS_NAME
      value: bibibu-ggb5h-bg68p
    - name: JENKINS_AGENT_WORKDIR
      value: /home/jenkins/agent
    - name: JENKINS_URL
      value: ...
    image: jenkins/inbound-agent:4.3-4
    imagePullPolicy: IfNotPresent
    name: jnlp
    resources:
      requests:
        cpu: 100m
        memory: 256Mi
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /home/jenkins/agent
      name: workspace-volume
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-5bt8c
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: ...
  nodeSelector:
    kubernetes.io/os: linux
  priority: 0
  restartPolicy: Never
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: workspace-volume
    persistentVolumeClaim:
      claimName: pvc-bibibu-ggb5h-bg68p
  - name: default-token-5bt8c
    secret:
      defaultMode: 420
      secretName: default-token-5bt8c
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2020-08-07T08:57:16Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2020-08-07T08:57:16Z"
    message: 'containers with unready status: [jnlp]'
    reason: ContainersNotReady
    status: "False"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2020-08-07T08:57:16Z"
    message: 'containers with unready status: [jnlp]'
    reason: ContainersNotReady
    status: "False"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2020-08-07T08:57:16Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: docker://9ed5052e9755ee4f974704fa4b74f2d89702283a4437e60a9945cf4ec7d6da68
    image: jenkins/inbound-agent:4.3-4
    imageID: docker-pullable://jenkins/inbound-agent@sha256:62f48a12d41e02e557ee9f7e4ffa82c77925b817ec791c8da5f431213abc2828
    lastState: {}
    name: jnlp
    ready: false
    restartCount: 0
    state:
      terminated:
        containerID: docker://9ed5052e9755ee4f974704fa4b74f2d89702283a4437e60a9945cf4ec7d6da68
        exitCode: 1
        finishedAt: "2020-08-07T08:57:35Z"
        reason: Error
        startedAt: "2020-08-07T08:57:35Z"
  - containerID: docker://96f747a132ee98f7bf2488bd3cde247380aea5dd6f84bdcd7e6551dbf7c08943
    image: maven:3.3.9-jdk-8-alpine
    imageID: docker-pullable://maven@sha256:3ab854089af4b40cf3f1a12c96a6c84afe07063677073451c2190cdcec30391b
    lastState: {}
    name: maven
    ready: true
    restartCount: 0
    state:
      running:
        startedAt: "2020-08-07T08:57:35Z"
  hostIP: 10.108.171.224
  phase: Running
  podIP: 10.108.171.158
  qosClass: Burstable
  startTime: "2020-08-07T08:57:16Z"

Получение журналов из контейнера jnlp на модуле с kubectl logs name-of-the-pod -c jnlp -n jenkins-slaves привело меня к этой ошибке:

Exception in thread "main" java.io.IOException: The specified working directory should be fully accessible to the remoting executable (RWX): /home/jenkins/agent
        at org.jenkinsci.remoting.engine.WorkDirManager.verifyDirectory(WorkDirManager.java:249)
        at org.jenkinsci.remoting.engine.WorkDirManager.initializeWorkDir(WorkDirManager.java:201)
        at hudson.remoting.Engine.startEngine(Engine.java:288)
        at hudson.remoting.Engine.startEngine(Engine.java:264)
        at hudson.remoting.jnlp.Main.main(Main.java:284)
        at hudson.remoting.jnlp.Main._main(Main.java:279)
        at hudson.remoting.jnlp.Main.main(Main.java:231)

Я также пытался укажите accessModes в качестве параметра dynamicPVC, но ошибка та же.
Что я делаю не так?

Спасибо

1 Ответ

0 голосов
/ 19 августа 2020

Используемый образ docker настроен для работы от имени пользователя jenkins, отличного от root. По умолчанию PVC создаются, разрешая только root -пользовательский доступ.

Это можно настроить с помощью контекста безопасности , например,

securityContext:
  runAsUser: 1000
  runAsGroup: 1000
  fsGroup: 1000

(Пользователь jenkins на этом изображении ID 1000)

...