准备工作:
一个简单springboot工程,只有1个接口,返回“helloworld”,如下:
- 访问接口:http://127.0.0.1:8080/hello,返回
Hello World!
- GIT仓库地址:HelloWord: HelloWorld简单用例
1、配置maven镜像加速
- 由于流水线自带的maven是默认下载依赖链接,会导致maven打包时间几十分钟,若K8S资源不足,会导致整个集群瘫痪
1.1、定位到ks-devops-agent
进入:平台管理-集群管理-配置中心-配置,搜索定位到ks-devops-agent
1.2、修改配置
1.3、编辑“MavenSetting”
在mirrors标签中,添加阿里云镜像加速
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
如下:
至此,maven配置完成
2、创建DevOps工程
- 进入:平台管理-访问控制-DevOps工程
- 点击创建按钮
我创建了一个shuizhu-persong工程
3、创建流水线
- 进入步骤2中创建的DevOps工程
- 进入后,点击创建按钮,创建流水线
这里可以填写代码仓库地址,也可以后面在流水线的具体步骤中进行配置,本文在后面步骤中进行配置
- 保留构建的天数:流水线构建的制品需要保留多久
- 保留构建的最大个数:流水线历史记录展示的个数,如设置5,列表只展示近5条
- 其他配置默认即可,点击确定创建完成
4、编辑流水线
进入步骤3中创建的流水线,如下
注意:
上图中,如果没有编辑流水线功能,好像是kubesphere本身的bug,解决方法:
- 创建新的用户并授权,加入到上面创建的devops中,并授予管理权限
- 删除上面的流水线
- 退出当前用户,登陆新用户
- 重新创建流水线即可
4.1、编辑流水线
kubesphere平台提供了流水线模板,运维这不需要关注jenkins文件如果编写,这里我选择自定义流水线
4.2、配置代理
- 由于我的流水线的“产品”是Springboot程序,这里我的代理label选择maven
4.3、添加【GIT代码拉取】流水线阶段
4.3.1、初始化流水线阶段信息
- 名称:任意填写
- 代理:选择none方式
4.3.2、指定容器
所有的构建步骤建议在容器中进行,防止确认各种工具
4.3.3、添加Git代码拉取步骤
注意:以下的步骤都是在指定容器下,进行的嵌套步骤:
填写Git信息:
注意:如果仓库是私有的,需要新增凭证即可,如下
4.3.4、maven编译代码
添加嵌套步骤---shell
添加脚本内容如下
echo '项目结构如下:'
ls
echo 'mvn clean package -Dmaven.test.skip=true start ...'
mvn clean package -Dmaven.test.skip=true
echo 'mvn clean package -Dmaven.test.skip=true end ...'
echo 'maven编译后的项目结构如下:'
ls
echo 'target目录如下:'
ls target/
4.4、添加【镜像制作】流水线阶段
4.4.1、初始化流水线阶段信息
4.4.2、指定为maven容器
4.4.3、制作docker镜像
docker build -t hello-word:v1.0 .
4.5、镜像推送
4.5.1、初始化流水线阶段信息
4.5.2、指定为maven容器
4.5.3、添加私有harbor仓库
#指定私有harbor
mkdir /etc/docker
ls /etc/docker/
touch /etc/docker/daemon.json
echo '{ "live-restore": true,"insecure-registries":["111.230.19.178:80"] }' > /etc/docker/daemon.json
4.5.4、推送镜像
docker login 111.230.19.178 -u admin -p xxxx
echo '开始推送'
docker tag hello-word:v1.0 111.230.19.178/shuizhu/hello-word-2024:v1.0
docker push 111.230.19.178/shuizhu/hello-word-2024:v1.0
4.6、发布
4.6.1、初始化流水线
4.6.2、指定为maven容器
4.6.3、创建deploy文件
- 添加嵌入步骤
- 选择shell,输入以下内容
touch hello-word.yaml
echo 'apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: hello-word-2024
name: hello-word-2024
namespace: shuizhu # 正常创建的项目空间名称,这里是我的项目
spec:
progressDeadlineSeconds: 600
replicas: 3
strategy:
type: RollingUpdate # Recreate:在创建新Pods之前,所有现有的Pods会被杀死 RollingUpdate:滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数
rollingUpdate:
maxSurge: 1 #maxSurge:1 表示滚动升级时会先启动1个pod
maxUnavailable: 0 #maxUnavailable:1 表示滚动升级时允许的最大Unavailable的pod个数,也可以填写比例,maxUnavailable=50%
selector:
matchLabels:
app: hello-word-2024
template:
metadata:
labels:
app: hello-word-2024
spec:
containers:
- env:
- name: CACHE_IGNORE
value: js|html
image: 111.230.19.178/shuizhu/hello-word-2024:v1.0 #需要部署的镜像名称及版本
#注释下面代码,取消健康探测
#readinessProbe:
# httpGet:
# path: /
# port: 8080
# timeoutSeconds: 10
# failureThreshold: 30
# periodSeconds: 5
imagePullPolicy: Always
name: hello-word-2024
ports:
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: 300m
memory: 600Mi
requests:
cpu: 100m
memory: 100Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullSecrets:
- name: shuizhu-harbor
dnsPolicy: ClusterFirst
restartPolicy: Always
terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
labels:
app: hello-word-2024-service
name: hello-word-2024-service
namespace: shuizhu # 正常创建的项目空间名称
spec:
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: hello-word-2024
sessionAffinity: None
type: NodePort
' >hello-word.yaml
4.6.4、kubectl发布
kubectl apply -f hello-word.yaml
5、运行流水线
- 运行流水线
- 运行成功
6、查看发布后的部署工程及service
- 查看pod数量
- 查看service
我的service对外暴露的端口为30171,可以通过K8S集群中,任意的节点IP+30171访问流水线创建的项目
7、访问流水线部署的工程
开头说了,springboot工程只有一个hello的接口,原访问的URL为:
http://127.0.0.1:8080/hello
K8S为我们暴露的端口为30171,因此,我们通过K8S任意节点IP访问即可,访问格式如下: