Ubuntu20.04 安装 kubesphere&&devops流水线部署项目(部署java项目)

295 阅读7分钟

Ubuntu20.04 安装 kubesphere和 devops流水线部署项目(二)

啥也不说安装完了部署后端服务整整部署了2天才搞定,下面我来叨叨一下部署过程

前言

  • 我会写三篇文章来记录 我安装 kubesphere 和 部署项目的全过程
  • 第一篇 记录了我安装 kunesphere 的过程
  • 第二篇 记录我运用 kunesphere 部署java代码的过程
  • 第三篇 记录我运用 kunesphere 部署vue代码的过程

环境介绍&部署准备

  • 我部署的是一个基于若依Cloud架构的项目
  • 准备一个 git 选择gitlab中文汉化版(尽量不要选择docker安装涉及到邮箱和一些系统配置 你只要重新运行docker 容器就要重新配置)
  • 准备一个 jar包运行环境的基础镜像
  • 准备一个 docker镜像仓库 使用HarBor2.5.3
  • 注意这里来个友情提示 如果跟我一样使用的是HarBor 我建议你们要把 HarBor 定时清理打开
  • 每一个服务的镜像都在 700MB左右 更新几次就容易把物理机磁盘占满

下面开始部署后端项目

创建一下   项目&企业空间&用户 (admin 用户操作)

  • 点击用户 为企业空间 创建用户

  • 点击创建 记得平台角色选择 platform-regular

  • 选择企业空间

  • 点击创建 根据提示填写信息进行创建 一共就三个参数 这里就不贴图了

  • 创建后点击名称 进入企业空间

  • 进入企业空间后 点击企业空间设置下的 企业空间成员

  • 为当前企业空间配置 用户 角色选择 "企业空间名"-admin

  • 点击左上角 "平台管理" 会弹出 选择页面 然后选择 "集群管理"

  • 点击左侧菜单的 集群设置 -> 集群成员

  • 如果还有别的项目也部署 建议不要把企业用户挂到 集群里

  • 点击按照点击顺序添加集群成员 最后别忘了点确定

创建完企业空间和 企业空间管理用户 接下来要设置一下 企业空间的 配额
企业空间配额的作用是 合理的分配每个项目的资源
分配企业空间要用到 刚刚新建的 企业空间用户 用户操作分配企业空间配额

  • 点击左侧菜单的 企业空间设置 -> 企业空间配额

  • 然后根据贴图一步一步设置

  • 接下来设置项目配额 (就自己用的话 不用设也可以) 选择左侧菜单项目

  • 先创建一个项目 创建完后 直接点击项目名进入项目

  • 进入项目后选择左侧菜单的 项目设置 -> 基本信息

  • 管理下有一个 编辑项目配额 然后根据贴图一步一步设置

  • 下面再去创建一下 devops 项目 这个等同于 jenkins 流水线

  • 先点击左上的 工作台 -> 然后选择 左侧菜单的 -> devops项目

  • 然后跟图片一步一步操作

接下来我们 制作一个 jar 运行环境的镜像

  • 首先先去下载一个 jdk 文件我这里选择的是 jdk1.8 版本 8u341
  • 下载完通过连接工具连接到 master 节点
  • 然后把文件传输到一个目录
  • 我选择的是 /opt/java
root@master:/opt/java# ll
total 144704
drwxr-xr-x 2 root root      4096 Sep 15 16:18 ./
drwxr-xr-x 9 root root      4096 Sep 20 15:18 ../
-rwxrwxrwx 1 root root 148162542 Aug 26 14:04 jdk-8u341-linux-x64.tar.gz*
root@master:/opt/java# 
  • 文件放好了 创建一个 Dockerfile 文件
root@master:/opt/java# touch Dockerfile
root@master:/opt/java# ll
total 144704
drwxr-xr-x 2 root root      4096 Sep 22 15:25 ./
drwxr-xr-x 9 root root      4096 Sep 20 15:18 ../
-rw-r--r-- 1 root root       434 Sep 15 16:18 Dockerfile
-rwxrwxrwx 1 root root 148162542 Aug 26 14:04 jdk-8u341-linux-x64.tar.gz*
### java基础镜像 Dockerfile 文件内容

# 声明基础镜像
FROM centos:7
# 也可以选择 alpine:3.18.0 只有 377M  centos 的有 580M
#FROM alpine:3.18.0
    
# 作者
MAINTAINER picachu
# 执行shell 创建目录
RUN mkdir /usr/local/docker

RUN cd /usr/local/docker
# 把jdk 文件传到 镜像里
ADD jdk-8u341-linux-x64.tar.gz /usr/local/docker
# 设置环境变量
ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_341
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
# 设置防止中文乱码
ENV LANG C.UTF-8
ENV LANGUAGE C.UTF-8
ENV LC_ALL C.UTF-8
# 或者    
ENV LANG en_US.utf8
ENV LANGUAGE en_US.utf8    
ENV LC_ALL en_US.utf8    
    
查看 换将变量是否设置成功 
CMD ["java","-version"]
  • 把上述 文件内容添加到 文件里 记得保存
  • 保存完 执行下面这两个语句
## 看情况是否执行这句登录
## 如果你的镜像仓库是公开的就不用执行    
docker login docker仓库地址  -u docker仓库用户名 -p docker仓库密码
## 制作 镜像    
docker build -f dockerfile -t docker仓库地址/docker仓库项目名/openjdk:8u341 .
## 推送镜像    
docker push docker仓库地址/docker仓库项目名/openjdk:8u341
  • 这样 jar运行环境镜像就制作完了

现在去 配置harbor密钥 & gitlab密钥 & kube文件

  • 以企业空间管理员身份 登录系统
  • 选择 左侧菜单的 devops -> 然后选择刚刚创建的 devops 项目
  • 然后 点击 devops项目设置 -> 凭证 这里不贴图了
  • 然后根据图片操作一个一个创建
  • 下面是具体的配置 模仿这个添加就行
  • git 就是 gitlab 的登录用户名和密码
  • harbor 的也是登录用户名和密码

配置 harbor-secret (deploy要用到)

  • 通过连接工具连接到 master 节点 然后执行生成验证
  • 生成 kube 密钥是为了 通过 deploy.yaml 部署项目是拉去镜像
  • 我用的harbor 设置的私有仓库 如果是公共仓库不需要这步
## 解释
##kubectl create secret docker-registry 自定义用户名 --namespace=项目 --docker-server=docker镜像仓库地址 --docker-username=用户名 --docker-password=密码

kubectl create secret docker-registry harbor-secret --namespace=iam --docker-server=http://127.0.0.1:8088 --docker-username=docker --docker-password=123123

接下来 在项目里添加 Dockerfile 和 deploy.yaml

  • 在项目下添加 DockerFile(以 gateway 服务为例) 注意 DockerFile 没有后缀
  • Dockerfile 文件路径 /work/iam/base-gateway/src/main/resources/Dockerfile
## 基础镜像,使用alpine操作系统,openjkd使用8u201
FROM docker仓库地址/docker仓库项目名/openjdk:8u341

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

#应用构建成功后的jar文件被复制到镜像内,名字也改成了app.jar
ADD base-gateway/target/*.jar app.jar
RUN sh -c 'touch app.jar'

ENV JAVA_OPTS="-Xmx512m"

#暴露8080端口
EXPOSE 8080
#启动容器时的进程
ENTRYPOINT [ "sh", "-c", "java -XX:+PrintFlagsFinal -XX:+PrintGCDetails $JAVA_OPTS -Duser.timezone=GMT+08 -Djava.security.egd=file:/dev/./urandom -jar app.jar"]
  • 在项目下添加 deploy.yaml (以 gateway 服务为例)
  • Dockerfile 文件路径 /work/iam/base-gateway/src/main/resources/deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: gateway #服务名称
  name: gateway #服务名称
  namespace: smxiam #项目名 注意要跟企业空间的 项目名称一致
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gateway #服务名称
  template:
    metadata:
      labels:
        app: gateway #服务名称
    spec:
      containers:
        - name: gateway  #容器的名称,可以是服务名
          image: 《这里是你docker镜像仓库的地址》/docker仓库项目名/gateway:latest #服务的镜像地址
          imagePullPolicy: Always # 这里是设置 部署是否每次都拉去镜像 不要改
          ports:
            - containerPort: 8080 #容器端口
              protocol: TCP
          resources:
            requests: # 容器的大小
              memory: 800Mi #内存
              cpu: 700m # cpu 1000 为1核心
            limits: #限制大小
              memory: 2Gi #最大内存
              cpu: 1000m #最大CPU
          env:
            - name: JAVA_OPTS
              value: "-Xmx1000m -Xms700m" #执行环境
      imagePullSecrets:
      - name: harbor-secret # 这个是生成的 kube docker 镜像仓库密钥名称 (如果是公开的镜像仓库不不需要配置)
---
apiVersion: v1
kind: Service
metadata:
  name: gateway #服务名称
  labels:
    app: gateway #服务名称
  namespace: iam #项目名 注意要跟企业空间的 项目名称一致
spec:
  ports:
    - port: 8080  #端口号
      targetPort: 8080 #端口号
      nodePort: 30472 #设置固定的内网访问端口 不设置这个每次回变动
  type: NodePort #端口映射类型 固定
  selector:
    app: gateway #服务名称
#不是必须的,需要外部访问的服务才需要配置ingress
#apiVersion: networking.k8s.io/v1
#kind: Ingress
#metadata:
#  name: auth-ingress # 服务名称-ingress
#  namespace: smxiam #项目名 注意要跟企业空间的 项目名称一致
#  annotations:
#    nginx.ingress.kubernetes.io/rewrite-target: "/$1/$2"
#spec:
#  ingressClassName: nginx
#  rules:
#    - http:
#        paths:
#          - path: /iam/(gateway)/(.*)$
#            pathType: Prefix
#            backend:
#              service:
#                name: gateway # 服务名称
#                port:
#                  number:  8080 #端口号

接下来就是 在企业空间上配置 devops 运行脚本了

  • 以企业空间管理员身份 登录系统
  • 选择 左侧菜单的 devops -> 然后选择刚刚创建的 devops 项目
  • 进入项目后如下操作
  • 下面是 jenkinsfile 的代码
pipeline {
  agent {
    node {
      label 'maven'
    }
  }
 
  stages {
    stage('拉代码') {
      steps {
        git(url: 'git 地址', credentialsId: '配置的 git 凭证名称', branch: 'master', changelog: true, poll: false)
        sh 'ls'
      }
    }

 stage('打包') {
      steps {
        container ('maven') {
          sh "mvn clean package -Dmaven.test.skip"
          archiveArtifacts 'gateway/target/*.jar' ## 保存制品 为了查看打得jar 文件是否正确
        }
      }
    }

    stage('构建镜像') {
      steps {
        container ('maven') {
          withCredentials([usernamePassword(passwordVariable : 'REGISTRY_PASSWORD' ,usernameVariable : 'REGISTRY_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
            sh 'echo "$REGISTRY_PASSWORD" | docker login $REGISTRY -u "$REGISTRY_USERNAME" --password-stdin'
          }
          sh 'docker rmi $remoteImage:latest &'
          sh 'docker images -q --filter "dangling=true" | xargs -t --no-run-if-empty docker rmi &'
          
          sh 'docker build -f $dockerFile -t $remoteImage:$ImageTag .'
        }
          
      }
    }
   
    stage('推送镜像') {
      steps {
        container ('maven') {
          #sh 'docker tag $localFullImageName $remoteImage:latest '
          sh 'docker push $remoteImage:latest '
          sh 'docker rmi $remoteImage:latest &'
        }
      }
    }
    
    stage('kubernetes') {
      steps {
        container('maven') {
          sh 'cat $deployFile'
          withCredentials([
          kubeconfigFile(credentialsId: '$KUBECONFIG_CREDENTIAL_ID',variable: 'KUBECONFIG')
          ]) {
              sh 'envsubst < $deployFile | kubectl apply -f -'
            }

          }

        }
      }
  }

  parameters {
      string(name:'TAG_NAME',defaultValue: 'latest',description:'')
  }
 
  environment {
      DOCKER_CREDENTIAL_ID = '设置的docker镜像仓库 凭证名称'
      KUBECONFIG_CREDENTIAL_ID = 'kubeconfig凭证名称'
      REGISTRY = 'docker镜像 地址'
      REGISTRY_USERNAME = 'docker镜像仓库 用户名'
      REGISTRY_PASSWORD = 'docker镜像仓库 密码'
      APP_NAME = 'devops-sample'
      imageName = 'gateway'
      dockerFile = 'gateway/target/classes/Dockerfile' #dockerfile 相对路径
      deployFile = 'gateway/target/classes/deploy.yaml' #deploy.yaml 相对路径
      ImageTag = 'latest'
      localFullImageName = 'gateway:latest'
      remoteImage = 'docker镜像仓库地址/docker仓库项目名/gateway'
  }
}
  • 保存好文件后点击运行 执行部署流水线
  • 在执行记录页面点击啊记录 可以查看日志 这里就不做介绍了 可以自行尝试
  • 等一会到他 执行完成
  • 执行完 在项目 -> 应用负载 -> 服务 就能看到了
  • 这里贴图是执行成功的 服务
  • 最后让我们试一下 内网是不是能访问了
  • 访问规则就是 主节点ip:服务端口号/路径

到这了 一个微服务就部署完成了

如果有需要配置代码检测的朋友可以参考这个

kubesphere 配置sonarqube 代码检测