1.Docker源查找
目前我们没有自己的镜像服务器,使用的是公开镜像仓库,我们安装Jenkins前要先搜索到该镜像源:
通常我们采用 docker search命令搜索镜像,但该命令不能返回版本信息,如果要安装特定版本基本靠猜
[root@k8s-master data]# docker search jenkins
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
jenkins Official Jenkins Docker image 4688 [OK]
jenkins/jenkins The leading open source automation server 1944
jenkinsci/blueocean https://jenkins.io/projects/blueocean 500
jenkinsci/jenkins Jenkins Continuous Integration and Delivery … 378
jenkinsci/jnlp-slave A Jenkins slave using JNLP to establish conn… 121 [OK]
小技巧:
163镜像仓库我们可以用下面这个地址搜索其软件版本
https://hub-mirror.c.163.com/v2/library/软件名/tags/list
如:https://hub-mirror.c.163.com/v2/library/jenkins/tags/list
中国科技大学镜像库可以用下面的地址获取版本https://docker.mirrors.ustc.edu.cn/v2/library/jenkins/tags/list
然后可以查看目前其提供的版本清单,拼接成镜像源地址就可以这样下载
docker pull docker.mirrors.ustc.edu.cn/library/jenkins:2.7.4
docker pull docker.mirrors.ustc.edu.cn/library/jenkins:latest
注意:经过笔者测试国内镜像中存在的版本更新不够及时,科技大学的jenkins镜像我们pull下来最新版本后,发现其更新日期是20个月前。
docker.mirrors.ustc.edu.cn/library/jenkins latest cd14cecfdb3a 20 months ago 696MB
通过docker inspect imageId 看出其版本是2.60.3,不建议采用该过旧的镜像,否则可能会导致插件无法安装。
"JENKINS_VERSION=2.60.3",
我们可以提前下载镜像,也可以在Yaml文件中指定完整的镜像路径
镜像提前pull下来可以使K8S创建pod时快一些,否则k8s会在启动pod前自行下载,比较耗时。
[root@k8s-node2 ~]# docker pull jenkins/jenkins:lts #下载最新版本
不要使用jenkins/jenkins:latest,所说不受官方支持,推荐使用 jenkins/jenkins:lts
2.准备Yaml文件
我们环境目前有三台机器
name | IP | 数量 |
---|---|---|
k8s-master | 192.168.0.66 | Master节点 |
k8s-node1 | 192.168.0.137 | 工作节点1 |
k8s-node2 | 192.168.0.230 | 工作节点2 |
我们希望jenkins安装在k8s-node1这台机器上。
k8s会对其环境中的节点自动加上标签,你也可以自行添加很多标签上去,标签是key/value模式,有了标签后,我们可以根据标签进行资源的自动选择。
查看node节点的标签
[root@k8s-master k8s]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s-master Ready master 26h v1.15.9 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
k8s-node1 Ready <none> 26h v1.15.9 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux
k8s-node2 Ready <none> 26h v1.15.9 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux
通过上面分析我们看出
node1有一个区别于其他节点的标签(这个是k8s默认为每一节点创建的标签):kubernetes.io/hostname=k8s-node1
由于jenkins是使用容器安装,我们需要将Jenkins的数据文件映射到主机磁盘目录,下面我们先在k8s-node1上创建这些目录
mkdir /data
mkdir /data/docker
mkdir /data/docker/jenkins
mkdir /root/CICD
mkdir /root/.m2
YAML文件编写
注意Yaml文件中 nodeSelector:kubernetes.io/hostname: k8s-node2 是前面的标签,要根据自己的环境替换,否则会找不到节点报错
#定义命名空间
apiVersion: v1
kind: Namespace
metadata:
name: my-system
labels:
app.kubernetes.io/name: my-system
app.kubernetes.io/part-of: my-system
---
#定义部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-jenkins
namespace: my-system
spec:
selector:
matchLabels:
app: my-jenkins
replicas: 1
#serviceName: my-jenkins
template:
metadata:
labels:
app: my-jenkins
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1 #标签筛选,固定哪个节点上安装
volumes:
- name: jenkins-home
hostPath:
path: /data/docker/jenkins #宿主机目录
- name: script
hostPath:
path: /root/CICD #宿主机目录
- name: maven
hostPath:
path: /root/.m2 #宿主机目录
containers:
- name: my-jenkins
image: jenkins/jenkins:lts #jenkins的image路径,也可以指定使用私有仓库地址
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
volumeMounts:
- mountPath: /var/jenkins_home
name: jenkins-home
- mountPath: /root/CICD
name: script
- mountPath: /root/.m2
name: maven
---
#定义service访问
apiVersion: v1
kind: Service
metadata:
name: my-jenkins
namespace: my-system
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 8080
nodePort: 30800
selector:
app: my-jenkins
以上文件内容使用记事本编辑,保存成jenkins.yaml,然后上传到master节点
master节点执行以下命令:
mkdir /data/k8s #所有的yaml文件都放在这个目录便于管理
cd /data/k8s
rz #上传命令,选择jenkins.yaml文件上传
3.进行安装
#master节点yaml文件创建好后,执行如下命令:
cd /data/k8s #进入yaml文件所在目录
kubectl apply -f jenkins.yaml #使用yaml文件安装
-----------返回下面信息说明yaml文件没有问题 k8s已创建jenkis-------------
namespace/my-system created
deployment.apps/my-jenkins created
service/my-jenkins created
我们使用以下命令查看pod是否创建成功
[root@k8s-master k8s]# kubectl get pods -n my-system
NAME READY STATUS RESTARTS AGE
my-jenkins-66d9776688-5b7vg 0/1 Error 6 5m52s
几分钟后,完全没有意外,没创建成功,报了Eroor,我们登录Dashboard界面查看
选择命名空间,再点击容器组进去看日志
发现日志提示如下错误信息:
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
很明显,是映射到宿主机的目录,容器无访问宿主机目录的权限
#我们切换到node1节点,对目录授权
chmod 777 /data/docker/jenkins/
#授权后到master节点卸载之前的安装,再重新执行安装
kubectl delete -f jenkins.yaml #卸载
kubectl apply -f jenkins.yaml #安装
再次查看pod状态,发现已经是Running状态
[root@k8s-master k8s]# kubectl get pods -n my-system
NAME READY STATUS RESTARTS AGE
my-jenkins-66d9776688-s4jzr 1/1 Running 0 5s
4.初始化Jenkins
完成安装后,浏览器打开jenkins
http://服务器:30800
第一次打开时,界面会提示要去var/jenkins_home/secrets/initialAdminPassword目录找初始密码。
注意该目录是指docker容器里的目录,不过我们可以在宿主机上直接看,路径要加上我们之前映射的目录 /data/docker/jenkins
到node1节点,查看初始密码,命令如下
[root@k8s-node1 ~]# cat /data/docker/jenkins/secrets/initialAdminPassword
----下面这个就是初始密码----
12349c94011747df8222f2278f9bc311
使用该密码登录后,我们可以初始化并安装一些常用插件,插件是在线下载安装,这个过程预计需要半小时左右。
安装完毕后创建一个管理用户
如果要使用jenkins API自行开发,则需要把跨域勾掉。
4.小结
yaml文件要使用NodePort将应用映射到宿主机IP及端口方可正常访问(如果不映射,你需要通过Nginx或其他代理软件配置路由访问)
docker目录映射到宿主机目录是为了将数据永久存储,如果不映射,则重启docker数据丢失,映射时注意对宿主机目录授权,否则会导致无权访问。
Jenkins使用docker安装时要注意镜像源的版本,旧的版本可能会导致插件无法正常安装使用。
另外如果插件安装有问题可参考这篇:
https://www.cnblogs.com/sxdcgaq8080/p/10489326.html