• jenkins + gitlab + harbor + k8s 部署项目


    转载:https://blog.csdn.net/shykevin/article/details/100165402

    一、概述
    maven项目部署流程图如下:

     

    环境介绍
    操作系统 ip 角色 版本
    ubuntu-16.04.4-server-amd64 192.168.10.122 Jenkins+harbor Jenkins 2.176.2,harbor 1.8.1
    ubuntu-16.04.4-server-amd64 192.168.10.134 gitlab gitlab-ce_12.1.4
    ubuntu-16.04.4-server-amd64 192.168.10.130 k8s master kubernetes 1.15.2
    ubuntu-16.04.4-server-amd64 192.168.10.131 k8s node kubernetes 1.15.2
     

    二、gitlab创建maven项目
     首先从github上面,找一个基于maven的项目,地址如下:

    https://github.com/solochen84/SpringBootDemo

    使用git客户端,下载此项目代码

    创建项目
    登录gitlab,创建一个项目springbootdemo

     

    点击 设置--> 成员

     

    添加2个成员,一个是jenkins用户,用来拉取代码的。一个是我,用来提交代码的。

    注意:我的账号,权限要高一些,可以直接提交到master分支。

     

    将github下载的代码,提交到刚刚创建的项目中。效果如下:

     

    三、harbor 创建用户和项目
    创建jenkins用户
    登录到harbor后台,点击创建用户

     

    注意,每一项都填写一项。尤其是密码,必须符合密码复杂性要求。

     

    创建项目
    点击新建项目

     

    输入名字,java。这就是私有项目。

     

     点击java

     

    点击成员-->用户

     

    输入jenkins,会有提示的。角色选择 开发人员。

    四、jenkins修改默认用户
    使用jenkins执行shell命令时,可能会出现权限不足的情况。

    查看jenkins默认用户
    cat /etc/default/jenkins
    内容如下:

    # pulled in from the init script; makes things easier.
    NAME=jenkins

    # arguments to pass to java

    # Allow graphs etc. to work even when an X server is present
    JAVA_ARGS="-Djava.awt.headless=true"

    #JAVA_ARGS="-Xmx256m"

    # make jenkins listen on IPv4 address
    #JAVA_ARGS="-Djava.net.preferIPv4Stack=true"

    PIDFILE=/var/run/$NAME/$NAME.pid

    # user and group to be invoked as (default to jenkins)
    JENKINS_USER=$NAME
    JENKINS_GROUP=$NAME
    ...
    可以发现JENKINS_USER和JENKINS_GROUP变量的值是jenkins

    修改默认用户为root
    将下面2个变量,修改为root

    JENKINS_USER=root
    JENKINS_GROUP=root
     

    重启jenkins服务
    service jenkins restart
     

    五、jenkins和k8s master做ssh免密
    为什么要和k8s master做ssh免密呢?因为jenkins需要登录到k8s master,做一些pod操作。

    生成秘钥
    登录到jenkins服务器,生成秘钥

    ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
     

    copy秘钥
    ssh-copy-id 192.168.10.130
     

    测试root免密

    ssh 192.168.10.130
    如果没有提示输入密码,说明成功了!

    六、jenkins登录harbor
    修改docker配置文件,添加harbor地址

    vim /etc/docker/daemon.json
    内容如下:

    {"insecure-registries": ["192.168.10.122"]}
     

    重新加载docker配置

    /etc/init.d/docker reload
     

    测试登录

    root@ubuntu:~/docker_dir# docker login 192.168.10.122 -u jenkins -p Jenkins@1234
    WARNING! Using --password via the CLI is insecure. Use --password-stdin.
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store

    Login Succeeded
     

    如果出现

    Error response from daemon: Get https://192.168.10.122/v2/: dial tcp 192.168.10.122:443: connect: connection refused
    表示 /etc/docker/daemon.json 文件修改不正确

    七、jenkins创建maven项目
    新建任务
    登录到jenkins后台,点击 新建Item

    输入名称,选择构建一个maven项目

     

    设置参数化构建
    丢弃旧的构建,保留2天

     

    设置源代码
    输入仓库下载地址,选择用户root

     

    设置maven构建命令
    输入命令:clean package

     

    mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。

    package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

    jar包打包成docker镜像并推送
    执行shell命令
    build完成之后,选择执行shell命令

     

    将下面的内容,贴过去

    #!/bin/bash

    jarName=spring-boot-demo-0.0.1-SNAPSHOT.jar
    jarFolder=ph
    harborPro=java
    projectName=ph

    docker_path=${WORKSPACE}

    cp ${WORKSPACE}/target/${jarName} ${docker_path}
    bash -x /root/docker_dir/deploy_docker.sh ${harborPro} ${projectName} ${docker_path} ${jarName}
    内容解释:

    jarName jar包的文件名,名字随便

    jarFolder jar包的文件夹

    harborPro harbor里面的项目,在上面步骤中,创建java私有项目。

    projectName 项目名,名字随便

    docker_path docker命令的工作目录

    最后一步,会执行一个shell脚本。下面说到!

    效果如下:

     

    定义shell脚本
    登录到jenkins服务器,创建目录

    mkdir /root/docker_dir
     

    编辑deploy_docker.sh脚本

    cd /root/docker_dir/
    vim deploy_docker.sh
    内容如下:

    #!/bin/bash
    # maven $workspace $jarname
    # ${harborPro} ${projectName} ${docker_path} ${jarName}

    set -e
    harbor_project=$1
    projectName=$2
    docker_path=$3
    appName=$4

    # harbor认证用户
    user_name=jenkins
    password=Jenkins@1234

    # harbor地址以及tag
    tag=$(date +%s)
    harbor_server=192.168.10.122
    server_path=${harbor_server}
    taget_image=${projectName}:${tag}
    #${BUILD_NUMBER}
    echo ${taget_image}

    # 登录docker
    cd ${docker_path}
    sudo docker login ${harbor_server} -u ${user_name} -p ${password}

    # 生成镜像并推送到harbor,最后删除本地镜像
    sudo docker build --build-arg app=${appName} -t ${taget_image} .
    sudo docker tag ${taget_image} ${server_path}/${harbor_project}/${projectName}
    echo "The name of image is ${server_path}/${harbor_project}/${projectName}"
    sudo docker push ${server_path}/${harbor_project}/${projectName}:latest
    sudo docker rmi -f $(docker images|grep ${projectName}|grep ${tag}|awk '{print $3}'|head -n 1)
     

    添加执行权限

    chmod 755 /root/docker_dir/deploy_docker.sh
     

    yaml文件拷贝到k8s master上并运用应用
    k8s master 操作
    登录到k8s master,创建目录

    mkdir kube-conf
     

    修改gitlab springbootdemo项目中的kube.yaml,将其重命名为springbootdemo.yaml

    修改内容,添加秘钥


    apiVersion: v1
    kind: Service
    metadata:
    name: maven-service
    spec:
    type: NodePort
    ports:
    - name: maven
    port: 8080
    nodePort: 31002
    targetPort: 8080
    protocol: TCP
    selector:
    app: maven
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: maven-deployment
    spec:
    replicas: 1
    template:
    metadata:
    labels:
    app: maven
    spec:
    imagePullSecrets:
    - name: harborsecret
    containers:
    - name: maven
    image: 192.168.10.122/java/ph:latest
    imagePullPolicy: Always
    ports:
    - containerPort: 8080
    env:
    - name: key
    value: "value"
    View Code
     

    将springbootdemo.yaml 提交到gitlab

    查看内容是否更改

     

    k8s 生成imagePullSecrets,请参考以下链接

    https://www.cnblogs.com/xiao987334176/p/11434326.html

    注意:使用docker登录用户时,指定jenkins

    docker login 192.168.10.122 -u jenkins -p Jenkins@1234
     

    jenkins操作
    添加执行shell命令

     

     将下面的内容,贴过去

    #!/bin/bash

    set -e
    echo ok
    echo ${WORKSPACE}
    k8sMaster=192.168.10.130
    scp ${WORKSPACE}/*.yaml ${k8sMaster}:/root/kube-conf
    ssh ${k8sMaster} 'kubectl apply -f /root/kube-conf/springbootdemo.yaml'
    ssh ${k8sMaster} 'cd /root/kube-conf && kubectl delete -f springbootdemo.yaml && kubectl apply -f springbootdemo.yaml'
    ssh ${k8sMaster} 'kubectl get svc|grep maven'
     

    命令解释:

    这里主要就是将项目下的yaml文件复制到k8s master /root/kube-conf 目录

    并应用yaml文件,最后查看svc信息。

    效果如下:

     

    手动构建应用
    点击Build Now

     

    点击#1

     

    点击控制台输出

     

    它会自己下载一些组件,需要等待一段时间。

     

    出现spring图标,表示应用开始启动构建了。

     

    最后出现错误

     

    为啥呢? 查看springbootdemo 的Dockerfile文件,查看第一行

    FROM registry-scu.cloudtogo.cn/ubuntu:jdk
    需要把 registry-scu.cloudtogo.cn 添加到 /etc/docker/daemon.json中

    登录到jenkins服务器,修改 /etc/docker/daemon.json

    vim /etc/docker/daemon.json
    内容如下:

    {"insecure-registries": ["192.168.10.122","registry-scu.cloudtogo.cn"]}
     

    重新加载docker

    /etc/init.d/docker reload
     

    再次手动构建一次,点击Build Now

    查看构建过程

    出现以下提示,说明正在下载镜像 registry-scu.cloudtogo.cn/ubuntu:jdk 

     

    最后提示执行完成

     

    查看harbor仓库
    会发现多了一个镜像,这个镜像,就是刚刚构建时,提交的。

     

    八、访问k8s 应用
    查看Pod状态
    root@k8s-master:~# kubectl get pods -o wide
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    maven-deployment-7bd87867f8-6tlgp 0/1 ImagePullBackOff 0 5m19s 192.168.36.68 k8s-node1 <none> <none>
     

    发现pod运行在k8s-node1 这台服务器,状态是ImagePullBackOff

    查看pod详细信息

    kubectl describe po maven-deployment-7bd87867f8-6tlgp
    输出:

    Events:
    Type Reason Age From Message
    ---- ------ ---- ---- -------
    Normal Scheduled 7m15s default-scheduler Successfully assigned default/maven-deployment-7bd87867f8-6tlgp to k8s-node1
    Normal Pulling 5m49s (x4 over 7m14s) kubelet, k8s-node1 Pulling image "192.168.10.122/maven:latest"
    Warning Failed 5m49s (x4 over 7m14s) kubelet, k8s-node1 Failed to pull image "192.168.10.122/maven:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://192.168.10.122/v2/: dial tcp 192.168.10.122:443: connect: connection refused
    Warning Failed 5m49s (x4 over 7m14s) kubelet, k8s-node1 Error: ErrImagePull
    Normal BackOff 5m36s (x6 over 7m13s) kubelet, k8s-node1 Back-off pulling image "192.168.10.122/maven:latest"
    Warning Failed 2m11s (x20 over 7m13s) kubelet, k8s-node1 Error: ImagePullBackOff
     

    出现 

    Get https://192.168.10.122/v2/: dial tcp 192.168.10.122:443: connect: connection refused
    说明,k8s-node1 这台服务器的 /etc/docker/daemon.json 没有更改

    登录到k8s-node1 这台服务器,修改文件

    vim /etc/docker/daemon.json
    内容如下:

    {"insecure-registries": ["192.168.10.122"]}
     

    重新加载docker

    /etc/init.d/docker reload
     

    重新加载pod
    登录到k8s master服务器,删除pod,重新应用

    root@k8s-master:~# cd /root/kube-conf/
    root@k8s-master:~/kube-conf# kubectl delete -f springbootdemo.yaml
    service "maven-service" deleted
    deployment.extensions "maven-deployment" deleted
    root@k8s-master:~/kube-conf# kubectl apply -f springbootdemo.yaml
    service/maven-service created
    deployment.extensions/maven-deployment created
     

    再次查看状态

    root@k8s-master:~/kube-conf# kubectl get pods -o wide
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    maven-deployment-7bd7475544-q9b6j 1/1 Running 0 27s 192.168.36.77 k8s-node1 <none> <none>
    发现处于Running状态了

    访问应用页面
    查看svc暴露的端口

    root@k8s-master:~/kube-conf# kubectl get svc|grep maven
    maven-service NodePort 10.98.152.31 <none> 8080:31002/TCP 4m
    可以发现,暴露的端口是31002

    使用谷歌访问页面

    http://192.168.10.130:31002/
     

    效果如下:

     

    使用k8s-node1 的ip

    http://192.168.10.131:31002/
    效果同上!

    九、更新应用代码
    打开本地的项目springbootdemo,修改文件IndexController.java

    路径如下:

    springbootdemosrcmainjavacomexampledemowebcontroller
     

    修改下面2行内容,把数字加1

    jsonObject.put("welcome2", "2");
    jsonObject.put("welcome7", "7");
     

    重新提交到gitlab,然后重新构建一次,点击Build Now

    等待构建成功后,刷新页面

     

     发现内容已经更新了!



  • 相关阅读:
    bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会
    bzoj 1690: [Usaco2007 Dec]奶牛的旅行——分数规划+spfa判负环
    poj2728 最小比率生成树——01分数规划
    H265编码网页视频流媒体播放器EasyWasmPlayer.js播放控制台提示Uncaught TypeError排查
    EasyRTSPServer对接海康录像机无法正常预览如何解决?
    如何对EasyRTSPLive进行修改将其支持多通道拉RTSP流推RTMP流功能?
    H265视频流媒体播放器EasyPlayer.js播放HLS视频流无法自动播放原因排查分析
    从“地球漫游计划”看城市,TSINGSEE青犀视频让城市漫游直播更简单
    核污水排入大海?大到全球,小到城市,环境污染应该如何通过视频监控进行监管?
    AI如何让视频更智能?人工智能技术在视频监控中的应用
  • 原文地址:https://www.cnblogs.com/yangxiaochu/p/11981657.html
Copyright © 2020-2023  润新知