1. k8s环境:
  2.  
  3. 192.168.0.91 master
  4.  
  5. 192.168.0.92 node
  6.  
  7. 192.168.0.96 gitlab
  8.  
  9. 192.168.0.98 harbor
  10.  
  11. k8s集群安装请参照:https://www.cnblogs.com/effortsing/p/10312081.html
  12.  
  13. gitlab安装请参照:https://www.cnblogs.com/effortsing/p/10012158.html
  14.  
  15. arbor安装请参照:https://www.cnblogs.com/effortsing/p/10061096.html
  1.  

配置jenkins主机上的docker可以登录harbor仓库并且上传镜像到harbor仓库:参照:https://www.cnblogs.com/effortsing/p/10061096.html

  1.  
  1. 下面所有操作都是在node节点:192.168.0.92上进行
  2.  
  3. 1、生成自定义Jenkins master镜像
  4.  
  5. 原始的Jenkins master镜像并不符合我们当前需求,所以在原始镜像的基础上做了一些改变,这一步并不是必须的,主要是看具体需求
  6.  
  7. 下载原始镜像
  8.  
  9. 链接:https://pan.baidu.com/s/14z5BnFAXYoMnDoXbiNgmuQ
  10. 提取码:ecsq
  11.  
  12. 导入镜像
  13.  
  14. docker load < jenkinsci.tar
  15.  
  16. 查看镜像
  17.  
  18. [root@test2 ~]# docker images
  19. jenkinsci/jenkins latest b589aefe29ff 3 months ago 703 MB
  20.  
  21. 编写Dockerfile

cat>/home/jenkins-dockerfile/Dockerfile <<EOF
FROM jenkinsci/jenkins
USER root
RUN apt-get update && apt-get install -y libltdl7.*
RUN apt-get install maven -y

RUN apt-get install git -y
ARG dockerGid=999
RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group
RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
RUN mkdir -p /opt/maven/repository
RUN mkdir -p /ceph/maven/repository
EOF

  1.  
  2. Dockerfile所做的工作为:
  3.  
  4. 安装Maven
  5.  
  6. 配置Maven仓库位置,以便启动时挂载宿主机仓库为容器中Maven仓库
  7.  
  8. 设置启动用户为root
  9.  
  10. jenkins加入docker组,否则无法使用宿主机的docker
  11.  
  12. 安装libltdl7.* 库,否则无法使用宿主机的docker
  13.  
  14. 构建镜像
  15.  
  16. docker build -t jenkinsci/jenkins:v1 /home/jenkins-dockerfile/
  17.  
  18. Jenkins启动YAML配置文件
  19.  
  20. jenkins命令空间创建
  21.  
  22. cat >namespace-jenkins.yaml<<EOF
  23. apiVersion: v1
  24. kind: Namespace
  25. metadata:
  26. name: jenkins
  27. labels:
  28. name: jenkins
  29. EOF
  30.  
  31. Jenkins 权限配置
  32.  
  33. 此处直接将jenkins-admin集成了cluster-admin权限,可根据自己具体需要进行权限的设置
  34.  
  35. cat>jenkins-account.yaml<<EOF
  36. apiVersion: v1
  37. kind: ServiceAccount
  38. metadata:
  39. labels:
  40. k8s-app: jenkins
  41. name: jenkins-admin
  42. namespace: jenkins
  43.  
  44. ---
  45. kind: ClusterRoleBinding
  46. apiVersion: rbac.authorization.k8s.io/v1beta1
  47. metadata:
  48. name: jenkins-admin
  49. labels:
  50. k8s-app: jenkins
  51. subjects:
  52. - kind: ServiceAccount
  53. name: jenkins-admin
  54. namespace: jenkins
  55. roleRef:
  56. kind: ClusterRole
  57. name: cluster-admin
  58. apiGroup: rbac.authorization.k8s.io
  59. EOF
  60.  
  61. Jenkins Deployment配置
  62.  
  63. 此处配置简单明了,需要说明的地方是挂在卷,此处挂载了四个目录,下面分别做出挂载原因:
  64.  
  65. /var/jenkins_home(容器) –> /ceph/jenkins_home(宿主机)
  66. 我们需要将容器中的Jenkins源目录挂载导本地宿主机,因为该目录下保存了Jenkins产生的所有配置、我们的自定义配置、任务配置及详情等等信息,>所以需要持久化导宿主机,以便重新启动Jenkins容器的时候能够找到相应数据,防止数据丢失。此处我们使用的ceph,保证整个kubernetes集群所有机
  67. 器能够共享同一个目录。
  68.  
  69. /opt/maven/repository(容器) –> /ceph/maven/repository(宿主机)
  70. 这一对挂载目录是Maven仓库的挂载目录,不管是Jenkins master容器或者是Jenkins slave目录都需要挂载该目录,以便容器中maven能够在下载编译代
  71. 码时能够从该仓库中找到相应Jar包,同时也保证了数据的持久化。
  72.  
  73. /usr/bin/docker(容器) –> /usr/bin/docker(宿主机)
  74. /var/run/docker.sock(容器) –> /var/run/docker.sock(宿主机)
  75. 这两对挂载目录作用是能够在容器中操作宿主机docker,具体的用途是在slave容器中编辑maven代码并生成jar之后,需要生成该代码服务的docker镜像
  76. 并上传至本地私有仓库。因此需要操作宿主机docker以便完成这一系列操作
  77. ---------------------
  78.  
  79. cat>jenkins-deployment.yaml<<EOF
  80. apiVersion: apps/v1beta2
  81. kind: Deployment
  82. metadata:
  83. name: jenkins
  84. namespace: jenkins
  85. labels:
  86. k8s-app: jenkins
  87. spec:
  88. replicas: 1
  89. selector:
  90. matchLabels:
  91. k8s-app: jenkins
  92. template:
  93. metadata:
  94. labels:
  95. k8s-app: jenkins
  96. spec:
  97. containers:
  98. - name: jenkins
  99. image: jenkinsci/jenkins:v1
  100. imagePullPolicy: IfNotPresent
  101. volumeMounts:
  102. - name: jenkins-home
  103. mountPath: /var/jenkins_home
  104. - name: maven-repository
  105. mountPath: /opt/maven/repository
  106. - name: docker
  107. mountPath: /usr/bin/docker
  108. - name: docker-sock
  109. mountPath: /var/run/docker.sock
  110. ports:
  111. - containerPort: 8080
  112. - containerPort: 50000
  113. volumes:
  114. - name: jenkins-home
  115. hostPath:
  116. path: /ceph/jenkins_home
  117. - name: maven-repository
  118. hostPath:
  119. path: /ceph/maven/repository
  120. - name: docker
  121. hostPath:
  122. path: /usr/bin/docker
  123. - name: docker-sock
  124. hostPath:
  125. path: /var/run/docker.sock
  126. serviceAccountName: jenkins-admin
  127. EOF
  128.  
  129. Jenkins Service配置
  130.  
  131. Service配置作用是能够让用户访问到Jenkins。此处开放并配置了808032000端口,这两个端口在Deployment
  132. 中也应该开放。此处配置的宿主机开放端口分别为:3188832000
  133.  
  134. cat>jenkins-service.yaml<<EOF
  135. kind: Service
  136. apiVersion: v1
  137. metadata:
  138. labels:
  139. k8s-app: jenkins
  140. name: jenkins
  141. namespace: jenkins
  142. annotations:
  143. prometheus.io/scrape: 'true'
  144. spec:
  145. ports:
  146. - name: jenkins
  147. port: 8080
  148. nodePort: 31888
  149. targetPort: 8080
  150. - name: jenkins-agent
  151. port: 50000
  152. nodePort: 50000
  153. targetPort: 50000
  154. type: NodePort
  155. selector:
  156. k8s-app: jenkins
  157. EOF
  158.  
  159. 启动Jenkins镜像容器
  160.  
  161. kubectl create -f namespace-jenkins.yaml
  162. kubectl apply -f jenkins-account.yaml
  163. kubectl apply -f jenkins-deployment.yaml
  164. kubectl apply -f jenkins-service.yaml
  165.  
  166. 2、生成自定义Jenkins slave镜像
  167.  
  168. 需要使用官方镜像cnych-jenkins,其他的镜像里面都没有kubectl工具,都试过。我这里把官方镜像存到网盘里面了,方便以后使用
  169.  
  170. 下载带kubectljenkins镜像

链接:https://pan.baidu.com/s/1RyxKgbHLFTLYqH6ndA_tAg
提取码:7sy3

  1. 导入镜像
  2.  
  3. docker load < cnych-jenkins-jnlp.tar
  4.  
  5. 编写Dockerfile 

cat>/home/jenkins-dockerfile/Dockerfile <<EOF
FROM cnych/jenkins:jnlp
USER root
RUN apt-get update && apt-get install -y libltdl7.*
RUN apt-get install maven -y

RUN apt-get install git -y
ARG dockerGid=999
RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group
RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
RUN mkdir -p /opt/maven/repository
RUN mkdir -p /ceph/maven/repository
EOF

  1. Dockerfile所做的工作为:
  2.  
  3. 安装Maven
  4.  
  5. 配置Maven仓库位置,以便启动时挂载宿主机仓库为容器中Maven仓库
  6.  
  7. 设置启动用户为root
  8.  
  9. 构建镜像
  10.  
  11. docker build -t cnych/jenkins:v1 /home/jenkins-dockerfile/
  12.  
  13. 查看镜像
  14.  
  15. [root@test2 ~]# docker images
  16. REPOSITORY TAG IMAGE ID CREATED SIZE
  17. cnych/jenkins v1 969993fe2aa9 23 seconds ago 2.2 GB
  18. jenkinsci/jenkins v1 2114cb298e17 About an hour ago 1.41 GB
  19. cnych/jenkins jnlp a430a5795102 12 days ago 628 MB
  20. jenkinsci/jenkins latest b589aefe29ff 3 months ago 703 MB
  21. coredns/coredns 1.2.0 da1adafc0e78 7 months ago 34.2 MB
  22. infoblox/dnstools latest d0cee038721f 8 months ago 15.7 MB
  23. registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel v0.10.0-amd64 b949a39093d6 10 months ago 44.6 MB
  24. registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64 3.1 da86e6ba6ca1 14 months ago 742 kB
  25.  
  26. 3、访问并操作Jenkins-master
  27.  
  28. 访问jenkins
  29.  
  30. http://192.168.0.92:31888
  31.  
  32. 查看密码
  33.  
  34. [root@test2 ~]# docker ps -l
  35. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  36. 6f8a62f8a0f7 2114cb298e17 "/sbin/tini -- /us..." About an hour ago Up About an hour k8s_jenkins_jenkins-7b46757695-4hx6f_jenkins_e8cb1035-3fe6-11e9-a258-000c2980fc47_0
  37.  
  38. docker exec 6f8a62f8a0f7 cat /var/jenkins_home/secrets/initialAdminPassword
  39. 471234cd0eb44ec3bfc4015fbacd599b
  40.  
  41. 然后会要求安装一些插件,这里选择默认安装,否则下一步打开是空白页
  42.  
  43. 设置登录用户名密码:
  44.  
  45. admin/jenkins@123
  46.  
  47. 这时候会跳转到首页, 此时Jenkins就可以真正使用了:
  48.  
  49. jenkins进行升级
  50.  
  51. 重启jenkins(有点慢,等5分钟)
  52.  
  53. 刷新网页重新登录
  54.  
  55. admin/471234cd0eb44ec3bfc4015fbacd599b
  56.  
  57. 查看更新后的版本
  58.  
  59. 重置admin密码
  60.  
  61. 进入首页-》系统管理-》全局安全配置
  62.  
  63. 把“启用安全”勾上和把Jenkins专有用户数据库勾上、允许用户注册勾上-》保存
  64.  
  65. 点击右上角的admin-》设置-》修改里面的密码为(jenkins@123)-》保存-》重新登录-》输入账号密码
  66.  
  67. 需要安装的插件
  68. Kubernetes Cli Plugin:该插件可直接在Jenkins中使用kubernetes命令行进行操作。
  69.  
  70. Kubernetes plugin 使用kubernetes则需要安装该插件
  71.  
  72. Kubernetes Continuous Deploy Pluginkubernetes部署deploymrnt.yaml 时候需要使用
  73.  
  74. 进入首页-》系统管理-》插件管理-》可选插件-》输入kubernetes-》选中所有带kubernetes的插件进行安装-》安装完返回首页
  75.  
  76. 查看所有带kubernetes的插件是否安装上
  77.  
  78. 进入首页-》系统管理-》插件管理-》已安装-》输入kubernetes-》
  79.  
  80. 也可登录该网站:https://plugins.jenkins.io/,查找需要的插件
  81.  
  82. 增加一个kubernetes
  83.  
  84. 点击 系统管理->系统设置,往下拉可看到云,点击新增一个云来新增一个kubernetes
  85.  
  86. 配置jenkins连接kubernetes
  87.  
  88. 请参照:https://www.cnblogs.com/effortsing/p/10013441.html
  89.  
  90. 配置Kubernetes Pod Template
  91.  
  92. 其实就是配置Jenkinsjnlp-slave
  93.  
  94. 在该kubernetes云下,新增Kubernetes Pod Template,配置一个模板容器配置,如下图所示:
  95.  

  96.  
  97. 配置镜像,下面里面的镜像一定要写对,否则写成别的镜像,到最后编译时候就一直报错没有mvn
  98.  
  99.  
  100. 配置卷:就是deployment.yaml 里面的挂载路径
  101.  

  102.  
  103. 全局配置(非必须)
  104.  
  105. 点击 系统管理->系统设置,下拉找到全局属性,可根据需要配置Java环境变量、Maven环境变量
  106.  
  107. 全局工具配置
  108.  
  109. 点击 系统管理->全局工具配置,此处可配置配置一些常用的工具配置,比如javaantmavendocker
  110.  
  111. 参照:https://www.cnblogs.com/effortsing/p/10375689.html
  112.  
  113. 4、创建Pipeline测试任务
  114.  
  115. Pipeline任务采用流式的处理方法,步骤清晰,非常适合进行任务配置。点击新建 创建一个Pipeline任务
  116.  
  117. 创建完成后,会进入任务配置界面,下拉找到Pipeline(中文版为:流水线),则可编写Pipeline,进行任务配置
  118.  
  119. 下面pipline里面的简单任务:查看slave镜像里面是否有java的家目录、查看maven的版本等操作,
  120.  
  121. def label = "jnlp-slave"
  122. podTemplate(label: label, cloud: 'kubernetes',containers: [
  123. containerTemplate(name: 'jnlp-slave', image: 'cnych/jenkins:v1')
  124. ],
  125. volumes: [hostPathVolume(mounntPath:'/opt/maven/repository',hostPath:'/ceph/maven/repository'),
  126. hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'),
  127. hostPathVolume(mounntPath:'/var/run/docker.sock',hostPath:'/var/run/docker.sock')]) {
  128. node(label) {
  129. stage('Get a Maven project') {
  130. container(label) {
  131. stage('wait for exec check'){
  132. sh 'sleep 1'
    sh 'echo $JAVA_HOME'
    sh 'mvn -v'
  133. }
  134.  
  135. stage('get maven env') {
  136. sh 'cat /etc/resolv.conf'
  137. sh 'cat /etc/issue'
  138. sh 'uname -a'
  139. sh 'env'
  140. }
  141.  
  142. }
  143. }
  144. }
  145. }
  146.  
  147. 查看pod个数:

[root@test2 ~]# kubectl get pod -n jenkins
NAME READY STATUS RESTARTS AGE
jenkins-7b46757695-5k5lg 1/1 Running 0 4h

  1. 开始构建
  2.  


  3.  
  4. 查看pod个数:
  5.  
  6. 发现多了一个pod

[root@test2 ~]# kubectl get pod -n jenkins
NAME READY STATUS RESTARTS AGE
jenkins-7b46757695-5k5lg 1/1 Running 0 4h
jnlp-slave-65srw 2/2 Running 0 23s

  1. 构建成功如下图:
  2.  
  3.  
  4. 查看pod个数

  5. [root@test2 ~]# kubectl get pod -n jenkins

NAME READY STATUS RESTARTS AGE
jenkins-7b46757695-5k5lg 1/1 Running 0 4h
jnlp-slave-65srw 2/2 Terminating 0 31s

  1.  
  1. 再次查看pod个数:发现消失
  2.  
  3. 从上边的pod个数变化中,我们可以清晰的看到 Jenkins Slave 自动创建到注销删除的过程,整个过程是自动完成的,不需要人工干预。

[root@test2 ~]# kubectl get pod -n jenkins
NAME READY STATUS RESTARTS AGE
jenkins-7b46757695-5k5lg 1/1 Running 0 4h

  1.  
  1. 4、配置容器版jenkins使用宿主机的kubectl命令
  2.  
  3. 4.1slave镜像需要使用cnych/jenkins:jnlp,这个官方镜像里面有kubectl工具,其他的没有,都试过,上面就是用的这个镜像,所以直接下一步
  4.  
  5. 4.2、挂载kubectl工具
  6.  
  7. /root/.kube 目录,我们将这个目录挂载到容器的 /home/jenkins/.kube 目录下面这是为了让我们能够在 Pod 的容器中能够使用 kubectl 工具来访问我们的 Kubernetes 集群,
  8.  
  9. 方便我们后面在 Slave Pod 部署 Kubernetes 应用。添加一个挂在路径,如下图所示:

  10.  
  11. 4.3pipline脚本如下:
  12.  
  13. 先试试是否能使用宿主机的kubectl命令,只查看一个pod情况:
  14.  
  15. def label = "jnlp-slave"
  16. podTemplate(label: label, cloud: 'kubernetes',containers: [
  17. containerTemplate(name: 'jnlp-slave', image: 'cnych/jenkins:v1')
  18. ],
  19. volumes: [hostPathVolume(mounntPath:'/opt/maven/repository',hostPath:'/ceph/maven/repository'),
  20. hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'),
  21. hostPathVolume(mounntPath:'/var/run/docker.sock',hostPath:'/var/run/docker.sock'),
  22. hostPathVolume(mounntPath:' /home/jenkins/.kube',hostPath:'/root/.kube')]) {
  23. node(label) {
  24. stage('Get a Maven project') {
  25. container(label) {
  26. stage('wait for exec check'){
  27. sh 'kubectl get pod -n jenkins'
  28. }
  29.  
  30. }
  31. }
  32. }
  33. }
  34.  
  35. 4.4、点击开始构建,如下图所示:



  36. 4.5、查看控制台输出,如下图所示:

  1.  

  1.  
  1.  
  1. 5、使用jenkins-salve创建一个nignx项目pod
  2.  
  3. 5.1、导入nginx镜像
  4.  
  5. 下载镜像:链接:https://pan.baidu.com/s/1ZvjakBRYNWN3FFSIz0O78g
  6. 提取码:8nfj
  7.  
  8. rz nginx.tar
  9.  
  10. docker load < nginx.tar
  11.  
  12. 5.2pipline脚本如下:
  13.  
  14. def label = "jnlp-slave"
  15. podTemplate(label: label, cloud: 'kubernetes',containers: [
  16. containerTemplate(name: 'jnlp-slave', image: 'cnych/jenkins:v1')
  17. ],
  18. volumes: [hostPathVolume(mounntPath:'/opt/maven/repository',hostPath:'/ceph/maven/repository'),
  19. hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'),
  20. hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'),
  21. hostPathVolume(mounntPath:' /home/jenkins/.kube',hostPath:'/root/.kube')]) {
  22. node(label) {
  23. stage('create a pod') {
  24. container(label) {
  25. stage('cat the pod'){
  26. sh 'kubectl get pod -n jenkins'
  27. }
  28.  
  29. stage('create the deploy-nginx.yaml'){
  30. echo 'create the deploy-nginx.yaml'
  31. sh '''
  32. cat >deploy-nginx.yaml<<EOF
  33. apiVersion: extensions/v1beta1
  34. kind: Deployment
  35. metadata:
  36. name: http-test-dm2
  37. spec:
  38. replicas: 1
  39. template:
  40. metadata:
  41. labels:
  42. name: http-test-dm2
  43. spec:
  44. containers:
  45. - name: http-test-con
  46. image: nginx
  47. imagePullPolicy: Never
  48. ports:
  49. - containerPort: 80
  50. ---
  51. apiVersion: v1
  52. kind: Service
  53. metadata:
  54. name: http-nginx-ser
  55. spec:
  56. type: NodePort
  57. ports:
  58. - port: 80
  59. nodePort: 31000
  60. targetPort: 80
  61. selector:
  62. name: http-test-dm2
  63. ---
  64. apiVersion: extensions/v1beta1
  65. kind: Ingress
  66. metadata:
  67. name: nginx
  68. spec:
  69. rules:
  70. - host: www.nginx2.com
  71. http:
  72. paths:
  73. - path: /
  74. backend:
  75. serviceName: http-nginx-ser
  76. servicePort: 80
  77. EOF
  78.  
  79. '''
  80. }
  81. stage('deploy to k8s'){
  82. sh 'kubectl create -f deploy-nginx.yaml'
  83.  
  84. }
  85.  
  86. }
  87. }
  88. }
  89. }
  90.  
  91. 5.3、点击开始构建,如下图所示:
  92.  
  93.  
  94. 5.4、查看构建好的podpod默认会放在在上面第3步中配置的命名空间下,
  95.  
  96. [root@test2 ~]# kubectl get pod -n jenkins
  97. NAME READY STATUS RESTARTS AGE
  98. http-test-dm2-b9776b68c-8b7tk 1/1 Running 0 18s
  99. jenkins-7b46757695-5k5lg 1/1 Running 6 13d
  100. jnlp-slave-pzwtc 2/2 Terminating 0 31s
  101. [root@test2 ~]# kubectl get pod -n jenkins
  102. NAME READY STATUS RESTARTS AGE
  103. http-test-dm2-b9776b68c-8b7tk 1/1 Running 0 1m
  104. jenkins-7b46757695-5k5lg 1/1 Running 6 13d
  105.  
  106. 从上面看到:http-test-dm2-b9776b68c-8b7tk 这就是刚创建的nginx容器
  107.  
  108. 5.4、测试访问nginx,如下图所示:
  109.  
  110. http://192.168.0.92:31000

  1.  
  1. 6、使用jenkins-salve创建一个solo开源博客项目pod(看视频是使用下面方式部署的,)
  2.  
  3. 参照:https://www.cnblogs.com/effortsing/p/10468840.html
  4.  
  5. 6.1、配置jenkins-slave主机节点可以免密登录harbor仓库
  6.  
  7. 参照:https://www.cnblogs.com/effortsing/p/10060748.html
  8.  
  9. 6.2、配置jenkins-slave主机节点上的docker可以登录harbor仓库并且上传镜像到harbor仓库
  10.  
  11. 参照:https://www.cnblogs.com/effortsing/p/10061096.html
  12.  
  13. 6.3、配置jenkins全局工具:添加git工具
  14.  
  15. 进入jenkins界面的全局工具配置里面选择自动安装git工具,目的是拉取gitlab代码
  16.  
  17. 6.4、配置jenkins全局工具:配置jdkmaven家目录,参照:https://www.cnblogs.com/effortsing/p/10480972.html
  18.  
  19. 6.5、配置jenkins全局工具:添加settings.xmlMaven Configuration -> Settings file in filesystem -> File Path /usr/share/maven/conf/settings.xml

  20. setting.xml需要进到容器里面查看所在的位置,添加操作如下图所示:
  21.  
  22.  
  23. 6.6 安装Pipeline Maven Integration 插件
  24.  
  25. 6.7、下载solo源码包、修改代码访问地址、推送到gitlab代码仓库中,参照:https://www.cnblogs.com/effortsing/p/10468840.html
  26.  
  27. 6.8、配置jenkins-masterjenkins-slave主机上的git秘钥到gitlab上实现拉取代码功能, 参照:https://www.cnblogs.com/effortsing/p/10482792.html
  28.  
  29. 6.9、生成pipeline可以用的git链接地址,写到pipline脚本中,这样在pipline脚本才可以从gitlab上拉取代码
  30.  
  31. 参照:https://www.cnblogs.com/effortsing/p/10468840.html 里面的步骤
  32.  
  33. 6.10、编写pipline脚本如下:
  34.  
  35. 注意下面pipline脚本里面的 maven build步骤,里面的JAVA_HOMEmvn工具 都是jenkins-slave里面的,而不是jenkins-master里面的工具,
  36.  
  37. 如何查看jenkins-slave里面JAVA_HOME位置:只有通过构建的时候,在pipline里面写shell命令进行查看,因为制作jenkins-slave镜像的基础
  38.  
  39. 镜像是从官方镜像拉取的,而这个官方jenkins-slave镜像是不能独立启动的,试过,用docker无法启动,只能当slave使用。但是为什么还要用这个
  40.  
  41. 镜像,就是因为这个基础镜像里面包含kubectl工具, 自己之前尝试往jenkins-master镜像里面添加kubectl工具,但是失败,
  42.  
  43. 注意:下面piplene里面的第三个stage步骤里面的JAVA_HOME路径是第一个stage步骤mvn -v 得到的结果有java路径,要填写这个,不要填写echo $JAVA_HOME得到的结果
  44.  
  45. 先编译构建一下,然后得到mvn -v 结果后,及时暂停,然后把java路径填写到第三个stage步骤里面,从新编译打包
  46.  
  47. def label = "jnlp-slave"
  48. podTemplate(label: label, cloud: 'kubernetes',containers: [
  49. containerTemplate(name: 'jnlp-slave', image: 'cnych/jenkins:v1')
  50. ],
  51. volumes: [hostPathVolume(mounntPath:'/opt/maven/repository',hostPath:'/ceph/maven/repository'),
  52. hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'),
  53. hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'),
  54. hostPathVolume(mounntPath:' /home/jenkins/.kube',hostPath:'/root/.kube')]) {
  55. node(label) {
  56. stage('create a pod') {
  57. container(label) {
  58. stage('cat the pod'){
  59. sh 'kubectl get pod -n jenkins'
    sh 'echo $JAVA_HOME'
    sh 'mvn -v'
  60. }
  61. stage('git checkout'){
  62.  
  63. echo 'git clone'
  64. checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c2ca4523-96d0-4fdc-a427-bfefc36a3aa5', url: 'http://192.168.0.96:8081/root/hello.git']]])
  65.  
  66. }
  67.  
  68. stage('maven build'){
  69.  
  70. echo 'maven build'
  71. sh '''
  72. export JAVA_HOME=/usr/local/newhope/java1.8
  73. /usr/bin/mvn clean package -Dmaven.test.skip=true
  74. '''
  75.  
  76. }
  77.  
  78. stage('docker build and push images'){
  79.  
  80. echo 'docker build and push images'
  81. sh '''
  82. REPOSITORY=192.168.0.98:5000/library/solo/solo:${Tag}
  83. cat >Dockerfile<<EOF
  84. FROM 192.168.0.98:5000/library/tomcat-85:latest
  85. RUN rm -rf /usr/local/tomcat/webapps/ROOT/
  86. COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
  87. WORKDIR /usr/local/tomcat
  88. EXPOSE 8080
  89. CMD ["./bin/catalina.sh", "run"]
  90. EOF
  91. docker build -t $REPOSITORY .
  92. docker login -u admin -p Harbor12345 192.168.0.98:5000
  93. docker push $REPOSITORY
  94. '''
  95. }
  96.  
  97. stage('create the deploy-solo.yaml'){
  98. echo 'create the deploy-solo.yaml'
  99. sh '''
  100. REPOSITORY=192.168.0.98:5000/library/solo/solo:${Tag}
  101. cat >deploy-solo.yaml<<EOF
  102. apiVersion: extensions/v1beta1
  103. kind: Deployment
  104. metadata:
  105. name: http-solo-dm2
  106. spec:
  107. replicas: 1
  108. template:
  109. metadata:
  110. labels:
  111. name: http-solo-dm2
  112. spec:
  113. containers:
  114. - name: http-solo-con
  115. image: $REPOSITORY
  116. imagePullPolicy: Never
  117. ports:
  118. - containerPort: 80
  119. ---
  120. apiVersion: v1
  121. kind: Service
  122. metadata:
  123. name: http-solo-ser
  124. spec:
  125. type: NodePort
  126. ports:
  127. - port: 8080
  128. nodePort: 33580
  129. targetPort: 8080
  130. selector:
  131. name: http-solo-dm2
  132. ---
  133. apiVersion: extensions/v1beta1
  134. kind: Ingress
  135. metadata:
  136. name: solo
  137. spec:
  138. rules:
  139. - host: www.solo.com
  140. http:
  141. paths:
  142. - path: /
  143. backend:
  144. serviceName: http-solo-ser
  145. servicePort: 8080
  146. EOF
  147.  
  148. '''
  149. }
  150. stage('deploy to k8s'){
  151. sh 'kubectl create -f deploy-solo.yaml'
  152.  
  153. }
  154.  
  155. }
  156. }
  157. }
  158. }
  159.  

上面pipline脚本做的事情如下:

查看JAVA_HOME

查看maven版本

  1.  

拉取代码:git checkout

  1.  

编译打包:maven build

  1.  

构建并推送镜像:docker build and push images

  1.  

创建yaml文件:create the deploy-solo.yaml

  1.  

部署到k8s集群里面:deploy to k8s

  1. 6.11、启用Tag标签,参照:https://www.cnblogs.com/effortsing/p/10468840.html 里面的步骤
  2.  
  3. 6.12、开始构建,参照:https://www.cnblogs.com/effortsing/p/10468840.html 里面的步骤
  4.  

6.13、构建成功如下图所示:

  1.  

  1.  

6.14、查看harbor仓库,多出来个镜像,如下图所示

  1.  

http://192.168.0.98:5000

  1.  

6.15、查看pod,多出来个pod,但不是Running状态

  1.  

[root@test2 ~]# kubectl get pod -n jenkins
NAME                   READY         STATUS           RESTARTS          AGE
http-solo-dm2-76676d9cfc-vh6gg   0/1               CrashLoopBackOff      6                      7m
jenkins-7b46757695-tjh2j         1/1               Running               2                      11h

  1.  

查看报错日志如下:

  1.  

kubectl logs -f pods/http-solo-dm2-76676d9cfc-vh6gg -n jenkins

  1.  

[ERROR]-[2019-03-25 13:25:04]-[org.b3log.latke.Latkes:836]: Read skin [Jane]'s configuration failed: null
[ERROR]-[2019-03-25 13:25:04]-[org.b3log.solo.SoloServletListener:302]: Can't load the default skins, please make sure skin [Jane] is under skins directory and structure correctly

  1.  

分析:可能是代码问题,可能是项目推送到gitlab上的位置不正确,这个需要结合研发来解决,做到这里已经不错了。自己搞很难的,这个暂时先放下,

  1.  
  1.  

6.17、查看svc,多出来个svc

  1.  

[root@test2 ~]# kubectl get svc -n jenkins
NAME                   TYPE             CLUSTER-IP             EXTERNAL-IP           PORT(S)                          AGE
http-solo-ser          NodePort         10.100.197.60          <none>                8080:33580/TCP 7m
jenkins                NodePort         10.97.49.156           <none>                8080:31888/TCP,50000:50000/TCP   11h

  1.  

报错解决:

  1. 报错找不到mvn工具,错误如下所示:
  2.  
  3. /home/jenkins/workspace/pipline-test@tmp/durable-33237322/script.sh: 4: /home/jenkins/workspace/pipline-test@tmp/durable-33237322/script.sh: /usr/bin/mvn: not found
  4.  
  5. 解决:之前编译一直显示找不到mvn工具,是因为下图中配置jenkins-slave镜像时候写错了,没有填写成编译好的cnych/jenkins:v1 镜像,

  1.  
  1.  
  1.  
  1. 参照:容器版jenkins实现CI/CD
  1. https://www.cnblogs.com/effortsing/p/10468840.html
  2.  
  3. 制作jenkins镜像参照:
  4.  
  5. https://blog.csdn.net/a632189007/article/details/79311795
  6.  
  7. 上面链接这篇文档的核心内容如下:

1、生成自定义Jenkins master镜像

Dockerfile:

FROM 192.168.1.184:5000/jenkins/jenkins:2.89.3
ENV MAVEN_VERSION 3.0.5
ENV JAVA_HOME /usr/java/jdk1.8.0_121
ENV MAVEN_HOME /opt/maven/apache-maven-${MAVEN_VERSION}
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# build java
COPY ./jdk1.8.0_121 ${JAVA_HOME}
COPY ./libltdl.so.7 /usr/lib/libltdl.so.7

# build maven
COPY apache-maven-${MAVEN_VERSION}-bin.tar.gz /tmp/maven/apache-maven-${MAVEN_VERSION}-bin.tar.gz
COPY settings.xml /tmp/maven/settings.xml
USER root:root
RUN mkdir -p /opt/maven/repository \
&& cd /opt/maven \
&& tar -zxvf /tmp/maven/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
&& cp /tmp/maven/settings.xml ${MAVEN_HOME}/conf/settings.xml \
&& rm -rf /tmp/maven

ENV PATH ${JAVA_HOME}/bin:${MAVEN_HOME}/bin:${PATH}

该Dockerfile所做的工作为:
1. 重新安装Java环境并配置环境变量;
2. 安装Maven并配置环境变量;
3. 配置Maven仓库位置,以便启动时挂载宿主机仓库为容器中Maven仓库;
4. 设置启动用户为root。

2、生成自定义Jenkins slave镜像

Dockerfile:

FROM jenkinsci/jnlp-slave:latest
ENV MAVEN_VERSION 3.0.5
ENV JAVA_HOME /usr/java/jdk1.8.0_121
ENV MAVEN_HOME /opt/maven/apache-maven-${MAVEN_VERSION}
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# build java
COPY ./jdk1.8.0_121 ${JAVA_HOME}
COPY ./libltdl.so.7 /usr/lib/libltdl.so.7

# build maven
COPY apache-maven-${MAVEN_VERSION}-bin.tar.gz /tmp/maven/apache-maven-${MAVEN_VERSION}-bin.tar.gz
COPY settings.xml /tmp/maven/settings.xml
USER root:root
RUN mkdir -p /opt/maven/repository \
&& cd /opt/maven \
&& tar -zxvf /tmp/maven/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
&& cp /tmp/maven/settings.xml ${MAVEN_HOME}/conf/settings.xml \
&& rm -rf /tmp/maven \
&& apt-get -yq update \
&& apt-get -yq --no-install-recommends --no-install-suggests install sshpass \
&& apt-get clean -y

ENV PATH ${MAVEN_HOME}/bin:${PATH}

该Dockerfile操作与Jenkins master的Dockerfile基本一致。不过该镜像中缺少libltdl.so.7文件,需要从宿主机中拷贝进去,该文件在slave节点容器中使用docker时会用到,因此十分重要

  1.  
  2. 容器板jenkins使用宿主机的kubectl参照:
  3.  
  4. http://ju.outofmemory.cn/entry/363089

k8s版jenkins--master/slave模式实现CI/CD---带solo开源博客项目--带maven、djk、git工具的更多相关文章

  1. Jenkins—Master/Slave模式

    Jenkins可部署在windows或者linux平台上,项目系统的用户多数为windows系统.如果Jenkins部署在linux上,而自动化任务要在windows平台执行,那么就需要使用Jenki ...

  2. jenkins master/slave模式

    master是主机,只有master装jenkins slave是小弟机无需装jenkins,主要执行master分配的任务 一.新建slave 1.新建slave的方法:点击magian jenki ...

  3. 基于Kubernetes构建企业Jenkins master/slave CI/CD平台

    搭建平台目的: k8s中搭建jenkins master/slave架构,解决单jenkins执行效率低,资源不足等问题(jenkins master 调度任务到 slave上,并发执行任务,提升任务 ...

  4. jenkins的Master/Slave模式

    一. Master/Slave模式 分担jenkins服务器的压力,任务分配到其它执行机来执行 Master:Jenkins服务器 Slave:执行机(奴隶机).执行Master分配的任务,并返回任务 ...

  5. Jenkins Master/Slave架构

    原文:http://www.cnblogs.com/itech/archive/2011/11/11/2245849.html 一 Jenkins Master/Slave架构 Master/Slav ...

  6. Jenkins与Docker的自动化CI/CD实战

    Jenkins与Docker的自动化CI/CD实战 互联网Java架构 2018-09-19 15:46:13 一.发布流程设计 工作流程: 开发人员提交代码到Git版本仓库:Jenkins人工/定时 ...

  7. Java 开源博客——B3log Solo 0.6.6 正式版公布了!

    Java 开源博客 -- B3log Solo 0.6.6 正式版公布了!欢迎大家下载. 该版本号引入了数据库连接池:Druid. 另外,欢迎观摩 B3log 团队的新项目:Noty,也很欢迎大家參与 ...

  8. Java 开源博客——B3log Solo 0.6.7 正式版公布了!

    Java 开源博客 -- B3log Solo 0.6.7 正式版公布了!欢迎大家下载. 另外,欢迎观摩 B3log 团队的新项目:Wide,也很欢迎大家參与进来 :-) 特性 基于标签的文章分类 P ...

  9. Java 开源博客——B3log Solo 0.6.1 正式版发布了!

    Java 开源博客 —— B3LOG Solo 0.6.1 正式版发布了!欢迎大家下载. 该版本主要是改善细节体验,并加入了一款 Metro 风格的皮肤. 特性 基于标签的文章分类 Ping Goog ...

随机推荐

  1. 01-学习vue前的准备工作(let和const)

    es6语法:let和const es6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效 <!DOCYTPE html> <ht ...

  2. Monitor 实现阻塞队列 + 生产消费者实例

    转载至 https://www.codeproject.com/Articles/28785/Thread-synchronization-Wait-and-Pulse-demystified /* ...

  3. 转发大神nginx配置详解

    序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也 ...

  4. VS - Paginated

    BootstrapPagination.cshtml @model PaginationModel <div class="pagination"> <ul> ...

  5. 自用 微信小程序跳小程序

    "window": { "navigationBarTextStyle": "black", "navigationBarTitl ...

  6. 开始编写Makefile(二)Makefile变量的使用

    Makefile可以使用变量代替 命令行:make -f Makefile2 说明开始make一个名为Makefile2的文件 ###############定义变量################# ...

  7. 关于连接sftp以及本地配置sftp的事情

    1.window下配置sftp服务器 参考:https://blog.csdn.net/zhangliang_571/article/details/45598939 下载:http://www.fr ...

  8. leaflet常用插件库

    1.常用地图切换加载(osm.google.baidu.gaode.tianditu.etc)https://github.com/htoooth/Leaflet.ChineseTmsProvider ...

  9. 根据字符串从资源中取出对应的资源ResourceManager.GetObject

    ResourceManager.GetObject 根据名称从资源中取出资源 需要:我有25张 五笔图片名称是a b c d ...y 这样组成的 每张图片名字只有一个名字 我想通过字符串a取出a这张 ...

  10. 15.linux iptables防火墙规则vsftp服务

    一.服务所开启的端口号.          dhcp 67       samba 139 445       http 80  https 443       mysql 3306         ...