# SeeyonLicenseInject(SLI)
SeeyonLicenseInject,简称 SLI,是一个基于 Kubernetes CRD 和自定义 Controller 实现的 License 自动挂载工具。
它面向国产化替代场景,用于给东方通 TongWeb、金蝶 Kingdee 等国产中间件工作负载统一挂载 License 文件。sli不像传统CRD控制器,使用 MutatingWebhook、ValidatingWebhook 或其他准入控制器,sli全部能力都通过“CRD + Controller”完成。
# 能解决什么问题
在实际集群中,信创中间件 License 通常以文件形式存在,例如 license.dat。如果每个 Deployment 或 StatefulSet 都手工配置 Secret Volume 和 VolumeMount,会出现几个问题:
- 工作负载多时,配置重复且容易遗漏。
- License Secret 名称或挂载路径变更时,需要批量修改多个工作负载。
- 删除 License 挂载时,也需要人工清理每个工作负载。
- 不同中间件的 License 管理方式不统一。
SLI 提供一个统一的自定义资源 LicenseMount。用户只需要创建一个 CR,Controller 会自动遍历目标命名空间下的 Deployment 和 StatefulSet,并把指定 Secret 挂载到容器内指定路径。
# 谨记
对已运行环境中的服务pod进行license注入的时候,pod会发生重启,请合理安排维护窗口,避免出现造成应用影响。对新增的服务不影响。
# 1. 部署包内容
sli-licensemount.yaml # 完整 Kubernetes 部署清单,包含 Namespace、CRD、RBAC、Controller Deployment
README.md # 运维使用说明
demo.yaml # 部署示例
sli-amd64.tar # 控制器amd64镜像
sli-arm64.tar # 控制器arm64镜像
# 2. 前置条件
- 已有可访问的 Kubernetes 集群。
- 本机已配置
kubectl,并且当前账号有创建 CRD、ClusterRole、ClusterRoleBinding、Deployment 的权限。 - 集群节点可以拉取 SLI 镜像。
确认当前连接的集群:
kubectl config current-context
kubectl get node -o wide
# 3. 选择镜像版本
当前成品镜像按 CPU 架构分别提供:
huyouba1/sli-controller:v0.1.0-amd64
huyouba1/sli-controller:v0.1.0-arm64
如果集群节点是 x86_64 / amd64,使用:
IMAGE=huyouba1/sli-controller:v0.1.0-amd64
如果集群节点是 ARM64 / aarch64,使用:
IMAGE=huyouba1/sli-controller:v0.1.0-arm64
混合架构集群需要使用多架构 manifest 镜像,或者按节点架构分别部署不同镜像。
# 4. 安装 SLI Controller
默认部署文件使用 huyouba1/sli-controller:v0.1.0-amd64。如果你的集群是 amd64,可以直接部署:
kubectl apply -f sli-licensemount.yaml
如果需要改为 arm64 镜像:
sed -i.bak 's#huyouba1/sli-controller:v0.1.0-amd64#huyouba1/sli-controller:v0.1.0-arm64#g' sli-licensemount.yaml
kubectl apply -f sli-licensemount.yaml
如果需要使用私有仓库镜像:
sed -i.bak 's#huyouba1/sli-controller:v0.1.0-amd64#registry.example.com/seeyon/sli-controller:v0.1.0-amd64#g' sli-licensemount.yaml
kubectl apply -f sli-licensemount.yaml
# 5. 检查安装状态
查看 CRD:
kubectl get crd licensemounts.sli.seeyon.com
查看 Controller:
kubectl -n kube-system get deploy sli-controller-manager
kubectl -n kube-system get pod -l control-plane=controller-manager
查看日志:
kubectl -n kube-system logs deploy/sli-controller-manager
Deployment Ready 后,SLI Controller 即可开始处理 LicenseMount 资源。
# 6. 创建 License Secret
以 seeyon-poc 命名空间和东方通 License 为例:
kubectl create namespace seeyon-poc
kubectl -n seeyon-poc create secret generic tongweb-license \
--from-file=license.dat=/path/to/license.dat # /path/to/license.dat 替换为真实license文件地址
Secret 必须和目标业务工作负载在同一个命名空间。
# 7. 创建 LicenseMount
保存下面内容为 tongweb-licensemount.yaml:
apiVersion: sli.seeyon.com/v1
kind: LicenseMount
metadata:
name: tongweb-license
spec:
targetNamespace: seeyon-poc
licenseSecret: tongweb-license # 保存license的secret名称
mountPath: /opt/tongweb/license # 容器挂载路径
workloadKinds:
- Deployment # 注入deployment
- StatefulSet # 注入statefulset
应用配置:
kubectl apply -f tongweb-licensemount.yaml
字段说明:
| 字段 | 说明 |
|---|---|
targetNamespace | 需要注入 License 的业务命名空间 |
licenseSecret | 保存 License 文件的 Secret 名称 |
mountPath | 容器内挂载路径,必须是绝对路径 |
workloadKinds | 处理的工作负载类型,可选 Deployment、StatefulSet;不写表示都处理 |
# 8. 验证挂载效果
查看 LicenseMount 状态:
kubectl get licensemount
kubectl describe licensemount tongweb-license
查看目标 Deployment 是否已注入 Volume 和 VolumeMount:
kubectl -n seeyon-poc get deploy <业务Deployment名称> -o yaml
检查滚动更新:
kubectl -n seeyon-poc rollout status deploy/<业务Deployment名称>
进入业务 Pod 查看 License 文件:
POD=$(kubectl -n seeyon-poc get pod -l app=<业务应用标签> -o jsonpath='{.items[0].metadata.name}')
kubectl -n seeyon-poc exec "$POD" -- ls -l /opt/tongweb/license
# 9. 更新 License
先创建新的 Secret:
kubectl -n seeyon-poc create secret generic tongweb-license-v2 \
--from-file=license.dat=/path/to/new-license.dat
再更新 LicenseMount:
kubectl patch licensemount tongweb-license \
--type merge \
-p '{"spec":{"licenseSecret":"tongweb-license-v2"}}'
Controller 会更新目标工作负载的 PodTemplate,并触发业务 Pod 滚动更新。
# 10. 修改挂载路径
kubectl patch licensemount tongweb-license \
--type merge \
-p '{"spec":{"mountPath":"/opt/tongweb/new-license"}}'
# 11. 删除 License 挂载
只删除挂载关系,不卸载 Controller:
kubectl delete licensemount tongweb-license
清理已注入到业务工作负载里的 Volume 和 VolumeMount。
# 12. 升级 Controller
修改部署清单中的镜像版本后重新应用:
sed -i.bak 's#huyouba1/sli-controller:v0.1.0-amd64#huyouba1/sli-controller:v0.1.1-amd64#g' deploy/sli-licensemount.yaml
kubectl apply -f deploy/sli-licensemount.yaml
kubectl -n kube-system rollout status deploy/sli-controller-manager
ARM64 环境请把镜像 tag 换成对应的 -arm64。
# 13. 卸载 SLI
建议先删除所有 LicenseMount,让 Controller 清理业务工作负载中的挂载配置:
kubectl get licensemount
kubectl delete licensemount --all
确认业务工作负载中的挂载已清理后,再卸载 Controller、RBAC 和 CRD:
kubectl delete -f sli-licensemount.yaml
注意:删除 CRD 会删除所有 LicenseMount 资源。生产环境请先确认不再需要这些 CR。
# 14. 常见排查
查看 Controller 日志:
kubectl -n kube-system logs deploy/sli-controller-manager
查看 LicenseMount 事件和状态:
kubectl describe licensemount <名称>
kubectl get licensemount <名称> -o yaml
确认 Secret 存在:
kubectl -n <业务命名空间> get secret <Secret名称>
确认 Controller 权限:
kubectl get clusterrole sli-manager-role -o yaml
kubectl get clusterrolebinding sli-manager-rolebinding -o yaml
# 15. 下载链接⛓️
通过网盘分享的文件:sli 链接: https://pan.baidu.com/s/1uXyp1OKCyNxZKUywNR2bzA 提取码: e2gr
快速跳转
← v8patchctl 补丁工具 CDN配置 →