1 - 2.1 模块开发
本上手指南主要介绍动态合并部署模式,用于省资源与提高研发效率。如果你只是想节省资源,可以使用静态合并部署。本上手指南使用官网的 tomacat sample 进行演示: 1.
预先准备
研发工具
代码下载
git clone git@github.com:koupleless/samples.git
这个仓库包含了多个框架的 samples,基座和模块都在同一个代码仓库里,如图所示
导入 springboot-samples 工程到编译器
- 导入 springboot-samples,有两种方式导入工程到编译器
- 方式一:导入 samples 到编译器,然后选择 springboot-samples 子目录的 pom 为 maven 工程
- 方式二:直接导入 springboot-samples 到编译器,此时自动将 springboot-samples 导入为 maven 工程
- 执行如下命令构建 springboot-samples/web/tomcat 基座与两个模块
mvn -pl web/tomcat/biz1-web-single-host,web/tomcat/biz2-web-single-host -am clean package -DskipTests
如果构建失败,请检查 maven 版本是否 >= 3.9.x(可将公共 bundle 自动 install),构建完之后可以看到模块打出的模块 jar 包
本地环境启动验证
- 启动基座,按照普通应用启动即可
- 安装模块1
arkctl deploy /xxx/path/to/biz1-web-single-host/target/biz1-web-single-host-0.0.1-SNAPSHOT-ark-biz.jar
- 安装模块2
arkctl deploy /xxx/path/to/biz2-web-single-host/target/biz2-web-single-host-0.0.1-SNAPSHOT-ark-biz.jar
- 测试验证
curl http://localhost:8080/biz1/
执行 curl 命令返回 hello to /biz1 deploy
curl http://localhost:8080/biz2/
执行 curl 命令返回 hello to /biz2 deploy
更多实验请查看 samples 用例
2 - 2.2 模块运维
本上手指南主要介绍基于 Module Controller V2 的模块运维。本上手指南包含:
- 环境准备
- Module Controller V2 部署
- 测试基座准备
- 模块发布与状态查看
环境准备
K8S 环境部署
Module Controller V2 基于 K8S 构建模块运维能力,因此,首先需要准备一个基础 K8S 环境。
注意: 目前 Module Controller 只支持 arm64 / amd64 的运行环境。
如果已经有可用的 K8S 集群,请跳过本节。
本地测试推荐使用 Minikube 快速在本地搭建 K8S。Minikube 是一个开源的本地 Kubernetes 搭建工具,能够帮助我们快速完成 K8S 各依赖组件的部署。
为了安装 Minikube,首先需要安装 Docker 运行环境:Docker官方网站
完成 Docker 安装并完成 Docker daemon 启动之后,我们就完成了所有 Minikube 的安装准备工作。
Minikube 的安装可以参考官方文档
Module Controller V2 部署
Module Controller V2 有两种部署方式:
- 本地运行(需要配置 go 语言环境,不建议)
- 镜像部署(建议)
接下来我们以镜像部署为例。
首先我们需要为 Module Controller V2 准备必要的 RBAC 配置。
接下来,依次 apply 上面的三个 yaml 文件,完成 service account 的权限设置与绑定。
接下来我们需要准备 Module Controller 部署的 Pod Yaml:
apiVersion: v1
kind: Pod
metadata:
name: module-controller
labels:
app: module-controller
spec:
serviceAccountName: virtual-kubelet # 上一步中配置好的 Service Account
containers:
- name: module-controller
image: serverless-registry.cn-shanghai.cr.aliyuncs.com/opensource/release/module_controller:2.1.0 # 已经打包好的镜像
imagePullPolicy: Always
resources:
limits:
cpu: "1000m"
memory: "400Mi"
ports:
- name: httpTunnel
containerPort: 7777
env:
- name: ENABLE_HTTP_TUNNEL
value: "true"
apply 上述 Module Controller 的 yaml 到 K8S 集群,等待 Module Controller Pod 变成 Running 状态。
接下来,模块运维能力已经搭建完成了,接下来将准备测试基座和测试模块。
测试基座部署
为了方便上手,我们这里也准备好了测试基座的 Docker 镜像,首先下载基座 Yaml
apiVersion: v1
kind: Pod
metadata:
name: base
labels:
app: base
spec:
containers:
- name: base
image: serverless-registry.cn-shanghai.cr.aliyuncs.com/opensource/test/base-web:1.1.1 # 已经打包好的镜像
imagePullPolicy: Always
ports:
- name: base
containerPort: 8080
- name: arklet
containerPort: 1238
env:
- name: MODULE_CONTROLLER_ADDRESS
value: {YOUR_MODULE_CONTROLLER_IP}
同上一步,将yaml中的 {YOUR_MODULE_CONTROLLER_IP}
替换为实际 Module Controller 的Pod IP。
apply 更改后的 yaml 到 K8S 集群,等待 Base Pod 变成 Running 状态。
基座启动完成之后,我们可以通过以下方式验证基座已经成功映射成为 VNode:
kubectl get nodes
看到存在名为 vnode.test-base.dev 的 node,并且状态为 Ready,则说明基座已经成功启动并完成映射。
上述 uuid 是在基座启动时生成的,每一次重新启动都会不同
接下来为了方便验证访问,我们使用 port-forward
将基座容器的服务暴露出来,使用如下命令:
kubectl port-forward base 8080:8080
接下来访问链接 如果能够正常访问,说明已完成映射。
测试模块发布与状态查看
模块发布
为了对比,我们首先看一下模块还没有安装的时候的情况,访问基座服务:模块测试
此时应当返回错误页,表明模块还未安装。
接下来我们将使用 Deployment 对模块进行发布,将下面的模块 yaml apply 到 K8S ,即可进行模块发布。这里以单个模块发布为例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: biz1
labels:
virtual-kubelet.koupleless.io/component: module-deployment
spec:
replicas: 1
selector:
matchLabels:
module: biz1
template:
metadata:
labels:
module: biz1
virtual-kubelet.koupleless.io/component: module
spec:
containers:
- name: biz1
image: https://serverless-opensource.oss-cn-shanghai.aliyuncs.com/module-packages/stable/biz1-web-single-host-0.0.1-SNAPSHOT-ark-biz.jar
env:
- name: BIZ_VERSION
value: 0.0.1-SNAPSHOT
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: base.koupleless.io/stack
operator: In
values:
- java
- key: vnode.koupleless.io/version
operator: In
values:
- 1.0.0
- key: vnode.koupleless.io/name
operator: In
values:
- koupleless-sample
tolerations:
- key: "schedule.koupleless.io/virtual-node"
operator: "Equal"
value: "True"
effect: "NoExecute"
- key: "schedule.koupleless.io/node-env"
operator: "Equal"
value: "dev"
effect: "NoExecute"
发布完成之后,可以通过 kubectl get pods
来查看所有模块 pod 的状态。
当 deployment 创建出的 pod 状态变为 Running 之后,表示当前模块已经安装完成了,接下来我们再次访问基座服务: 模块测试 来验证模块安装情况。
可以看到,页面内容已经发生了变化,展示:hello to /biz1 deploy
,表明模块已经安装完成。
模块删除
模块删除可以直接通过删除模块的 Deployment 来实现,使用命令:
kubectl delete deployment biz1
可以通过 kubectl get pods
来查看 pod 是否已经删除成功。
删除成功之后,再次访问基座服务 模块测试 来验证模块卸载情况。
可以看到,页面内容又恢复回了模块未安装的状态,表明模块卸载完成。
3 - 2.3 模块完整生命周期过程
本上手指南主要介绍动态合并部署模式,用于省资源与提高研发效率。如果你只是想节省资源,可以使用静态合并部署。本上手指南包含:
- 基座接入
- 模块接入
- 模块开发验证
- 模块部署上线(暂不可用,待更新)
这里也提供了视频教程,可点击此处查看。
预先准备
研发工具
运维工具 (静态合并部署可不需要)
- docker
- kubectl
- k8s 集群如 minikube v1.10+
基座接入
模块接入
本地环境开发验证
模块部署上线, 以 minikube 集群为例 (暂不可使用,待更新)
第一步:部署运维组件 ModuleController
kubectl apply -f xxx/xxx.yaml
第二步:使用样例基座发布
- 基座部署到 k8s 集群中,创建基座的 service,暴露端口, 可参考这里
- 执行 minikube service base-web-single-host-service, 访问基座的服务
第三步:发布模块
有两种方式发布模块,
- 直接部署本地模块 jar 包到 k8s 集群中
arkctl deploy ${模块构建出的 jar 包路径} --pod ${namespace}/${podname}
- 通过 k8s 模块 deployment 部署上线 创建模块 deployment,直接使用 kubectl apply 进行发布
kubectl apply -f xxx/xxxxx/xx.yaml