• k8s版jenkins--master/slave模式实现CI/CD---带solo开源博客项目--带maven、djk、git工具


    k8s环境:
    
    192.168.0.91       master 
    
    192.168.0.92       node

    192.168.0.96 gitlab

    192.168.0.98 harbor

    k8s集群安装请参照:https://www.cnblogs.com/effortsing/p/10312081.html

    gitlab安装请参照:https://www.cnblogs.com/effortsing/p/10012158.html

    arbor安装请参照:https://www.cnblogs.com/effortsing/p/10061096.html
     

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

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

    
    
    该Dockerfile所做的工作为:
     
    安装Maven 
    
    配置Maven仓库位置,以便启动时挂载宿主机仓库为容器中Maven仓库
    
    设置启动用户为root

    把jenkins加入docker组,否则无法使用宿主机的docker

    安装libltdl7.* 库,否则无法使用宿主机的docker 构建镜像 docker build
    -t jenkinsci/jenkins:v1 /home/jenkins-dockerfile/ Jenkins启动YAML配置文件 jenkins命令空间创建 cat >namespace-jenkins.yaml<<EOF apiVersion: v1 kind: Namespace metadata: name: jenkins labels: name: jenkins EOF Jenkins 权限配置 此处直接将jenkins-admin集成了cluster-admin权限,可根据自己具体需要进行权限的设置 cat>jenkins-account.yaml<<EOF apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: jenkins name: jenkins-admin namespace: jenkins --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: jenkins-admin labels: k8s-app: jenkins subjects: - kind: ServiceAccount name: jenkins-admin namespace: jenkins roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io EOF Jenkins Deployment配置 此处配置简单明了,需要说明的地方是挂在卷,此处挂载了四个目录,下面分别做出挂载原因: /var/jenkins_home(容器) –> /ceph/jenkins_home(宿主机) 我们需要将容器中的Jenkins源目录挂载导本地宿主机,因为该目录下保存了Jenkins产生的所有配置、我们的自定义配置、任务配置及详情等等信息,>所以需要持久化导宿主机,以便重新启动Jenkins容器的时候能够找到相应数据,防止数据丢失。此处我们使用的ceph,保证整个kubernetes集群所有机 器能够共享同一个目录。 /opt/maven/repository(容器) –> /ceph/maven/repository(宿主机) 这一对挂载目录是Maven仓库的挂载目录,不管是Jenkins master容器或者是Jenkins slave目录都需要挂载该目录,以便容器中maven能够在下载编译代 码时能够从该仓库中找到相应Jar包,同时也保证了数据的持久化。 /usr/bin/docker(容器) –> /usr/bin/docker(宿主机) /var/run/docker.sock(容器) –> /var/run/docker.sock(宿主机) 这两对挂载目录作用是能够在容器中操作宿主机docker,具体的用途是在slave容器中编辑maven代码并生成jar之后,需要生成该代码服务的docker镜像 并上传至本地私有仓库。因此需要操作宿主机docker以便完成这一系列操作 --------------------- cat>jenkins-deployment.yaml<<EOF apiVersion: apps/v1beta2 kind: Deployment metadata: name: jenkins namespace: jenkins labels: k8s-app: jenkins spec: replicas: 1 selector: matchLabels: k8s-app: jenkins template: metadata: labels: k8s-app: jenkins spec: containers: - name: jenkins image: jenkinsci/jenkins:v1 imagePullPolicy: IfNotPresent volumeMounts: - name: jenkins-home mountPath: /var/jenkins_home - name: maven-repository mountPath: /opt/maven/repository - name: docker mountPath: /usr/bin/docker - name: docker-sock mountPath: /var/run/docker.sock ports: - containerPort: 8080 - containerPort: 50000 volumes: - name: jenkins-home hostPath: path: /ceph/jenkins_home - name: maven-repository hostPath: path: /ceph/maven/repository - name: docker hostPath: path: /usr/bin/docker - name: docker-sock hostPath: path: /var/run/docker.sock serviceAccountName: jenkins-admin EOF Jenkins Service配置 该Service配置作用是能够让用户访问到Jenkins。此处开放并配置了8080、32000端口,这两个端口在Deployment 中也应该开放。此处配置的宿主机开放端口分别为:31888、32000 cat>jenkins-service.yaml<<EOF kind: Service apiVersion: v1 metadata: labels: k8s-app: jenkins name: jenkins namespace: jenkins annotations: prometheus.io/scrape: 'true' spec: ports: - name: jenkins port: 8080 nodePort: 31888 targetPort: 8080 - name: jenkins-agent port: 50000 nodePort: 50000 targetPort: 50000 type: NodePort selector: k8s-app: jenkins EOF 启动Jenkins镜像容器 kubectl create -f namespace-jenkins.yaml kubectl apply -f jenkins-account.yaml kubectl apply -f jenkins-deployment.yaml kubectl apply -f jenkins-service.yaml
    2、生成自定义Jenkins slave镜像 需要使用官方镜像cnych-jenkins,其他的镜像里面都没有kubectl工具,都试过。我这里把官方镜像存到网盘里面了,方便以后使用 下载带kubectl版jenkins镜像

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

    导入镜像
    
    docker load < cnych-jenkins-jnlp.tar
    
    编写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

    该Dockerfile所做的工作为:
     
    安装Maven
    
    配置Maven仓库位置,以便启动时挂载宿主机仓库为容器中Maven仓库
    
    设置启动用户为root
    
    
    构建镜像
    
    docker build -t cnych/jenkins:v1 /home/jenkins-dockerfile/
    
    
    查看镜像
    
    [root@test2 ~]# docker images
    REPOSITORY                                                        TAG                 IMAGE ID            CREATED             SIZE
    cnych/jenkins                                                     v1                  969993fe2aa9        23 seconds ago      2.2 GB
    jenkinsci/jenkins                                                 v1                  2114cb298e17        About an hour ago   1.41 GB
    cnych/jenkins                                                     jnlp                a430a5795102        12 days ago         628 MB
    jenkinsci/jenkins                                                 latest              b589aefe29ff        3 months ago        703 MB
    coredns/coredns                                                   1.2.0               da1adafc0e78        7 months ago        34.2 MB
    infoblox/dnstools                                                 latest              d0cee038721f        8 months ago        15.7 MB
    registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel                 v0.10.0-amd64       b949a39093d6        10 months ago       44.6 MB
    registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64   3.1                 da86e6ba6ca1        14 months ago       742 kB
    
    
    3、访问并操作Jenkins-master
    
    访问jenkins
    
    http://192.168.0.92:31888
    
    查看密码
    
    [root@test2 ~]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    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
    
    docker exec 6f8a62f8a0f7 cat /var/jenkins_home/secrets/initialAdminPassword
    471234cd0eb44ec3bfc4015fbacd599b
    
    然后会要求安装一些插件,这里选择默认安装,否则下一步打开是空白页
    
    
    设置登录用户名密码:
    
    admin/jenkins@123
    
    
    这时候会跳转到首页, 此时Jenkins就可以真正使用了: 
    
    
    对jenkins进行升级
    
    
    重启jenkins(有点慢,等5分钟)
    
    
    刷新网页重新登录
    
    admin/471234cd0eb44ec3bfc4015fbacd599b
    
    
    
    查看更新后的版本
    
    
    重置admin密码
    
    进入首页-》系统管理-》全局安全配置
    
    把“启用安全”勾上和把Jenkins专有用户数据库勾上、允许用户注册勾上-》保存
    
    点击右上角的admin-》设置-》修改里面的密码为(jenkins@123)-》保存-》重新登录-》输入账号密码
    
    
    
    需要安装的插件
    Kubernetes Cli Plugin:该插件可直接在Jenkins中使用kubernetes命令行进行操作。
    
    Kubernetes plugin: 使用kubernetes则需要安装该插件
    
    Kubernetes Continuous Deploy Plugin:kubernetes部署deploymrnt.yaml 时候需要使用
    
    
    进入首页-》系统管理-》插件管理-》可选插件-》输入kubernetes-》选中所有带kubernetes的插件进行安装-》安装完返回首页
    
    
    查看所有带kubernetes的插件是否安装上
    
    进入首页-》系统管理-》插件管理-》已安装-》输入kubernetes-》
    
    也可登录该网站:https://plugins.jenkins.io/,查找需要的插件
    
    
    增加一个kubernetes云
    
    点击 系统管理->系统设置,往下拉可看到云,点击新增一个云来新增一个kubernetes云
    
    
    
    配置jenkins连接kubernetes
    
    请参照:https://www.cnblogs.com/effortsing/p/10013441.html
    
    
    配置Kubernetes Pod Template
    
    其实就是配置Jenkins的jnlp-slave
    
    在该kubernetes云下,新增Kubernetes Pod Template,配置一个模板容器配置,如下图所示:




    配置镜像,下面里面的镜像一定要写对,否则写成别的镜像,到最后编译时候就一直报错没有mvn



    配置卷:就是deployment.yaml 里面的挂载路径



    全局配置(非必须) 点击 系统管理
    ->系统设置,下拉找到全局属性,可根据需要配置Java环境变量、Maven环境变量 全局工具配置 点击 系统管理->全局工具配置,此处可配置配置一些常用的工具配置,比如java、ant、maven、docker 参照:https://www.cnblogs.com/effortsing/p/10375689.html 4、创建Pipeline测试任务 Pipeline任务采用流式的处理方法,步骤清晰,非常适合进行任务配置。点击新建 创建一个Pipeline任务 创建完成后,会进入任务配置界面,下拉找到Pipeline(中文版为:流水线),则可编写Pipeline,进行任务配置

    下面pipline里面的简单任务:查看slave镜像里面是否有java的家目录、查看maven的版本等操作,
    def label = "jnlp-slave" podTemplate(label: label, cloud: 'kubernetes',containers: [ containerTemplate(name: 'jnlp-slave', image: 'cnych/jenkins:v1') ], volumes: [hostPathVolume(mounntPath:'/opt/maven/repository',hostPath:'/ceph/maven/repository'), hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'), hostPathVolume(mounntPath:'/var/run/docker.sock',hostPath:'/var/run/docker.sock')]) { node(label) { stage('Get a Maven project') { container(label) { stage('wait for exec check'){ sh 'sleep 1'
    sh 'echo $JAVA_HOME'
    sh 'mvn -v' } stage(
    'get maven env') { sh 'cat /etc/resolv.conf' sh 'cat /etc/issue' sh 'uname -a' sh 'env' } } } } }

    查看pod个数:

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

    
    开始构建





    查看pod个数:

    发现多了一个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


    构建成功如下图:


    查看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 Terminating 0 31s

    
    
    再次查看pod个数:发现消失


    从上边的pod个数变化中,我们可以清晰的看到 Jenkins Slave 自动创建到注销删除的过程,整个过程是自动完成的,不需要人工干预。

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

     
    4、配置容器版jenkins使用宿主机的kubectl命令
    
    
    4.1、slave镜像需要使用cnych/jenkins:jnlp,这个官方镜像里面有kubectl工具,其他的没有,都试过,上面就是用的这个镜像,所以直接下一步
    
    
    4.2、挂载kubectl工具
    
    /root/.kube 目录,我们将这个目录挂载到容器的 /home/jenkins/.kube 目录下面这是为了让我们能够在 Pod 的容器中能够使用 kubectl 工具来访问我们的 Kubernetes 集群,
    
    方便我们后面在 Slave Pod 部署 Kubernetes 应用。添加一个挂在路径,如下图所示:
    
    4.3、pipline脚本如下: 先试试是否能使用宿主机的kubectl命令,只查看一个pod情况: def label = "jnlp-slave" podTemplate(label: label, cloud: 'kubernetes',containers: [ containerTemplate(name: 'jnlp-slave', image: 'cnych/jenkins:v1') ], volumes: [hostPathVolume(mounntPath:'/opt/maven/repository',hostPath:'/ceph/maven/repository'), hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'), hostPathVolume(mounntPath:'/var/run/docker.sock',hostPath:'/var/run/docker.sock'), hostPathVolume(mounntPath:' /home/jenkins/.kube',hostPath:'/root/.kube')]) { node(label) { stage('Get a Maven project') { container(label) { stage('wait for exec check'){ sh 'kubectl get pod -n jenkins' } } } } } 4.4、点击开始构建,如下图所示:

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

    
    
    
    
    
    
    
    5、使用jenkins-salve创建一个nignx项目pod
    
    5.1、导入nginx镜像
    
    下载镜像:链接:https://pan.baidu.com/s/1ZvjakBRYNWN3FFSIz0O78g 
    提取码:8nfj 
    
    
    rz nginx.tar
    
    docker load < nginx.tar
    
    
    5.2、pipline脚本如下:
    
    def label = "jnlp-slave"
    podTemplate(label: label, cloud: 'kubernetes',containers: [
        containerTemplate(name: 'jnlp-slave', image: 'cnych/jenkins:v1')
      ],
      volumes: [hostPathVolume(mounntPath:'/opt/maven/repository',hostPath:'/ceph/maven/repository'),
                hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'),
                hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'),
                hostPathVolume(mounntPath:' /home/jenkins/.kube',hostPath:'/root/.kube')]) {
        node(label) {
            stage('create a pod') {
                container(label) {
                    stage('cat the pod'){
                        sh 'kubectl get pod -n jenkins'
                    }
     
            stage('create the deploy-nginx.yaml'){
    echo 'create the deploy-nginx.yaml'
    sh '''
    cat >deploy-nginx.yaml<<EOF
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: http-test-dm2
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            name: http-test-dm2
        spec:
          containers:
          - name: http-test-con
            image: nginx
            imagePullPolicy: Never      
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: http-nginx-ser
    spec:
      type: NodePort
      ports: 
      - port: 80
        nodePort: 31000
        targetPort: 80
      selector:
        name: http-test-dm2
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: nginx
    spec:
      rules:
      - host: www.nginx2.com      
        http:
          paths:
          - path: /
            backend:
              serviceName: http-nginx-ser
              servicePort: 80
    EOF
    
    '''
                }
                    stage('deploy to k8s'){
                        sh 'kubectl create -f deploy-nginx.yaml'
                        
                    }
                  
                }
            }
        }
    }
    
    
    
    5.3、点击开始构建,如下图所示:
    
    
    5.4、查看构建好的pod,pod默认会放在在上面第3步中配置的命名空间下, [root@test2 ~]# kubectl get pod -n jenkins NAME READY STATUS RESTARTS AGE http-test-dm2-b9776b68c-8b7tk 1/1 Running 0 18s jenkins-7b46757695-5k5lg 1/1 Running 6 13d jnlp-slave-pzwtc 2/2 Terminating 0 31s [root@test2 ~]# kubectl get pod -n jenkins NAME READY STATUS RESTARTS AGE http-test-dm2-b9776b68c-8b7tk 1/1 Running 0 1m jenkins-7b46757695-5k5lg 1/1 Running 6 13d 从上面看到:http-test-dm2-b9776b68c-8b7tk 这就是刚创建的nginx容器 5.4、测试访问nginx,如下图所示: http://192.168.0.92:31000

    
    
    6、使用jenkins-salve创建一个solo开源博客项目pod(看视频是使用下面方式部署的,)
    
    参照:https://www.cnblogs.com/effortsing/p/10468840.html
    
    
    6.1、配置jenkins-slave主机节点可以免密登录harbor仓库
    
    参照:https://www.cnblogs.com/effortsing/p/10060748.html
    
    
    6.2、配置jenkins-slave主机节点上的docker可以登录harbor仓库并且上传镜像到harbor仓库
    
    参照:https://www.cnblogs.com/effortsing/p/10061096.html
    
    
    6.3、配置jenkins全局工具:添加git工具
    
    进入jenkins界面的全局工具配置里面选择自动安装git工具,目的是拉取gitlab代码
    
    
    6.4、配置jenkins全局工具:配置jdk、maven家目录,参照:https://www.cnblogs.com/effortsing/p/10480972.html
    
    
    6.5、配置jenkins全局工具:添加settings.xml,Maven Configuration -> Settings file in filesystem -> File Path  /usr/share/maven/conf/settings.xml
    
    setting.xml需要进到容器里面查看所在的位置,添加操作如下图所示:


    6.6、 安装Pipeline Maven Integration 插件 6.7、下载solo源码包、修改代码访问地址、推送到gitlab代码仓库中,参照:https://www.cnblogs.com/effortsing/p/10468840.html 6.8、配置jenkins-master、jenkins-slave主机上的git秘钥到gitlab上实现拉取代码功能, 参照:https://www.cnblogs.com/effortsing/p/10482792.html 6.9、生成pipeline可以用的git链接地址,写到pipline脚本中,这样在pipline脚本才可以从gitlab上拉取代码 参照:https://www.cnblogs.com/effortsing/p/10468840.html 里面的步骤 6.10、编写pipline脚本如下:


    注意下面pipline脚本里面的 maven build步骤,里面的JAVA_HOME和mvn工具 都是jenkins-slave里面的,而不是jenkins-master里面的工具,

    如何查看jenkins-slave里面JAVA_HOME位置:只有通过构建的时候,在pipline里面写shell命令进行查看,因为制作jenkins-slave镜像的基础

    镜像是从官方镜像拉取的,而这个官方jenkins-slave镜像是不能独立启动的,试过,用docker无法启动,只能当slave使用。但是为什么还要用这个

    镜像,就是因为这个基础镜像里面包含kubectl工具, 自己之前尝试往jenkins-master镜像里面添加kubectl工具,但是失败,


    注意:下面piplene里面的第三个stage步骤里面的JAVA_HOME路径是第一个stage步骤mvn -v 得到的结果有java路径,要填写这个,不要填写echo $JAVA_HOME得到的结果

    先编译构建一下,然后得到mvn -v 结果后,及时暂停,然后把java路径填写到第三个stage步骤里面,从新编译打包
    def label = "jnlp-slave" podTemplate(label: label, cloud: 'kubernetes',containers: [ containerTemplate(name: 'jnlp-slave', image: 'cnych/jenkins:v1') ], volumes: [hostPathVolume(mounntPath:'/opt/maven/repository',hostPath:'/ceph/maven/repository'), hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'), hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'), hostPathVolume(mounntPath:' /home/jenkins/.kube',hostPath:'/root/.kube')]) { node(label) { stage('create a pod') { container(label) { stage('cat the pod'){ sh 'kubectl get pod -n jenkins'
    sh 'echo $JAVA_HOME'
    sh 'mvn -v' } stage('git checkout'){ echo 'git clone' 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']]]) } stage('maven build'){ echo 'maven build' sh ''' export JAVA_HOME=/usr/local/newhope/java1.8 /usr/bin/mvn clean package -Dmaven.test.skip=true ''' } stage('docker build and push images'){ echo 'docker build and push images' sh ''' REPOSITORY=192.168.0.98:5000/library/solo/solo:${Tag} cat >Dockerfile<<EOF FROM 192.168.0.98:5000/library/tomcat-85:latest RUN rm -rf /usr/local/tomcat/webapps/ROOT/ COPY target/*.war /usr/local/tomcat/webapps/ROOT.war WORKDIR /usr/local/tomcat EXPOSE 8080 CMD ["./bin/catalina.sh", "run"] EOF docker build -t $REPOSITORY . docker login -u admin -p Harbor12345 192.168.0.98:5000 docker push $REPOSITORY ''' } stage('create the deploy-solo.yaml'){ echo 'create the deploy-solo.yaml' sh ''' REPOSITORY=192.168.0.98:5000/library/solo/solo:${Tag} cat >deploy-solo.yaml<<EOF apiVersion: extensions/v1beta1 kind: Deployment metadata: name: http-solo-dm2 spec: replicas: 1 template: metadata: labels: name: http-solo-dm2 spec: containers: - name: http-solo-con image: $REPOSITORY imagePullPolicy: Never ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: http-solo-ser spec: type: NodePort ports: - port: 8080 nodePort: 33580 targetPort: 8080 selector: name: http-solo-dm2 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: solo spec: rules: - host: www.solo.com http: paths: - path: / backend: serviceName: http-solo-ser servicePort: 8080 EOF ''' } stage('deploy to k8s'){ sh 'kubectl create -f deploy-solo.yaml' } } } } }

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

    查看JAVA_HOME

    查看maven版本

    
    

    拉取代码:git checkout

    
    

    编译打包:maven build

    
    

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

    
    

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

    
    

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

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

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

    
    
    
    
    


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

    
    

    http://192.168.0.98:5000

    
    


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

    
    

    [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

    
    


    查看报错日志如下:

    
    

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

    
    

    [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

    
    

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

     
    
    

    6.17、查看svc,多出来个svc

    
    

    [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

    
    
    

    报错解决:

    报错找不到mvn工具,错误如下所示:
    
    /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

    解决:之前编译一直显示找不到mvn工具,是因为下图中配置jenkins-slave镜像时候写错了,没有填写成编译好的cnych/jenkins:v1 镜像,

    
    
     
    
    
    参照:容器版jenkins实现CI/CD:
    https://www.cnblogs.com/effortsing/p/10468840.html

    制作jenkins镜像参照: https:
    //blog.csdn.net/a632189007/article/details/79311795

    上面链接这篇文档的核心内容如下:

    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时会用到,因此十分重要




    容器板jenkins使用宿主机的kubectl参照:

    http://ju.outofmemory.cn/entry/363089











  • 相关阅读:
    MVC ORM 架构
    Kubernetes 第八章 Pod 控制器
    Kubernetes 第七章 Configure Liveness and Readiness Probes
    Kubernetes 第六章 pod 资源对象
    Kubernetes 第五章 YAML
    Kubernetes 核心组件
    Kubernetes 架构原理
    Kubernetes 第四章 kubectl
    Kubernetes 第三章 kubeadm
    yum 配置及yum 源配置
  • 原文地址:https://www.cnblogs.com/effortsing/p/10486960.html
Copyright © 2020-2023  润新知