在 kubernetes 集群内安装 jenkins
准备 jenkins 镜像
到官网上查看当前 jenkins 的版本是什么,这里目前使用的是2.249.1
,然后拉去到本地推送到本地仓库
# docker pull jenkins/jenkins:2.249.1
# docker tag jenkins/jenkins:2.249.1 harbor.zsf.com/public/jenkins:2.249.1
# docker push harbor.zsf.com/public/jenkins:2.249.1
改造 jenkins 官方镜像
jenkins 的官方镜像对于我们并不能直接使用,我们来对此进行改造
FROM harbor.zsf.com/public/jenkins:2.249.1
MAINTAINER zhangshoufu wx: y18163201
USER root
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&
echo "Asia/Shanghai" > /etc/timezone
COPY id_rsa /root/.ssh/id_rsa
COPY config.json /root/.docker/config.json
COPY get-docker.sh /get-docker.sh
RUN echo "StrictHostKeyCheck no" >> /etc/ssh/ssh_config &&
/get-docker.sh
解释 Dockerfile
1,导入我们刚才从 docker hub 拉去的 jenkins 基础镜像
2,声明了 Dockerfile 的作者
3,更改 容器启动时候使用的用户,我们这里面使用 root用户,因为我们要执行 Docker 打包操作
4,更改 jenkins 容器内的时区为上海,
7,在宿主机上生成一个 SSH 秘钥对,把私钥拷贝到 jenkins 里面,因为我们要通过 SSH 的方式去 gitlab上拖取代码
8,因为我们要登录私有的 docker 仓库,所以我们把 docker 的登录仓库的 json 文件拷贝进去,在宿主机上/root/.docker/config.json,可以拷贝到当前路径,config.json 里面放的就是登录信息
9,我们需要在 jenkins 里面安装 docker客户端,使其能执行 docker 打包操作。此脚本通过
curl -fsSL https://get.docker.com -o get-docker.sh
获得10,取消 ssh 登录的时候秘钥验证,就是第一次登录机器的时候 接收秘钥 yes 的动作,并安装 docker 客户端,
创建 SSH 秘钥,准备 config.json文件
# ssh-keygen -t rsa -b 2048 -C "zsf18163201@qq.com" -N "" -f ./id_rsa
# cp /root/.docker/config.json ./
# curl -fsSL https://get.docker.com -o get-docker.sh
# chmod +x get-docker.sh
# tree .
.
├── config.json
├── Dockerfile
├── get-docker.sh
├── id_rsa
└── id_rsa.pub
打包 Docker images
# docker build -f Dockerfile . -t harbor.zsf.com/infra/jenkins:2.249.1
# docker push harbor.zsf.com/infra/jenkins:2.249.1
需要注意的一点是 infra 是我们的私有仓库
k8s 中部署 jenkins
创建 namespaces
# kubectl create namespace infra
namespace/infra created
创建登录docker 私有仓库的凭证
创建一个 docker-registry 的 secret 资源
# kubectl create secret docker-registry harbor --docker-server=harbor.zsf.com --docker-username=admin --docker-password='Flzx3000c@' -n infra
secret/harbor created
创建的secret 类型为 docker-registry 的秘钥。
查看 secret 证书的 yaml 文件
# kubectl get secret -n infra harbor -o yaml
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyJoYXJib3Iub2QuY29tIjp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IkZsengzMDAwY0AiLCJhdXRoIjoiWVdSdGFXNDZSbXg2ZURNd01EQmpRQT09In19fQ==
kind: Secret
metadata:
creationTimestamp: "2020-09-24T06:45:34Z"
name: harbor
namespace: infra
resourceVersion: "5671330"
selfLink: /api/v1/namespaces/infra/secrets/harbor
uid: 04f553fb-a0db-4e6d-844b-57bbcd898710
type: kubernetes.io/dockerconfigjson
其中.dockerconfigjson
字段的值是 Docker 凭据的 base64 表示。要想查看dockerconfigjson
字段中的内容,请将 Secret 数据转换为可读格式:
# kubectl get secret -n infra harbor --output="jsonpath={.data..dockerconfigjson}" | base64 --decode
{"auths":{"harbor.od.com":{"username":"admin","password":"Flzx3000c@","auth":"YWRtaW46Rmx6eDMwMDBjQA=="}}}
要想查看 auth 字段的信息,请使用下面命令:
# echo "XXXXXX" |base64 --decode
创建 nfs 共享存储
我们在 192.168.4.73 机器上安装,
# yum -y install nfs-utils rpcbind
# cat /etc/exports
/home/kubernetes-volume/jenkins-data 192.168.4.0/24(rw)
# systemctl enable rpcbind && systemctl start rpcbind
# systemctl enable nfs && systemctl start rpcbind
然后每个节点上面需要安装nfs-utils
,这里不再赘述
创建jenkins 的 yaml 文件
创建 jenkins-deployment 文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: infra
labels:
app: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
imagePullSecrets:
- name: harbor
containers:
- name: jenkins
image: harbor.zsf.com/infra/jenkins:2.249.1
imagePullPolicy: IfNotPresent
ports:
- name: jenkins-8080
containerPort: 8080
protocol: TCP
env:
- name: JAVA_OPTS
value: -Xmx1g -Xms1g
volumeMounts:
- name: jenkins-data
mountPath: /var/jenkins_home
- name: docker-sock
mountPath: /var/run/docker.sock
- name: time
mountPath: /etc/localtime
resources:
limits:
memory: 1.5Gi
requests:
memory: 1.5Gi
volumes:
- name: jenkins-data
nfs:
server: jx4-73
path: /home/kubernetes-volume/jenkins-data
- name: docker-sock
hostPath:
path: /var/run/docker.sock
type: Socket
- name: time
hostPath:
path: /etc/localtime
type: File
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
revisionHistoryLimit: 5
progressDeadlineSeconds: 600
创建 service ingress 文件
apiVersion: v1
kind: Service
metadata:
labels:
app: loki
name: loki
namespace: monitoring
spec:
ports:
- name: loki-3100
port: 3100
targetPort: loki-3100
selector:
app: loki
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: loki
namespace: monitoring
spec:
rules:
- host: loki.zsf.com
http:
paths:
- path: /
backend:
serviceName: loki
servicePort: 3100
然后在 DNS 服务器上面配置域名
到我们的 DNS 服务器上条件一个jenkins.zsf.com
的域名解析。然后我们访问 jenkins
访问配置 Jenkins
我们通过web 界面登录 jenkins,然后安装插件。
设置匿名用户访问 jenkins,但是不能配置
jenkins
-->Manage Jenkins
-->Security
-->configure global security
-->Authorization
安装插件,更换插件源
我们采用默认的jenkins 站点去安装插件的时候,因为墙的原因我们安装插件很困难,所以我们第一步先替换一下升级所使用的站点
系统管理 --> 管理插件 --> 高级 --> 升级站点
替换成地址http://mirrors.jenkins-ci.org/status.html
然后提交再去安装插件
安装语言插件 [Locale plugin](