基于k8s使用helm安装Jenkins
## 一:k8s集群的构建
关于使用kubeadm安装k8s集群可参考我的另一篇文章,https://www.cnblogs.com/skymyyang/p/13279006.html
## 二:定义存储类
由于Jenkins需要持久化数据,这里我们需要定义存储类,来保证数据不会丢失。
基于NFS定义存储类。
可参考官方以及官方插件部署的地址
https://github.com/kubernetes-incubator/external-storage
## 三:自定义镜像
由于我之前使用的是官方镜像,会有很多问题。
1. 时间不同步,不是中国区的时间。
2.更新插件失败,即使安装成功,可是无法打开更新插件的界面,卡着不动
3. 这样的Jenkins 根本没法用
所以我决定自定义镜像。参考官网的镜像仓库,我们下载下来,修改一下
官方的镜像地址:https://github.com/jenkinsci/docker
这里我们将整个仓库都克隆下来。
git clone https://github.com/jenkinsci/docker.git
这里我们可以看到很多个Dockerfile。
这里我们使用Dockerfile-alpine这个文件来构建我们的镜像。
完整的Dockerfile为:
FROM openjdk:8-jdk-alpine ENV LANG=C.UTF-8 \ TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && apk add --no-cache \ bash \ coreutils \ curl \ git \ git-lfs \ openssh-client \ tini \ ttf-dejavu \ tzdata \ unzip ARG user=jenkins ARG group=jenkins ARG uid=1000 ARG gid=1000 ARG http_port=8080 ARG agent_port=50000 ARG JENKINS_HOME=/var/jenkins_home ARG REF=/usr/share/jenkins/ref ENV JENKINS_HOME $JENKINS_HOME ENV JENKINS_SLAVE_AGENT_PORT ${agent_port} ENV REF $REF # Jenkins is run with user `jenkins`, uid = 1000 # If you bind mount a volume from the host or a data container, # ensure you use the same uid RUN mkdir -p $JENKINS_HOME \ && chown ${uid}:${gid} $JENKINS_HOME \ && addgroup -g ${gid} ${group} \ && adduser -h "$JENKINS_HOME" -u ${uid} -G ${group} -s /bin/bash -D ${user} # Jenkins home directory is a volume, so configuration and build history # can be persisted and survive image upgrades VOLUME $JENKINS_HOME # $REF (defaults to `/usr/share/jenkins/ref/`) contains all reference configuration we want # to set on a fresh new installation. Use it to bundle additional plugins # or config file with your custom jenkins Docker image. RUN mkdir -p ${REF}/init.groovy.d # jenkins version being bundled in this docker image ARG JENKINS_VERSION ENV JENKINS_VERSION ${JENKINS_VERSION:-2.222.4} # jenkins.war checksum, download will be validated using it ARG JENKINS_SHA=6c95721b90272949ed8802cab8a84d7429306f72b180c5babc33f5b073e1c47c # Can be used to customize where jenkins.war get downloaded from ARG JENKINS_URL=https://mirrors.aliyun.com/jenkins/war-stable/${JENKINS_VERSION}/jenkins.war # could use ADD but this one does not check Last-Modified header neither does it allow to control checksum # see https://github.com/docker/docker/issues/8331 RUN curl -fsSL ${JENKINS_URL} -o /usr/share/jenkins/jenkins.war \ && echo "${JENKINS_SHA} /usr/share/jenkins/jenkins.war" | sha256sum -c - ENV JENKINS_UC https://updates.jenkins-zh.cn ENV JENKINS_UC_EXPERIMENTAL=https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/experimental ENV JENKINS_INCREMENTALS_REPO_MIRROR=https://repo.jenkins-ci.org/incrementals RUN chown -R ${user} "$JENKINS_HOME" "$REF" # for main web interface: EXPOSE ${http_port} # will be used by attached slave agents: EXPOSE ${agent_port} ENV COPY_REFERENCE_FILE_LOG $JENKINS_HOME/copy_reference_file.log USER ${user} COPY jenkins-support /usr/local/bin/jenkins-support COPY jenkins.sh /usr/local/bin/jenkins.sh COPY tini-shim.sh /bin/tini ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/jenkins.sh"] # from a derived Dockerfile, can use `RUN plugins.sh active.txt` to setup $REF/plugins from a support bundle COPY plugins.sh /usr/local/bin/plugins.sh COPY install-plugins.sh /usr/local/bin/install-plugins.sh
修改完成之后,这里我们将需要的文件拷贝到一个单独的目录下,来构建dcoker镜像。
mkdir /opt/jenkins-docker cp install-plugins.sh jenkins.sh jenkins-support plugins.sh tini-shim.sh /opt/jenkins-docker docker build -t skymyyang/jenkins:v2.222.4 . docker push skymyyang/jenkins:v2.222.4
上传完成之后,我们就可以使用helm指定我们自己的镜像,进行安装了。
## 四: 安装
helm install jenkins stable/jenkins --set master.image=skymyyang/jenkins --set master.tag=v2.222.4 --set master.imagePullPolicy=IfNotPresent --set master.serviceType=NodePort --set master.nodePort=30086 --set persistence.storageClass=managed-nfs-storage
安装需要等待一会,安装完成之后,默认不需要使用密码即可登录,当然也可以通过kubectl获取对应的密码
我这里安装在default名称空间下,也可以指定名称空间。这里指定在devops名称空间下。
helm install jenkins stable/jenkins -n devops --set master.image=skymyyang/jenkins --set master.tag=v2.222.4 --set master.imagePullPolicy=IfNotPresent --set master.serviceType=NodePort --set master.nodePort=30086 --set persistence.storageClass=managed-nfs-storage
安装完成之后,我们还需要在Jenkins的pvc目录下,进行update配置的更改,方便与我们安装插件。
来到Jenkins的pv目录下,
/nfsdata/default-jenkins-pvc-fc7c7c29-d001-467a-8371-54933b371de7
然后修改hudson.model.UpdateCenter.xml文件,修改为:
<?xml version='1.1' encoding='UTF-8'?> <sites> <site> <id>default</id> <url>https://updates.jenkins-zh.cn/update-center.json</url> </site> </sites>
这里使用的Jenkins中国社区源。
官方地址为:https://github.com/jenkins-zh/jenkins-formulas
这里可以找到此xml文件,以及证书文件。
然后进行证书文件的修改。
cd war/WEB-INF/update-center-rootCAs/ #然后把当前目录下的证书都给删除掉,重新创建证书 cat mirror-adapter.crt -----BEGIN CERTIFICATE----- MIICcTCCAdoCCQD/jZ7AgrzJKTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJD TjELMAkGA1UECAwCR0QxCzAJBgNVBAcMAlNaMQ4wDAYDVQQKDAV2aWhvbzEMMAoG A1UECwwDZGV2MREwDwYDVQQDDAhkZW1vLmNvbTEjMCEGCSqGSIb3DQEJARYUYWRt aW5AamVua2lucy16aC5jb20wHhcNMTkxMTA5MTA0MDA5WhcNMjIxMTA4MTA0MDA5 WjB9MQswCQYDVQQGEwJDTjELMAkGA1UECAwCR0QxCzAJBgNVBAcMAlNaMQ4wDAYD VQQKDAV2aWhvbzEMMAoGA1UECwwDZGV2MREwDwYDVQQDDAhkZW1vLmNvbTEjMCEG CSqGSIb3DQEJARYUYWRtaW5AamVua2lucy16aC5jb20wgZ8wDQYJKoZIhvcNAQEB BQADgY0AMIGJAoGBAN+6jN8rCIjVkQ0Q7ZbJLk4IdcHor2WdskOQMhlbR0gOyb4g RX+CorjDRjDm6mj2OohqlrtRxLGYxBnXFeQGU7wWjQHyfKDghtP51G/672lXFtzB KXukHByHjtzrDxAutKTdolyBCuIDDGJmRk+LavIBY3/Lxh6f0ZQSeCSJYiyxAgMB AAEwDQYJKoZIhvcNAQELBQADgYEAD92l26PoJcbl9GojK2L3pyOQjeeDm/vV9e3R EgwGmoIQzlubM0mjxpCz1J73nesoAcuplTEps/46L7yoMjptCA3TU9FZAHNQ8dbz a0vm4CF9841/FIk8tsLtwCT6ivkAi0lXGwhX0FK7FaAyU0nNeo/EPvDwzTim4XDK 9j1WGpE= -----END CERTIFICATE-----
修改完这两个文件之后,然后看下之前该目录下的文件的所有者权限,然后使用chown命令,重新给对应的文件授权,权限跟之前保持一直,否则又可能导致无法正确读取证书以及配置。
然后进行Jenkins重启。
http://192.168.50.101:30086/restart
点击是,进行重启。
未完....待续...