【问题标题】:How to version docker images with build number in Jenkins to deploy as Kubernetes deployment?如何在 Jenkins 中使用内部版本号对 docker 映像进行版本化以部署为 Kubernetes 部署?
【发布时间】:2020-03-01 14:49:07
【问题描述】:

目前我正在尝试为 Docker 映像添加版本号或内部版本号以部署在 Kubernetes 集群上。以前我只使用:latest 标签。但是当我使用 latest 标签时,我发现从 Dockerhub 镜像注册表中提取的问题。因此,当我将内部版本号用于我的 docker 映像时,例如 <image-name>:{build-number}

应用结构

在我的 Kubernetes 部署中,我使用了部署和服务。我在我的部署文件中定义我的图像存储库,如下所示,

   containers:
   - name: test-kube-deployment-container
     image: samplekubernetes020/testimage:latest
     ports:
        - name: http
          containerPort: 8085
          protocol: TCP

在这里,我想将内部版本号与我的图像一起放入部署 YAML 中,而不是最新标签。

  1. 我可以使用环境变量来保存随机内部版本号,以便像<image-name>:${buildnumber} 一样访问?
  2. 如果我想使用提供随机数的环境变量,如何为环境变量生成随机数?

图像版本实施更新

我修改后的 Jenkinsfile 包含如下步骤,将镜像版本号分配给镜像。但是在更改存储库后我仍然没有得到更新的结果,

我在 Jenkinsfile 中创建了如下步骤

stage ('imagebuild')
  {
     steps
         {
 sh 'docker build -f /var/lib/jenkins/workspace/jpipeline/pipeline/Dockerfile -t spacestudymilletech010/spacestudykubernetes /var/lib/jenkins/workspace/jpipeline/pipeline'
 sh 'docker login --username=my-username --password=my-password' 
 sh "docker tag spacestudymilletech010/spacestudykubernetes:latest spacestudymilletech010/spacestudykubernetes:${VERSION}"
 sh 'docker push spacestudymilletech010/spacestudykubernetes:latest'

         }
  }

我的部署 YAML 文件包含如下内容,

 containers:
   - name: test-kube-deployment-container
     image: spacestudymilletech010/spacestudykubernetes:latest
     ports:
        - name: http
          containerPort: 8085
          protocol: TCP

困惑

注意:当我检查 dockerhub 仓库时,每次显示最新推送状态

所以我的困惑是:

  1. 在我的deployment.yaml 文件中拉取最新的图像有什么问题吗?
  2. 当我在我构建图像并推送的机器上标记图像时出现问题吗?

【问题讨论】:

  • 您可以通过 CI/CD 管道轻松完成此操作。尝试使用 CircleCI、Azure devops 等工具
  • @TusharMahajan - 我正在使用 CI/CD 管道。当我定义我的 kubernetes 资源而不是使用 latest tag 时,我需要使用图像内部版本号/版本来从 dockerhub.com 中提取。因为最新标签已经存在图像拉取问题。
  • HelmKustomize 这样的工具可以注入内部版本号(以非常不同的方式)。您的 CI 系统中的顺序构建号和您的源代码控制提交 ID 都可以制作非常好的图像标签,并且它们不需要是随机的本身
  • @DavidMaze - 是的,我已经尝试过使用 Kubernetes Helm 图表。使用 Helm 图表成功部署。但是现在我在做平面kubernetes资源部署研发。在这里,我需要检查没有 helm chart 的部署的可行性。仅使用部署,服务。因为我正在检查随机数如何在我的图像构建中生成和分配。我希望你明白我想要探索什么?请告诉我先生。
  • Plain kubectl apply 没有任何替换功能。

标签: docker kubernetes


【解决方案1】:

标准方式或至少对我们大多数人有效的方式是创建版本化或标记的图像。例如

samplekubernetes020/testimage:1
samplekubernetes020/testimage:2
samplekubernetes020/testimage:3
...
...

现在我将尝试回答您的实际问题,即 当我的图像标签升级时如何更新部署中的图像?

输入解决方案

  • 当您使用最新版本的代码编译和构建新映像时,标记它 使用增量唯一版本。此标签可以是任何唯一的或内部版本号等。

  • 然后将此标记的图像推送到 docker 注册表

  • 镜像上传后,您可以使用 kubectl 或 kubernetes API 使用最新的容器镜像更新部署。

    kubectl set image deployment/my-deployment test-kube-deployment-container=samplekubernetes020/testimage:1 --record

  • 上述步骤通常发生在您的 CI 管道中,您将图像版本或 image: version 存储在环境变量本身中。


更新帖子评论

由于您使用的是 Jenkins,您可以在 Jenkinsfile 本身中获取当前的 build numbercommit-id 以及许多其他变量,因为 Jenkins 在构建运行时会注入这些值。对我来说,这行得通。仅供参考。

environment { 
   NAME = "myapp"
   VERSION = "${env.BUILD_ID}-${env.GIT_COMMIT}"
   IMAGE = "${NAME}:${VERSION}"
}
stages {
    stage('Build') {
        steps {
            echo "Running ${VERSION} on ${env.JENKINS_URL}"
            git branch: "${BRANCH}",  .....
            echo "for brnach ${env.BRANCH_NAME}"
            sh "docker build -t ${NAME} ."
            sh "docker tag ${NAME}:latest ${IMAGE_REPO}/${NAME}:${VERSION}"
        }
    }
}

【讨论】:

  • 我正在构建的映像不是手动映像构建过程。图像构建正在我的管道工作中进行。我正在使用 CI/CD 方式。图像会自动从 Jenkinsfile 构建。那么在图像构建中我如何使用随机构建号?正如我在问题中提到的那样,这正是我的困惑。我希望你明白我真正在寻找什么。
  • 嗯,好的。因此,当 Jenkins 在运行时注入它时,您可以在 Jenkinsfile 本身中获取当前的内部版本号和提交 ID 以及许多其他变量。对我来说这有效。 NAME = "myapp" VERSION = "${env.BUILD_ID}-${env.GIT_COMMIT}" IMAGE = ${NAME}:${VERSION}"
  • 是的,我明白了。这就是我真正要找的那个。完美更新。让我试试。感谢您的回复。
  • 我尝试了您更新的答案。但是使用版本号,我遇到了在 CI/CD 管道中提取最新图像的问题。我更新了我的实验并编辑了问题。你能看看那个先生吗?
  • 好的,所以在标记版本之后你只是推送最新的图像。您可以做的是推送版本化图像并在部署 YAML 中使用相同的图像。 push cmd - sh "docker push ${IMAGE_REPO}/${NAME}:${VERSION}" 你的部署 yaml 有.. spacestudymilletech010/spacestudykubernetes:12334
【解决方案2】:

这种 Jenkins 管道方法对我有用。 我使用 Jenkins 内部版本号作为 docker 镜像的标签,推送到 docker hub。现在将 yaml 文件应用到 k8s 集群,然后使用相同的标签更新部署中的图像。

示例管道脚本 sn-p 在这里,

stage('Build Docker Image'){
        sh 'docker build -t {dockerId}/{projectName}:${BUILD_NUMBER} .'
  }
  stage('Push Docker Image'){
        withCredentials([string(credentialsId: 'DOKCER_HUB_PASSWORD', variable: 'DOKCER_HUB_PASSWORD')]) {
          sh "docker login -u {dockerId} -p ${DOKCER_HUB_PASSWORD}"
        }
        sh 'docker push {dockerId}/{projectName}:${BUILD_NUMBER}'
  }
  stage("Deploy To Kuberates Cluster"){
        sh 'kubectl apply -f {yaml file name}.yaml'
        sh 'kubectl set image deployments/{deploymentName} {container name given in deployment yaml file}={dockerId}/{projectName}:${BUILD_NUMBER}'
  }

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2016-05-23
    相关资源
    最近更新 更多