我一直在尝试设置Jenkins以在教程中使用Kubernetes。我一切都工作得很好,但我一直在尝试使用Kubernetes Jenkins插件添加一些自定义图像。似乎任何公共图像都可以正常工作,但是当我创建一个图像并将其放入我的私有容器注册表中时,Jenkins奴隶就失败了。
我想知道如何最好地利用Jenkins内容器注册表中的图像。我找到了这个教程(https://cloud.google.com/solutions/jenkins-on-container-engine#customizing_the_docker_image)。当我通过构建jenkins-slave图像并将其推送到我的仓库来尝试这些步骤时,它不起作用。每当它抱怨奴隶离线并且无法联系时。
答案 0 :(得分:1)
从未尝试过google容器注册表,但据我所知,您可以使用完整的repo +图像名称。就像是: gcr.io/my_project/image:tag
确保您的图片/回购邮件与Google云端的kubernetes和jenkins位于同一服务帐户下!
答案 1 :(得分:0)
当容器构建代理(旧术语为 slave
)在 Jenkins 中显示为 Offline 时,这通常意味着如果使用 Pipeline,则 Jenkinsfile 中存在错误,或者存在问题拉取代理镜像容器。
如果您使用的是 Kubernetes 插件,您将在 Kubernetes pod 上以及该插件的较新版本的构建日志中看到错误。对于 docker 插件容器,错误可能在构建日志中不可见,但会在 docker 日志中。
这通常是从注册表中提取映像的身份验证或访问问题。
如果您使用 Jenkins Kubernetes plugin,则 Pod YAML 或 Pod 模板必须包含您希望从中提取容器映像的 Container Registry 的 imagePullSecrets
.
Jenkins 脚本管道:
node {
podTemplate(cloud: 'kubernetes', containers: [
containerTemplate(
name: 'mine',
image: 'my-image:v1.2',
ttyEnabled: true,
),
],
imagePullSecrets: [ 'my-credentials-id' ]) {
sh 'run command'
}
}
Jenkins 声明式管道:
pipeline {
agent {
kubernetes {
cloud 'kubernetes'
defaultContainer 'mine'
yaml '''
apiVersion: v1
kind: Pod
metadata:
labels:
build: my-app
spec:
containers:
- name: mine
image: my-image:v1.2
command:
- cat
tty: true
imagePullSecrets:
- name: my-image-pull-cred
'''
}
}
stages {
stage('Run Build') {
steps {
sh 'mvn -version'
}
}
}
}
如果您使用的是 Docker plugin,则需要定义 docker 代理 withRegistry
,它允许您为从中传递注册中心的 Jenkins 凭据希望从中提取容器映像。
Jenkins 脚本管道:
node {
docker.withRegistry('https://my-registry.gcr.io', 'my-credentials-id') {
docker.image('my-image:v1.2').inside {
sh 'run command'
}
}
}
Jenkins 声明式管道:
pipeline {
agent {
docker {
image 'my-image:v1.0'
registryUrl 'https://my-registry.gcr.io'
registryCredentialsId 'my-credentials-id'
}
}
stages {
stage('Build') {
steps {
sh 'run command'
}
}
}
}