# 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 处理的工作负载类型,可选 DeploymentStatefulSet;不写表示都处理

# 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

编撰人:zhenxy