【问题标题】:Is there a way to update Jenkins running in Kubernetes?有没有办法更新在 Kubernetes 中运行的 Jenkins?
【发布时间】:2020-04-28 15:59:04
【问题描述】:

我正在尝试在 Kubernetes 中运行 Jenkins,但 Jenkins 的版本已过时。它说我需要至少 2.138.4 版本的 Kubernetes 插件。

我正在使用来自 Docker hub 的 this jenkins 映像(“jenkins/jenkins:lts”)。但是当我尝试在 Kubernetes 中运行它时,它说版本是 2.60.3。我之前使用了一个非常旧版本的 Jenkins (2.60.3),但我更新了我的 Dockerfile 以使用最新的图像。之后,我再次构建映像并将其扔给 Kubernetes。我什至在再次部署之前删除了我的 Kubernetes 部署和服务。 我目前正在使用 Minikube 的开发环境中工作。

Dockerfile:

FROM jenkins/jenkins:lts

ENV JENKINS_USER admin
ENV JENKINS_PASS admin

# Skip initial setup
ENV JAVA_OPTS -Djenkins.install.runSetupWizard=false


COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/plugins.txt
USER root
RUN apt-get update \
  && apt-get install -qqy apt-transport-https ca-certificates curl gnupg2 software-properties-common 
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
  "deb [arch=amd64] https://download.docker.com/linux/debian \
  $(lsb_release -cs) \
  stable"
RUN apt-get update  -qq \
  && apt-get install docker-ce -y
RUN usermod -aG docker jenkins
RUN apt-get clean
RUN curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
USER jenkins 

Kubernetes 部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      containers:
        - name: jenkins
          image: mikemanders/my-jenkins-image:1.0
          env:
            - name: JAVA_OPTS
              value: -Djenkins.install.runSetupWizard=false
          ports:
            - name: http-port
              containerPort: 8080
            - name: jnlp-port
              containerPort: 50000
          volumeMounts:
            - name: jenkins-home
              mountPath: /var/jenkins_home
      volumes:
        - name: jenkins-home
          emptyDir: {}

还有 Kubernetes 服务:

apiVersion: v1
kind: Service
metadata:
  name: jenkins
spec:
  type: NodePort
  selector:
    app: jenkins
  ports:
    - port: 8080
      targetPort: 8080

我认为我的 Kubernetes 配置不错,所以我猜它与 Docker 有关系?

我在这里遗漏了什么/做错了什么?

【问题讨论】:

    标签: docker jenkins kubernetes dockerfile jenkins-plugins


    【解决方案1】:

    TL;DR

    对于update a deployment,您需要基于新Jenkins 版本的新Docker 图像:

    docker build -t mikemanders/my-jenkins-image:1.1 .
    docker push mikemanders/my-jenkins-image
    kubectl set image deployment/jenkins mikemanders/my-jenkins-image=1.1 --record
    

    Kubernetes 部署 images 而不是 dockerfiles

    根据Images man

    您创建 Docker 映像并将其推送到注册表,然后在 Kubernetes pod 中引用它。

    容器的image 属性支持与docker 命令相同的语法,包括私有注册表和标签。

    所以,您需要一个映像来部署。

    更新您的图片

    要更新注册表中的图像,请使用 docker build -tdocker push

    docker build -t mikemanders/my-jenkins-image:1.1
    docker push mikemanders/my-jenkins-image
    

    它将使用更新的jenkins/jeinkis:lts 重建图像。然后图片会上传到container registry

    问题是您在更新集群之前正在更新映像版本(例如1.0->1.1)。

    【讨论】:

    • 不需要显式推送本地构建的镜像副本到注册表吗?
    • 不,你不需要推送它。您可以为 Kubernetes 使用本地映像。但是,如果您想将其部署到云提供商,则需要将其推送到注册表(例如 Docker 集线器)。
    • 根据你的配置,看起来你使用 hub.docker.com 作为注册表,不是吗?
    • @Yasen 感谢您的回答,不敢相信我没有想到这些版本。
    • @Yasen true 我正在使用 hub.docker.com。你的回答有效,所以我接受了。谢谢
    猜你喜欢
    • 2020-03-21
    • 2015-09-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多