jenkins中文文档:https://www.jenkins.io/zh/doc/book/installing/

1、准备镜像

1、下载Jenkins(10.4.7.200上)
docker pull jenkins/jenkins:2.190.3
docker pull jenkins/jenkins:2.303.1
image.png

docker images | grep jenkins
image.png

docker tag 619aabbe0502 harbor.jack.com/public/jenkins:v2.303.1
docker push harbor.jack.com/public/jenkins:v2.303.1
image.png

2、生成公钥和私钥

执行:ssh-keygen -t rsa -b 2048 -C “1204949289@qq.com“ -N “” -f /root/.ssh/id_rsa
输出:
Generating public/private rsa key pair.
Created directory ‘/root/.ssh’.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:jfdiRIE+5cyIMIhwiawPmMxlCCWhfG/a4MVj32Am9fs 1204949289@qq.com
The key’s randomart image is:
+—-[RSA 2048]——+
|O=+o .. |
|==ooo . .. |
|oo. o + . |
|=o. o o =++ |
| o . O +So+ |
| o B * oo.. |
| o . . oo . |
| … |
| E |
+——[SHA256]——-+
image.png
cat /root/.ssh/id_rsa.pub
输出:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzFBqT7Oom5bKcG/ZA8vE9b+6xPxoaXZpIE1oNOJmnr7n5e2fG1RFrfklCF5Pn30/ZB4g2LP6zsdtQFv/xXdEG6lJhTV9MLSdfdqTlUh+Jbc4nCf8fs8btSwhR4Cv1hztpxFXk01gdbmNfCUBQH72jUO3YveeuXJjYhL78tGBEyBZOdCW1b133eg2t+3klxfZN1tlqdqH08wKBOez2DnDQjtIJyDSu/mKEF8dnit1iQ9wgJEgQRL9o4zqF1RRDV7Vo2jAbtergeVIdiNzPBxZRtgYQiDoK4vT67/sgwtVVRCFw/8/o4WLHdUsompAoOKKkcGd0yfWfu24GVzKtJDp3 1204949289@qq.com
image.png

3、自定义Dockerfile

[root@hdss7-200 ~]# cd /data/dockerfile
root@hdss7-200 dockerfile]# mkdir jenkins
[root@hdss7-200 dockerfile]# cd jenkins/
[root@hdss7-200 jenkins]# vim Dockerfile

vi /data/dockerfile/jenkins/Dockerfile
输入:
FROM harbor.jack.com/public/jenkins:v2.303.1
USER root
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
echo ‘Asia/Shanghai’ >/etc/timezone
ADD id_rsa /root/.ssh/id_rsa
ADD config.json /root/.docker/config.json
ADD get-docker.sh /get-docker.sh
RUN echo “ StrictHostKeyChecking no” >> /etc/ssh/ssh_config &&\
/get-docker.sh

这个Dockerfile主要设置以下几项:
设置了容器启动时使用的用户为root
设置容器时区为东八区
加入了ssh私钥(拉取git代码的两种方式,基于http和基于ssh)
加入登录harbor的config文件
修改了ssh客户端的配置
安装了一个docker客户端

USER是指使用root这个用户来操作;
config.json是远程仓库的登录认证信息(harbor),jenkins要打包成docker镜像并推送到harbor仓库中;
ADD get-docker.sh /get-docker.sh:非常重要,要在Jenkins装一个docker的客户端?为什么要在Jenkins装一个docker的客户端,因为Jenkins要执行docker build,因为我们需要把镜像拉下来打包成jar包,打包完成之后要把它变成docker镜像,是需要依赖于docker引擎的,但是我们又不能在Jenkins安装docker引擎,只能依赖于宿主机的docker引擎,这里只是在Jenkins中装一个docker的客户端,使之与宿主机的docker引擎能够通信。
echo “ StrictHostKeyChecking no” >> /etc/ssh/ssh_config && get-docker.sh,这一步是优化客户端的config,取消指纹验证(yes/no)

拷贝私钥id_rsa到/data/dockerfile/jenkins目录:cp /root/.ssh/id_rsa .
拷贝docker的配置文件config.json到/data/dockerfile/jenkins:cp /root/.docker/config.json .
获取get-docker.sh:curl -fssL get.docker.com -o get-docker.sh
给执行权限:chmod +x get-docker.sh
image.png

4、制作自定义Jenkins镜像

创建镜像: docker build . -t harbor.jack.com/infra/jenkins:v2.303.1
39f1e6ce0360b3f4f59c41aee68bc9a.png
推送镜像:docker push harbor.jack.com/infra/jenkins:v2.303.1
image.png

一次性运行Jenkins镜像:docker run —rm harbor.jack.com/infra/jenkins:v2.303.1 ssh -i /root/.ssh/id_rsa -T git@gitee.com
(注意:先在gitee上新建分组,添加项目,然后添加deploy key)
image.png
image.png
一般来讲,secret资源分为三种类型。

  • generate:通用型
  • docker-registry
  • TLS型的

5、创建kubernetes名称控件

在运算节点10.4.7.21或10.7.7.22上
kubectl create namespace infra
image.png

kubectl create secret docker-registry harbor —docker-server=harbor.jack.com —docker-username=admin —docker-password=123456 -n infra
在infra这个名称空间创建一个secret资源,把harbor中用到的管理员账号和密码声明出来并创建
image.png

6、准备共享存储

运维主机和所有运算节点上:
yum install nfs-utils -y

在运维主机上:
vi /etc/exports
输入:/data/nfs-volume 10.4.7.0/24(rw,no_root_squash)

mkdir /data/nfs-volume

systemctl start nfs && systemctl enable nfs

7、配置Jenkins资源配置清单

运维主机上
cd /data/k8s-yaml/
mkdir jenkins
cd jenkins

vi dp.yaml
输入:
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: jenkins
namespace: infra
labels:
name: jenkins
spec:
replicas: 1
selector:
matchLabels:
name: jenkins
template:
metadata:
labels:
app: jenkins
name: jenkins
spec:
volumes:
- name: data
nfs:
server: hdss7-200
path: /data/nfs-volume/jenkins_home
- name: docker
hostPath:
path: /run/docker.sock
type: ‘’
containers:
- name: jenkins
image: harbor.jack.com/infra/jenkins:v2.303.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
protocol: TCP
env:
- name: JAVA_OPTS
value: -Xmx512m -Xms512m
volumeMounts:
- name: data
mountPath: /var/jenkins_home
- name: docker
mountPath: /run/docker.sock
imagePullSecrets:
- name: harbor
securityContext:
runAsUser: 0
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
revisionHistoryLimit: 7
progressDeadlineSeconds: 600
*
可以看到上面,用到了nfs卷,server是7-200,而且也指定了path
spec:
volumes:
- name: data
nfs:
server: hdss7-200
path: /data/nfs-volume/jenkins_home
还有一个docker卷,挂载的是hostPath,也就是本机,有可能是7-21,也有可能是7-22,看schedule安排在哪个节点上。而挂载的目录是/run/docker.sock,是Jenkins pod里面的/run/目录下的,这是把docker server socket挂载进来了。

这样Jenkins的docker客户端就能够和宿主机的docker服务端进行socket通信。
- name: docker
hostPath:
path: /run/docker.sock
type: ‘’

而这个imagePullPolicy,有三个选项

  • always:无论如何都要去远程仓库拉镜像
  • never:无论如何都不去拉
  • IfNotPresent:本地不存在则去远程仓库拉

而imagePullSecrets则是上面使用陈述式资源管理命令所创建的secret的名字
kubectl create secret docker-registry harbor ……

  1. imagePullPolicy: IfNotPresent<br /> <br /> imagePullSecrets:<br /> - name: harbor<br />**-------------------------------------------------------------------------------------------------------------------------**<br />vi svc.yaml<br />输入:<br />kind: Service<br />apiVersion: v1<br />metadata: <br /> name: jenkins<br /> namespace: infra<br />spec:<br /> ports:<br /> - protocol: TCP<br /> port: 80<br /> targetPort: 8080<br /> selector:<br /> app: jenkins<br />***************************************************************************************************************<br />targetPort: 8080,这是容器里跑的端口<br />port: 80,监听在cluster-ip的端口,相当于是把容器的8080端口映射到了集群网络的80端口<br />因此,这个80端口要和下面的ingress的端口要匹配上。<br />**-------------------------------------------------------------------------------------------------------------------------**

vi ingress.yaml
输入:
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: jenkins
namespace: infra
spec:
rules:
- host: jenkins.jack.com
http:
paths:
- path: /
backend:
serviceName: jenkins
servicePort: 80
*

创建jenkins目录:mkdir /data/nfs-volume/jenkins_home

修改dns记录,修改的内容如下
[root@hdss7-11 ~]# vim /var/named/jack.com.zone
2020080107; serial
jenkins A 10.4.7.10

systemctl restart named

检查:
[root@hdss7-11 ~]# dig -t A jenkins.jack.com @10.4.7.11 +short
10.4.7.10

回到运算节点:
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.jack.com/jenkins/dp.yaml
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.jack.com/jenkins/svc.yaml
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.jack.com/jenkins/ingress.yaml
image.png

查看pod资源:kubectl get all -n infra
image.png

访问jenkins.jack.com
密码:运维主机: cat /data/nfs-volume/jenkins_home/secrets/initialAdminPassword
4095b9e0abe24a3484bcfe96578bef63
image.png

8、验证jenkins配置是否正确
image.png

进入容器输入:
1、whoami
image.png
2、date
image.png
3、docker ps -a
image.png
4、docker login harbor.jack.com
image.png
5、ssh -i /root/.ssh/id_rsa -T git@gitee.com
image.png

jenkins调整配置

af0634f626cb6b2e70fd55cbe5ee29b.png
安装blue ocean
image.png