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:服务端口号/路径