Loading

基于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

点击是,进行重启。

未完....待续...

posted @ 2020-08-10 17:21  Devops、小铁匠  阅读(2352)  评论(0编辑  收藏  举报