5.K8s的CICD


1 CICD

思考:如果springboot-demo需要修改某些代码,按照上述流程,是不是又要重新打包?然后写Dockerfile,push镜像,然后写k8s配置文件等等之类的操作

思路:如果能够按照上述图解一样,在本地进行开发,然后git push到github,就能访问最终的应用该多好

1.1 环境准备

1.1.1 基础环境

基础环境准备[在jenkins那台机器上安装]

  • 安装java

    1. 找到jdk资源上传到指定机器

      resources/cicd/jdk-8u181-linux-x64.tar.gz
    2. 配置环境变量

      vim /etc/profile
      
      export JAVA_HOME=/usr/local/java/jdk1.8.0_181
      export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
      export PATH=$PATH:${JAVA_HOME}/bin
      
      source /etc/profile 
      
      java -version
  • 安装maven

    1. 找到maven资源上传到指定机器

      resources/cicd/apache-maven-3.6.2-bin.tar.gz
    2. 配置环境变量

      vim /etc/profile
      
      export MAVEN_HOME=/usr/local/maven/apache-maven-3.6.2
      export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
      
      source /etc/profile 
      
      mvn -version
    3. 配置maven的阿里云镜像

      <mirror>
          <id>alimaven</id>
          <name>aliyun maven</name>
       <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <mirrorOf>central</mirrorOf>        
      </mirror>
  • 安装配置git

    1. 下载安装

      yum install git 
    2. 配置git

      git config --global user.name "itcrazy2016"
      git config --global user.email "itcrazy2016@163.com"
      ssh-keygen -t rsa -C "itcrazy2016@163.com"  --->将公钥上传到github:/root/.ssh/id_rsa.pub

1.1.1 IDEA+SpringBoot项目

01 `下载项目`
    git clone git@github.com:itcrazy2016/springboot-demo.git

02 `使用idea打开`
    此时项目已经和github关联

1.1.2 Gitlab

直接采用github

git@github.com:itcrazy2016/springboot-demo.git

1.1.3 Jenkins

必须在k8s集群中,因为后面需要在jenkins的目录下创建文件执行,比如这里选用w2

  1. 操作前须知

    jenkins官网:https://jenkins.io/

    入门指南:<https://jenkins.io/zh/doc/pipeline/tour/getting-started/

  2. 找到对应资源:resources/cicd/jenkins.war

    wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
  3. 启动jenkins[记得当前机器安装了jdk/jre,不然运行不了]

    nohup java -jar jenkins.war --httpPort=8080 & 
    tail -f nohup.out 
  4. win浏览器访问w2的ip 121.40.56.193:8080,记录下密码,比如

    cat /root/.jenkins/secrets/initialAdminPassword
  5. 安装推荐的插件

  6. 创建一个用户,比如

    username:jack
    password:123456
  7. 安装配置git,maven

  8. 在jenkins上使用centos的java,git,maven等

    [系统管理]->[全局工具配置]->[Maven、JDK、Git等]

1.1.4 Docker hub

使用阿里云docker镜像仓库,或者自己搭建一个

比如使用阿里云的

docker login --username=itcrazy2016@163.com registry.cn-hangzhou.aliyuncs.com

1.1.5 Kubernetes集群

直接使用之前大家自己搭建的K8s集群

1.2 必要测试

1.2.1 github 触发构建

1.2.1.1 pipeline任务

关注: /root/.jenkins/workspace目录

  1. 创建jenkins的task

  2. 拉取github代码,在最下面编写pipeline,然后“保存和立即构建“,同时可以查看“Console Output”

      node {
         def mvnHome
         stage('Preparation') { // for display purposes
          git 'https://github.com/itcrazy2016/springboot-demo.git'
         }
      }
  3. 来到w2节点:ls /root/.jenkins/workspace/springboot-demo

  4. 配置springboot-demo的task,修改pipeline内容 ,增加maven构建,然后“保存和立即构建“,同时可以查看“Console Output”

      node {
         def mvnHome
         stage('Preparation') {
          git 'https://github.com/itcrazy2016/springboot-demo.git'
         }
    
         stage('Maven Build') { 
          sh "mvn clean package"
         }
      }
  5. 来到w2节点:ls /root/.jenkins/workspace/springboot-demo

    小结:至此,我们已经可以通过在jenkins上手动构建的方式,拿到github上的代码,并且用maven进行构建。

1.2.1.2 jenkins自动构建

最好的话:当用户进行git commit/push提交代码到github时,能够通知jenkins自动构建

注意:jenkins的ip一定要是github能够访问到的地址

  1. 在github上配置jenkins的webhook地址

    http://121.40.56.193:8080/springboot-demo

  2. 生成Personal access tokens

    Jenkins访问github需要授权,所以在github上生成token交给jenkins使用,即Personal access tokens

    github的Settings[个人信息右上角]–>Developer settings–>Personal access tokens–>Generate new token

    最后保存好该token,比如:72f048b514e95d6fe36f86d84374f2dcce402b43

  3. jenkins安装插件

    1. 安装github plugin插件:[系统管理]->[插件管理]->[可选插件]
    2. 安装gitlab插件和gitlab hook插件:[系统管理]->[插件管理]->[可选插件]
  4. 配置GitHub Server

    [系统管理]->[系统配置]->[找到github服务器]->[添加github服务器]

    然后按照下面图片步骤进行操作

    然后进行测试,最后点击最下面的保存

1.2.2 gitlab 触发构建

流水线配置和上面相同

1.2.2.1 jenkins配置

  1. 安装插件

    需要安装两个插件 Gitlab Hook Plugin和Build Authorization Token Root。果没有安装Build Authorization Token,后面gitlab在Test hook时会报403错误

  2. 流水线配置

    1. 新建一条流水线 springboot-demo

    2. 构建触发器,勾选gitlab-ci,记住后面的GitLab CI Service URL后面要填在gitlab的webhooks中

      点开高级,填写根据正则过滤branch,写法如下,并generate一个token,不然后面webhooks会报403。记下生成的 token

  3. 配置执行脚本

    node {
       def mvnHome
       stage('Preparation') { // for display purposes
          git 'git@gitlab.chris-king.com:admins/springboot-demo.git'
       }
    
       stage('Maven Build'){
           sh "mvn clean package"
       }
    }

1.2.2.2 gitlab配置

  1. 配置 webhook

    在 springboot-demo 下面 【设置】-【集成】,URL 和 Secret Token 分别配置上一步 jenkins 中获取的

    点击下方 Add webhook,出现如下错误

  2. 配置允许本地网络

    Admin area => Settings => Network,然后点击 Outbound requests 右边 的“expand”按钮,如下:

    然后点击 “Save changes”,并重新添加即可添加成功

  3. 添加成功测试

    点击右边测试,选择 “Push events”,返回 200 状态码

  4. jenkins 流水线触发构建

    可以在 jenkins 上看到一条构建记录,被 GitLab 所触发。说明配置成功

1.3 核心实战走起

1.3.1 build&push镜像

经过前面的折腾,肯定可以获取到代码,并且用maven进行构建了,最终拿到一个target/xxx.jar

来到w2上的workspace目录:cd /root/.jenkins/workspace

  1. 准备一个文件,名称为 springboot-demo-build-image.sh

    mkdir /root/.jenkins/workspace/scripts/
    vi /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
  2. 编写 springboot-demo-build-image.sh 文件

    # 进入到springboot-demo目录
    cd ../springboot-demo
    # 编写Dockerfile文件
    cat < Dockerfile
    FROM openjdk:8-jre-alpine
    COPY target/springboot-demo-0.0.1-SNAPSHOT.jar /springboot-demo.jar
    ENTRYPOINT ["java","-jar","/springboot-demo.jar"]
    EOF
    echo "Dockerfile created successfully!"
    # 基于指定目录下的Dockerfile构建镜像
    docker build -t registry.cn-hangzhou.aliyuncs.com/itcrazy2016/springboot-demo:v1.0 .
    # push镜像,这边需要阿里云镜像仓库登录,在w2上登录
    docker push registry.cn-hangzhou.aliyuncs.com/itcrazy2016/springboot-demo:v1.0:wq
  3. 增加pipeline

    node {
       def mvnHome
       stage('Preparation') {
          git 'https://github.com/itcrazy2016/springboot-demo.git'
       }
    
       stage('Maven Build') { 
          sh "mvn clean package"
       }
    
       stage('Build Image') { 
          sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh"
       }
    }
  4. 踩坑

    # 01 文件权限
    /root/.jenkins/workspace/springboot-demo@tmp/durable-7dbf7e73/script.sh: line 1: /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh: Permission denied
    # 解决
    chmod +x /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
    
    # 02 docker没有运行
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    # 解决
    systemctl start docker
    systemctl enable docker
    
    # 03 push权限
    docker login --username=itcrazy2016@163.com registry.cn-hangzhou.aliyuncs.com

1.3.2 Kubernetes拉取镜像运行

经过前面的折腾,现在已经能够把镜像push到镜像仓库了,接下来就是k8s拉取镜像并且运行在集群中咯

根据前面的经验,肯定再创建一个stage,然后运行sh脚本,脚本中执行内容,包括yaml文件

  1. 编写springboot-demo.yaml文件

    在/root/.jenkins/workspace/scripts/目录下创建springboot-demo.yaml

    # 以Deployment部署Pod
    apiVersion: apps/v1
    kind: Deployment
    metadata: 
      name: springboot-demo
    spec: 
      selector: 
        matchLabels: 
          app: springboot-demo
      replicas: 1
      template: 
        metadata:
          labels: 
            app: springboot-demo
        spec: 
          containers: 
          - name: springboot-demo
            image: registry.cn-hangzhou.aliyuncs.com/itcrazy2016/springboot-demo:v1.0
            ports: 
            - containerPort: 8080
    ---
    # 创建Pod的Service
    apiVersion: v1
    kind: Service
    metadata: 
      name: springboot-demo
    spec: 
      ports: 
      - port: 80
        protocol: TCP
        targetPort: 8080
      selector: 
        app: springboot-demo
    ---
    # 创建Ingress,定义访问规则
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata: 
      name: springboot-demo
    spec: 
      rules: 
      - host: springboot.jack.com
        http: 
          paths: 
          - path: /
            backend: 
              serviceName: springboot-demo
              servicePort: 80
  2. 编写k8s-deploy-springboot-demo.sh文件

    vi /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh

    kubectl delete -f springboot-demo.yaml
    kubectl apply -f /root/.jenkins/workspace/scripts/springboot-demo.yaml
    echo "k8s deploy success!"
  3. 编写pipeline

    node {
       def mvnHome
       stage('Preparation') {
          git 'https://github.com/itcrazy2016/springboot-demo.git'
       }
    
       stage('Maven Build') { 
          sh "mvn clean package"
       }
    
       stage('Build Image') { 
          sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh"
       }
    
       stage('K8S Deploy') { 
          sh "/root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh"
       }
    }
  4. 采坑

    # 01 权限
    /root/.jenkins/workspace/springboot-demo@tmp/durable-8404142a/script.sh: line 1: /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh: Permission denied
    # 解决
    chmod +x /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh
    
    # 02 worker02执行不了kubectl
    `切换到master上,cd ~  --->  cat .kube/config  --->复制内容`
    `切换到worker02上   cd ~  --->  vi .kube/config   --->粘贴内容`
  5. win的hosts文件

    192.168.0.61 springboot.jack.com

文章作者: Soulballad
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Soulballad !
评论
 上一篇
5-1.gitlab安装 5-1.gitlab安装
【官网】https://about.gitlab.com/install/#centos-7【这块需要自己搭建gitlab的小伙伴可以操作一下,上面也放了官网中的链接步骤】 1 说明安装gitlab的机器至少要有4G的内存,因为gitlab
2021-03-09
下一篇 
4.K8s项目实战 4.K8s项目实战
1. 服务部署到Kubernetes1.1 部署wordpress+mysql 创建wordpress命名空间 kubectl create namespace wordpress 创建 wordpress-db.yaml 文件: api
2021-03-09
  目录