美文网首页
K8S安装Jenkins

K8S安装Jenkins

作者: 上岸的魚 | 来源:发表于2020-03-12 22:06 被阅读0次

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

相关文章

网友评论

      本文标题:K8S安装Jenkins

      本文链接:https://www.haomeiwen.com/subject/ankbjhtx.html