基于 Spring Boot 的 Kubernetes 容器化部署平台,支持多集群部署、镜像构建、模板渲染等功能。
- 多集群部署: 支持 Local、AWS EKS、AWS XJP、阿里云、华为云、火山引擎、天翼云等 K8s 集群
- 多种部署类型: 支持 Jar 包部署、静态资源 (HTML) 部署
- 镜像构建: 支持 Jib 自动构建 Docker 镜像并推送到镜像仓库
- 模板渲染: 支持 Handlebars 模板动态生成 K8s 配置文件 (Deployment、Service、Ingress 等)
- 通知集成: 支持企业微信发布成功/失败通知
- CI/CD 集成: 提供 RESTful API,可与 Jenkins 等 CI 工具集成
- 权限控制: 支持企业微信消息验证权限
| 集群名称 | 说明 |
|---|---|
| local | 本地 K8s 集群 |
| aws | AWS EKS (中国区) |
| awsxjp | AWS EKS (日本区) |
| aliyun | 阿里云 ACK |
| huawei | 华为云 CCE |
| volc | 火山引擎 VKE |
| ctyun | 天翼云 CCE |
- Java 17+
- Maven 3.6+
- Docker (可选,用于本地构建镜像)
- Redis (用于企业微信 token 存储)
复制 src/main/resources/application.properties 为 application-local.properties 并修改配置:
# 服务配置
server.port=8081
spring.application.name=devops
# 镜像仓库配置
devops.local-registry.group=YOUR_REGISTRY_DOMAIN
devops.local-registry.username=YOUR_USERNAME
devops.local-registry.password=YOUR_PASSWORD
# AWS 配置 (如使用 AWS 集群)
devops.aws.app-id=YOUR_AWS_ACCESS_KEY_ID
devops.aws.app-secret=YOUR_AWS_SECRET_ACCESS_KEY
devops.aws.eks-name=YOUR_EKS_NAME
devops.aws.eks-end-point=YOUR_EKS_ENDPOINT
# Git 仓库配置
devops.git.url=YOUR_GIT_URL
devops.git.path=/path/to/kubernetes
devops.git.username=YOUR_GIT_USERNAME
devops.git.password=YOUR_GIT_PASSWORD
# Redis 配置
spring.redis.host=YOUR_REDIS_HOST
spring.redis.port=6379
# 企业微信配置
work.weixin.callback-url=YOUR_CALLBACK_URL
work.weixin.configs[0].corp-id=YOUR_CORP_ID
work.weixin.configs[0].corp-secret=YOUR_CORP_SECRET
work.weixin.configs[0].agent-id=YOUR_AGENT_ID# 打包
mvn clean package
# 运行
java -jar target/k8s-docker-devops-exec.jarPOST /deploy
参数说明:
| 参数 | 必填 | 说明 |
|---|---|---|
| app | 是 | 应用名称 |
| version | 是 | 版本号 |
| type | 是 | 部署类型: jar / html |
| cluster | 是 | 集群名称: local/aws/aliyun/huawei 等 |
| space | 是 | 命名空间 |
| port | 是 | 容器端口 |
| file | 否 | 部署文件 (jar 包或静态资源 zip) |
| arguments | 否 | 启动参数 |
请求示例 (curl):
curl -X POST "http://localhost:8081/deploy" \
-H "accept: */*" \
-H "Content-Type: multipart/form-data" \
-F "app=my-app" \
-F "version=1.0.0" \
-F "type=jar" \
-F "port=8080" \
-F "cluster=local" \
-F "space=dev" \
-F "file=@./target/my-app.jar"POST /yaml
用于测试 K8s 模板渲染,参数同 /deploy,不执行实际部署。
项目使用 Handlebars 模板引擎,支持自定义 K8s 资源配置。
模板目录: src/test/resources/templates/
系统处理请求时会按顺序执行以下处理器:
- PermissionCheckHandler - 权限检查
- JarHandler / HtmlHandler - 构建 Docker 镜像并推送
- K8sHandler - 生成并应用 K8s 配置
- SuccessNotifyHandler - 发送企业微信通知
模板中可使用以下变量:
| 变量 | 说明 | 示例值 |
|---|---|---|
| APP_NAME | 应用名称 | my-app |
| APP_VERSION | 版本号 | 1.0.0 |
| APP_PORT | 容器端口 | 8080 |
| NAME_SPACE | 命名空间 | dev |
| CLUSTER | 集群名称 | local |
| REPLICAS | 副本数 | 3 |
| REGISTRY_GROUP | 镜像仓库地址 | your-registry.com |
| SHORT_UUID | 构建 UUID 短码 | abc123xyz |
| TIME | 构建时间 | 2024-01-01 12:00:00 |
| FILE_NAME | 上传文件名 | app.jar |
| ISTIO | 是否启用 Istio | true/false |
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{APP_NAME}}-{{APP_VERSION}}
namespace: {{NAME_SPACE}}
spec:
replicas: {{REPLICAS}}
selector:
matchLabels:
app: {{APP_NAME}}
template:
spec:
containers:
- name: {{APP_NAME}}
image: {{REGISTRY_GROUP}}/{{NAME_SPACE}}/{{APP_NAME}}:{{SHORT_UUID}}
ports:
- containerPort: {{APP_PORT}}# 构建镜像
docker build -f Dockerfile -t devops .
# 推送镜像
docker tag devops YOUR_REGISTRY_DOMAIN/library/devops
docker push YOUR_REGISTRY_DOMAIN/library/devopsmvn jib:buildk8s-docker-devops/
├── src/main/java/com/github/izerui/devops/
│ ├── controller/ # REST API 控制器
│ ├── context/ # 配置上下文 (DevopsProperties, RequestContext 等)
│ ├── handler/ # 处理器链 (JarHandler, K8sHandler 等)
│ └── support/ # 集群实现、工具类
│ └── impl/ # 各集群具体实现
│ ├── LocalCluster.java
│ ├── AwsCluster.java
│ ├── AliyunCluster.java
│ ├── HuaweiCluster.java
│ ├── VolcCluster.java
│ └── CtyunCluster.java
├── src/main/resources/
│ └── application.properties # 配置文件
├── src/test/
│ ├── java/ # 测试代码
│ └── resources/
│ ├── templates/ # K8s YAML 模板
│ └── handlebars/ # Handlebars 模板
└── target/ # 编译输出
系统采用责任链模式处理部署请求,主要处理器包括:
| 处理器 | 说明 |
|---|---|
| PermissionCheckHandler | 企业微信消息验证权限 |
| JarHandler | Jar 包镜像构建与推送 |
| HtmlHandler | 静态资源镜像构建与推送 |
| K8sHandler | K8s 资源配置生成与应用 |
| SuccessNotifyHandler | 企业微信发布通知 |
devops.permission.authorize-cluster-names[0]=aws
devops.permission.authorize-cluster-names[1]=huawei
devops.permission.authorize-cluster-names[2]=aliyun# 开发环境镜像仓库
devops.local-registry.group=YOUR_REGISTRY_DOMAIN
devops.local-registry.username=YOUR_USERNAME
devops.local-registry.password=YOUR_PASSWORD
# 生产环境镜像仓库
devops.prod-registry.group=YOUR_REGISTRY_DOMAIN
devops.prod-registry.username=YOUR_USERNAME
devops.prod-registry.password=YOUR_PASSWORDdevops.cluster-notify.local=k8s-local
devops.cluster-notify.aws=k8s
devops.cluster-notify.huawei=k8sMIT License