【问题标题】:update kubernetes deployment with jenkins使用 jenkins 更新 kubernetes 部署
【发布时间】:2019-04-25 20:59:17
【问题描述】:

我正在使用Kubernetes Continuous Deploy Plugin 在我的 Kubernetes 集群上部署和升级部署。 我正在使用管道,这是 Jenkinsfile:

pipeline {
    environment {
        JOB_NAME = "${JOB_NAME}".replace("-deploy", "")
        REGISTRY = "my-docker-registry"
    }
    agent any
    stages {
        stage('Fetching kubernetes config files') {
            steps {
                git 'git_url_of_k8s_configurations'
            }
        }
        stage('Deploy on kubernetes') {
            steps {
                kubernetesDeploy(
                    kubeconfigId: 'k8s-default-namespace-config-id',
                    configs: 'deployment.yml',
                    enableConfigSubstitution: true
                )
            }
        }
    }
}

Deployment.yml 改为:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ${JOB_NAME}
spec:
  replicas: 1
  template:
    metadata:
      labels:
        build_number: ${BUILD_NUMBER}
        app: ${JOB_NAME}
        role: rolling-update
    spec:
      containers:
      - name: ${JOB_NAME}-container        
        image: ${REGISTRY}/${JOB_NAME}:latest
        ports:
        - containerPort: 8080
        envFrom:
            - configMapRef:
                name: postgres
      imagePullSecrets:
      - name: regcred
  strategy:
    type: RollingUpdate

为了让 Kubernetes 了解 Deployment 发生了变化(因此升级它和 pod),我使用了 Jenkins 内部版本号作为注释:

...
metadata:
  labels:
    build_number: ${BUILD_NUMBER}
...

问题还是我的误解:

如果 Kubernetes 上不存在 Deployment,则一切正常,创建一个 Deployment 和一个 ReplicaSet。

如果 Deployment 仍然存在并且应用了升级,Kubernetes 会创建一个新的 ReplicaSet:

首次部署之前

首次部署

第二次部署

第三次部署

如您所见,每个新的 Jenkins 部署都会正确地更新部署,但会创建一个新的 ReplicaSet 而不会删除旧的。

可能是什么问题?

【问题讨论】:

    标签: jenkins deployment kubernetes replicaset


    【解决方案1】:

    这是预期的行为。每次更新 Deployment 时,都会创建一个新的 ReplicaSet。但是,旧的 ReplicaSet 将被保留,以便您可以在更新后的 Deployment 出现任何问题时回滚到以前的状态。

    参考:Updating a Deployment

    但是,您可以通过spec.revisionHistoryLimit 字段限制应保留多少个ReplicaSet。默认值为 10。参考:RevisionHistoryLimit

    【讨论】:

    • 好的,谢谢。但是我可以看到部署不会杀死旧的 pod,为什么?
    • 嗯,这是出乎意料的。一旦新的 pod 准备好,部署应该杀死旧的 pod。一定有什么事情发生了。尝试为 RollingUpdate 配置 maxUnavailablemaxSurge 字段。 kubernetes.io/docs/concepts/workloads/controllers/deployment/…
    • 是的,问题出在 build_number 上。现在我已经使用动态 image_tag 进行了编辑,一切正常!非常感谢
    猜你喜欢
    • 2020-07-02
    • 2021-05-28
    • 2020-08-27
    • 2021-09-21
    • 1970-01-01
    • 2018-07-15
    • 2020-09-09
    • 2020-04-06
    相关资源
    最近更新 更多