patternkubernetesMinor
Jenkins Pipeline Kubernetes Agent shared Volumes
Viewed 0 times
volumessharedjenkinskubernetesagentpipeline
Problem
I have a Jenkins Pipeline using Kubernetes Agent.
I schedule multiple containers in my pod template.
I recently wanted to add volumes that would be shared some of the containers and am having difficulties.
I need to know how to create a volume that will be shared between 2 or more containers in a pod. That volume should mount to a specific path on each container.
Specifics:
There also seems to be a severe lack of documentation for this. So any direction on that would also be appreciated. The documentation I did find says that the way to do this is to define volumes in the pipeline that will be shared by all containers.
Sample Jenkinsfile:
Below is not my actual pipeline, but it recreates the issue.
Result:
```
[Pipeline] podTemplate
[Pipeline] {
[Pipeline] node
Still waiting to schedule task
All nodes of label ‘test-pod’ are offline
Agent test-pod-5t0gj-wln8d is provisioned from template Kubernetes Pod Template
Agent specification [Kubernetes Pod Template] (test-pod):
Running on test-pod-5t0gj-wln8d in /home/jenkins/workspace/pipeline-test
[Pipeline] {
[Pipeline] container
[Pipeline] {
[Pipeline] st
I schedule multiple containers in my pod template.
I recently wanted to add volumes that would be shared some of the containers and am having difficulties.
I need to know how to create a volume that will be shared between 2 or more containers in a pod. That volume should mount to a specific path on each container.
Specifics:
- Using GCE (Google Cloud Engine) with Kubernetes Jenkins
- Using emptyDir volumes
There also seems to be a severe lack of documentation for this. So any direction on that would also be appreciated. The documentation I did find says that the way to do this is to define volumes in the pipeline that will be shared by all containers.
Sample Jenkinsfile:
Below is not my actual pipeline, but it recreates the issue.
pipeline {
agent {
kubernetes {
label 'test-pod'
defaultContainer 'jnlp'
yaml """
apiVersion: v1
kind: Pod
spec:
containers:
- name: frontend-test
image: centos:7
command:
- cat
tty: true
- name: backend-test
image: centos:7
command:
- cat
tty: true
volumes:
- name: sharedvolume
emptyDir: {}
mountPath: '/opt/app/shared'
"""
}
}
stages {
stage('Test Pipeline Configuration') {
steps {
container('frontend-test') {
sh 'touch /opt/app/shared/test_file'
}
container('backend-test') {
sh 'ls /opt/app/shared/test_file ; echo $?'
}
}
}
}
}Result:
```
[Pipeline] podTemplate
[Pipeline] {
[Pipeline] node
Still waiting to schedule task
All nodes of label ‘test-pod’ are offline
Agent test-pod-5t0gj-wln8d is provisioned from template Kubernetes Pod Template
Agent specification [Kubernetes Pod Template] (test-pod):
Running on test-pod-5t0gj-wln8d in /home/jenkins/workspace/pipeline-test
[Pipeline] {
[Pipeline] container
[Pipeline] {
[Pipeline] st
Solution
To solve this, you need to include the volume mounts in the containers described here:
Sample Jenkinsfile:
Result:
This solved the problem.
Sample Jenkinsfile:
pipeline {
agent {
kubernetes {
label 'test-pod'
defaultContainer 'jnlp'
yaml """
apiVersion: v1
kind: Pod
spec:
containers:
- name: frontend-test
image: centos:7
command:
- cat
tty: true
volumeMounts:
- mountPath: '/opt/app/shared'
name: sharedvolume
- name: backend-test
image: centos:7
command:
- cat
tty: true
volumeMounts:
- mountPath: '/opt/app/shared'
name: sharedvolume
volumes:
- name: sharedvolume
emptyDir: {}
"""
}
}
stages {
stage('Test Pipeline Configuration') {
steps {
container('frontend-test') {
sh 'touch /opt/app/shared/test_file'
}
container('backend-test') {
sh 'ls /opt/app/shared/test_file ; echo $?'
}
}
}
}
}Result:
This solved the problem.
[Pipeline] podTemplate
[Pipeline] {
[Pipeline] node
Still waiting to schedule task
All nodes of label ‘test-pod’ are offline
Agent test-pod-wv12q-brfxj is provisioned from template Kubernetes Pod Template
Agent specification [Kubernetes Pod Template] (test-pod):
Running on test-pod-wv12q-brfxj in /home/jenkins/workspace/pipeline-test
[Pipeline] {
[Pipeline] container
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test Pipeline Configuration)
[Pipeline] container
[Pipeline] {
[Pipeline] sh
[pipeline-test] Running shell script
+ touch /opt/app/shared/test_file
[Pipeline] }
[Pipeline] // container
[Pipeline] container
[Pipeline] {
[Pipeline] sh
[pipeline-test] Running shell script
+ ls /opt/app/shared/test_file
/opt/app/shared/test_file
+ echo 0
0
[Pipeline] }
[Pipeline] // container
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // container
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // podTemplate
[Pipeline] End of Pipeline
Finished: SUCCESSCode Snippets
pipeline {
agent {
kubernetes {
label 'test-pod'
defaultContainer 'jnlp'
yaml """
apiVersion: v1
kind: Pod
spec:
containers:
- name: frontend-test
image: centos:7
command:
- cat
tty: true
volumeMounts:
- mountPath: '/opt/app/shared'
name: sharedvolume
- name: backend-test
image: centos:7
command:
- cat
tty: true
volumeMounts:
- mountPath: '/opt/app/shared'
name: sharedvolume
volumes:
- name: sharedvolume
emptyDir: {}
"""
}
}
stages {
stage('Test Pipeline Configuration') {
steps {
container('frontend-test') {
sh 'touch /opt/app/shared/test_file'
}
container('backend-test') {
sh 'ls /opt/app/shared/test_file ; echo $?'
}
}
}
}
}[Pipeline] podTemplate
[Pipeline] {
[Pipeline] node
Still waiting to schedule task
All nodes of label ‘test-pod’ are offline
Agent test-pod-wv12q-brfxj is provisioned from template Kubernetes Pod Template
Agent specification [Kubernetes Pod Template] (test-pod):
Running on test-pod-wv12q-brfxj in /home/jenkins/workspace/pipeline-test
[Pipeline] {
[Pipeline] container
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test Pipeline Configuration)
[Pipeline] container
[Pipeline] {
[Pipeline] sh
[pipeline-test] Running shell script
+ touch /opt/app/shared/test_file
[Pipeline] }
[Pipeline] // container
[Pipeline] container
[Pipeline] {
[Pipeline] sh
[pipeline-test] Running shell script
+ ls /opt/app/shared/test_file
/opt/app/shared/test_file
+ echo 0
0
[Pipeline] }
[Pipeline] // container
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // container
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // podTemplate
[Pipeline] End of Pipeline
Finished: SUCCESSContext
StackExchange DevOps Q#4695, answer score: 4
Revisions (0)
No revisions yet.