K8S安装Jenkins

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容