diff --git a/core/_category_.json b/core/_category_.json new file mode 100644 index 000000000..b8ef1630c --- /dev/null +++ b/core/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "内核", + "position": 3, + "link": { + "type": "generated-index", + "description": "KubeBB 管理组件生命周期的内核" + } +} \ No newline at end of file diff --git a/core/concepts/_category_.json b/core/concepts/_category_.json new file mode 100644 index 000000000..d3b5fb1f8 --- /dev/null +++ b/core/concepts/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "概念", + "position": 2, + "link": { + "type": "generated-index", + "description": "概念相关的知识及详细的使用教程" + } +} \ No newline at end of file diff --git a/core/concepts/component.md b/core/concepts/component.md new file mode 100644 index 000000000..8b5751327 --- /dev/null +++ b/core/concepts/component.md @@ -0,0 +1,130 @@ +--- +sidebar_position: 2 +--- +# 组件 + +组件是将 `chart package` 映射为集群资源的一个概念,组件定义了 `chart package` 的基础描述信息,版本信息等。组件一般由仓库创建出来,无需手动创建。 + + + +## 使用 + +下面是手动创建一个组件示例: + +1. 准备组件 component.yaml + +```yaml +apiVersion: core.kubebb.k8s.com.cn/v1alpha1 +kind: Component +metadata: + labels: + kubebb.component.repository: repository-bitnami-sample + name: repository-bitnami-sample.wordpress + namespace: kubebb-system + ownerReferences: + - apiVersion: core.kubebb.k8s.com.cn/v1alpha1 + kind: Repository + name: repository-bitnami-sample + uid: a5b8b73d-47a5-40e1-9839-7aebf8a25618 +spec: {} +``` + +```shell +kubectl apply -f component.yaml +``` + +2. 准备更新组件 status.yaml + +```yaml +status: + description: WordPress is the world's most popular blogging and content management + platform. Powerful yet simple, everyone from students to global corporations use + it to build beautiful, functional websites. + home: https://bitnami.com + icon: https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png + keywords: + - application + - blog: + - cms + - http + - php + - web + - wordpress + maintainers: + - name: VMware, Inc. + url: https://github.com/bitnami/charts + - name: Bitnami + url: https://github.com/bitnami/charts + name: wordpress + repository: + apiVersion: core.kubebb.k8s.com.cn/v1alpha1 + kind: Repository + name: repository-bitnami-sample + namespace: kubebb-system + uid: a5b8b73d-47a5-40e1-9839-7aebf8a25618 + sources: + - https://github.com/bitnami/charts/tree/main/bitnami/wordpress + versions: + - appVersion: 6.2.2 + createdAt: "2023-06-06T19:08:58Z" + deprecated: false + digest: 47096ed3f0a385e5830e90c75f443b7be107d7fa6df6aa869e7deb60b6cb6f8f + updatedAt: "2023-06-08T05:34:00Z" + version: 16.1.13 + - appVersion: 6.2.2 + createdAt: "2023-06-05T12:52:45Z" + deprecated: false + digest: 2005819fa8a08dea1f73585bcc4a37d83d3ef4f787c3927b5f51d2b5ae826dcb + updatedAt: "2023-06-08T05:34:00Z" +``` + +```shell +kubectl -nkubebb-system patch component.core.kubebb.k8s.com.cn repository-bitnami-sample.wordpress --type=merge --subresource status --patch-file status.yaml +``` + +## CRD 定义说明 + +CRD 的代码定义位于 [ComponentTypes](https://github.com/kubebb/core/blob/main/api/v1alpha1/component_types.go)。组件的信息都定在 `status` 中, 接下来会详细介绍每个字段的含义及其作用。 + +- `status.name` + + 该字段用来保存 `chart package` 的名字。 +- `status.versions` + + 该字段是数组,用来保存 `chart package` 的多个版本。每个版本包含的信息如下 + + - `status.versions[index].appVersion` 定义 `chart packge` 里面的应用的版本信息。 + - `status.versions[index].createdAt` 创建时间 + - `status.versions[index].updatedAt` 更新时间 + - `status.versions[index].deprecated` 当前版本是否废弃 + - `status.versions[index].version` `chart package` 的版本信息 + - `status.versions[index].digest` 数字签名 +- `status.description` + + `chart package` 的描述信息 +- `status.maintainers` + + 该字段是数组类型,每一项都是 `chart package` 的维护者。每一项的包含的信息如下 + + - `status.maintainers[index].name` 维护者名字 + - `status.maintainers[index].email` 维护者的邮箱 + - `status.maintainers[index].url` 维护者的网站 +- `status.home` + + 组件的官网。 +- `status.soureces` + + 该字段是字符串数组类型,定义组件代码仓库。 +- `status.keywords` + + 该字段是字符串数组类型,定义与该组件关联的关键词。 +- `status.icon` + + 定义该组件的图标 +- `status.deprecated` + + 定义当前组件是否废弃 + +## 工作原理 + +组件也实现为 Kubernetes Operator,主要功能就是当组件创建,更新给每个组件添加 label `kubebb.component.repository=`,方便搜索。 diff --git a/core/concepts/componentplan.md b/core/concepts/componentplan.md new file mode 100644 index 000000000..e85931aa8 --- /dev/null +++ b/core/concepts/componentplan.md @@ -0,0 +1,349 @@ +--- +sidebar_position: 3 +--- + +# 组件安装计划 + +ComponentPlan 会安装一个组件到集群,类似执行一次 `helm install/upgrade` 操作,只不过将 `helm install/upgrade` 命令中的参数固化到 ComponentPlan 的 spec +字段中,将涉及到的 docker 镜像以及安装后集群对象和现有对象的 diff 显示在 status字段中,并且可以设置失败后自动重试的次数。 + +## 使用 + +下面是一个 ComponentPlan 示例: + +```yaml +apiVersion: core.kubebb.k8s.com.cn/v1alpha1 +kind: ComponentPlan +metadata: +# labels: +# core.kubebb.k8s.com.cn/componentplan-release: nginx + name: nginx-15.0.2 + namespace: kubebb-system +spec: + approved: true + component: + name: repository-bitnami-sample.nginx + namespace: kubebb-system + name: my-nginx + override: + images: + - name: docker.io/bitnami/nginx + newTag: latest # the default image is docker.io/bitnami/nginx:1.25.1-debian-11-r0, will be replaced by docker.io/bitnami/nginx:latest + version: 15.0.2 +#status: +# conditions: +# - lastTransitionTime: "2023-06-21T03:44:31Z" +# reason: "" +# status: "True" +# type: Approved +# - lastTransitionTime: "2023-06-21T03:44:37Z" +# reason: "" +# status: "True" +# type: Installed +# - lastTransitionTime: "2023-06-21T03:44:37Z" +# reason: "" +# status: "True" +# type: Succeeded +# images: +# - docker.io/bitnami/nginx:latest +# installedRevision: 3 +# latest: true +# observedGeneration: 5 +# resources: +# - NewCreated: true +# apiVersion: v1 +# kind: Service +# name: my-nginx +# - NewCreated: true +# apiVersion: apps/v1 +# kind: Deployment +# name: my-nginx +``` + +上述 ComponentPlan 定义了安装的组件是 `kubebb-system` 命名空间的 `repository-bitnami-sample.nginx`。 +安装名为 `my-nginx`,安装版本为 `15.0.2`。 +同时在安装时,将镜像 `docker.io/bitnami/nginx` 的 `tag` 替换为 `latest`。 + +通过 `status` 字段可以看到,当前组件涉及的镜像以及资源。其中资源会标明是新创建还是更新现有资源,一个更新现有资源的例子为: + +```yaml +- apiVersion: v1 + kind: Service + name: my-wordpress + specDiffwithExist: no spec diff, but some field like resourceVersion will update +- apiVersion: apps/v1 + kind: Deployment + name: my-wordpress + specDiffwithExist: | + metadata: + annotations: map[deployment.kubernetes.io/revision:2] -> (REMOVED) + spec: + replicas: 3 -> 1 + template: + spec: + containers: + '[#0]': + image: docker.io/bitnami/wordpress:6.2.2-debian-11-r9 -> docker.io/bitnami/wordpress:6.2.2-debian-11-r11 + resources: + requests: + cpu: 400m -> 300m + memory: 1Gi -> 512Mi +``` + +## CRD 定义说明 + +CRD 的代码定义位于 [componentplan_types.go](https://github.com/kubebb/core/blob/main/api/v1alpha1/componentplan_types.go)。接下来会详细介绍每个字段的含义及其作用。 + +:::tip +说明:对于下面的 yaml,我们想要访问 bar 字段,书写格式为 `spec.foo.bar` + +```yaml +spec: + foo: + bar: xx +``` + +::: + +### 配置说明 + +ComponentPlan 的可选配置匹配了 helm install / upgrade / uninstall 的可选参数,有一些参数 ComponentPlan 并不支持: + +1. `--create-namespace` 参数不支持,helm release 会创建在 ComponentPlan 的同名 namespace 中。 +2. `--dry-run` 参数不支持,不需要模拟,模拟运行的结果会出现在 ComponentPlan 的 status 字段中。 +3. `--replace` 参数不支持,helm 标记该参数不应该用于生产环境。 +4. `--render-subchart-notes` 参数不支持,我们不展示 notes 信息。 +5. `--devel` 参数不支持,如果需要使用`devel`版本,`spec.version` 字段指定 `>0.0.0-0` 即可。 +6. `--nameTemplate` 和 `--generateName` 参数不支持,因为这两个字段在多次运行过程中可能会生成不确定的结果,我们使用 `spec.name` 来生成固定的名称。 +7. `--reset-values` 和 `--reuse-values` 参数不支持,我们使用 `spec.override.values` 和 `spec.override.valuesFrom` 来重写配置。 +8. 其他认证参数比如 `--username`,需要在 Repository 中指定。 + +其他配置为: + +- `spec.componet` + + 该字段用来指明要监控的组件实例,一般使用 `namespace` 和 `name` 来唯一确定 +- `spec.version` + + 需要安装的组件版本。 +- `spec.approved` + + 是否同意安装。`bool` 类型,`true` 或 `false`,当为 `true` 时,自动触发安装流程。为 `false` 时,只会解析这个组件的 `manifest`,并填充 `status` 字段,方便用户判断这次安装会对集群中现有资源带来的影响。 +- `spec.name` + + 组件安装到集群中的名称。类似 `helm release` 的名称 +- `spec.force` *可选字段* + + 布尔值,更新时通过替换策略强制更新资源, 类似 `helm upgrade --force` 参数,默认为 `false` +- `spec.timeoutSeconds` *可选字段* + + 整数值,创建/更新/删除时的超时时间,单位为秒,默认为 `300`,即 5 分钟。类似 `helm install/upgrade --timeout` 参数 +- `spec.wait` *可选字段* + + 布尔值,如果设置为 `true`,将等待所有的 Pod、PVC、Service 和 Deployment、StatefulSet 或 ReplicaSet 的最小数量的 Pod 处于就绪状态才认为安装/更新成功。等待的时间即为 `spec.timeoutSeconds` 的值,默认为 `false`,类似 `helm install/upgrade --wait` 参数。 +- `spec.waitForJobs` *可选字段* + + 布尔值,如果设置为 `true`,将等待所有的 Job 完成才认为安装/更新成功。等待的时间即为 `spec.timeoutSeconds` 的值,默认为 `false`,类似 `helm install/upgrade --wait-for-jobs` 参数。 +- `spec.description` *可选字段* + + 给安装/更新添加一个自定义描述。默认为空,类似 `helm install/upgrade --description` 参数。 +- `spec.dependencyUpdate` *可选字段* + + 布尔值,在安装/更新组件前,是否更新缺少的依赖项。类似 `helm install/upgrade --dependency-update` 参数,默认为 `false` +- `spec.disableHooks` *可选字段* + + 布尔值,如果设置为 `true`,则阻止 Hook 在安装过程中运行,并禁用升级前/后 Hook,类似 `helm install/upgrade --no-hooks` 参数,默认为 `false` +- `spec.disableOpenAPIValidation` *可选字段* + + 布尔值,如果设置为 `true`,安装过程将不会根据 Kubernetes OpenAPI Schema 验证渲染的模板。类似 `helm install/upgrade --disable-openapi-validation` 参数,默认为 `false` +- `spec.atomic` *可选字段* + + 布尔值,如果设置为 `true`,安装/更新过程会在安装/更新失败时删除安装。如果 `spec.atomic` 设置为 `true`,将自动设置 `spec.wait` 为 `true`。类似 `helm install/upgrade --atomic` 参数,默认为 `false` +- `spec.skipCRDs` *可选字段* + + 布尔值,如果设置为 `true`,则跳过 CRD 的安装。默认情况下,如果尚未安装 CRD,会自动安装。类似 `helm install/upgrade --skip-crds` 参数,默认为 `false` +- `spec.enableDNS` *可选字段* + + 布尔值,在渲染模板时是否启用 DNS 查询,类似 `helm install/upgrade --enable-dns` 参数 默认为 `false` +- `spec.historyMax` *可选字段* + + 整数值,限制每个 release 保存的最大 revisions 数目。使用 `0` 表示无限制,默认为 `10` +- `spec.maxRetry` *可选字段* + + 整数值,创建/更新最大重试次数,默认为 `5` +- `spec.cleanupOnFail` *可选字段* + + 布尔值,当升级失败时,允许删除在此升级中创建的新资源,类似 `helm upgrade --cleanup-on-fail` 参数,默认为 `false`。 +- `spec.keepHistory` *可选字段* + + 布尔值,卸载时,删除所有相关资源,并将发布标记为已删除,但保留发布历史。类似 `helm uninstall --keep-history` 参数,默认为 `false`。 +- `spec.override` *可选字段* + + 用于覆盖原组件配置的字段。 + + - `spec.override.values` + + `JSON` 格式的 `values`,用于覆盖默认值 + - `spec.override.valuesFrom` + + 字段为数组。当要设定的字段偏多时,我们一般希望把 `values.yaml` 单独拿出来,放在 `ConfigMap` 或者 `Secret` 中,而且我们可能会有很多 `values.yaml` 文件。具体格式为: + + - `spec.override.valuesFrom[].kind` + + 可选项为 `Secret` 或 `ConfigMap` + - `spec.override.valuesFrom[].name` + + `Secret` 或 `ConfigMap` 的名称,不需要 `namespace` 字段,因为只会查找和当前 ComponentPlan 同 `namespace` 的资源。 + - `spec.override.valuesFrom[].valuesKey` + + `Secret` 或 `ConfigMap` 的 `data` 中的 `key`,默认为 `values.yaml` 会尝试先后查询 `ConfigMap` 中的 `Data` 和 `BinaryData` 字段,`Secret` 中的 `StringData` 和 `Data` 字段。 + - `spec.override.set` + + 数组,类似 `helm template --set` 的参数 + - `spec.override.set-string` + + 数组,类似 `helm template --set-string` 的参数 + - `spec.override.images` + + 数组。类似 [`kustomize` 的镜像自定义参数](https://kubectl.docs.kubernetes.io/references/kustomize/builtins/#_imagetagtransformer_) + + - `spec.override.images[].name` + + 去除 `tag` 后的原始镜像名称 + - `spec.override.images[].newName` + + 替代原始镜像名称的名称 + - `spec.override.images[].newTag` + + 替代原始 `tag` 的新 `tag` 名称 + - `spec.override.images[].digest` + + 替代原始 `tag` 的新 `digest`,如果 `digest` 有值,会忽略 `newTag` 的值。 + +### 状态描述 + +一个典型的 ComponentPlan 状态示例如下: + +```yaml +status: + conditions: + - lastTransitionTime: "2023-07-25T12:22:12Z" + reason: "" + status: "True" + type: Approved + - lastTransitionTime: "2023-07-25T12:25:00Z" + message: timed out waiting for the condition + reason: UpgradeFailed + status: "False" + type: Actioned + - lastTransitionTime: "2023-07-25T12:25:00Z" + reason: "" + status: "False" + type: Succeeded + images: + - docker.io/bitnami/nginx:xxxxx + installedRevision: 4 + latest: true + observedGeneration: 1 + resources: + - NewCreated: true + apiVersion: v1 + kind: Service + name: my-nginx + - NewCreated: true + apiVersion: apps/v1 + kind: Deployment + name: my-nginx +``` + +- `status.conditions` + + 数组,ComponentPlan 的状态 + - `status.conditions[].lastTransitionTime` + + 上次从一种状态转换到另一种状态时的时间戳 + - `status.conditions[].reason` + + 机器可读的、驼峰编码(UpperCamelCase)的文字,表述上次状况变化的原因 + - `status.conditions[].message` + + 人类可读的消息,给出上次状态转换的详细信息 + - `status.conditions[].status` + + 表明该状况是否适用,可能的取值有 `True"`、`False` 或 `Unknown` + - `status.conditions[].type` + + 状况的名称 + + 可能包含以下状态: + + - `Approved` + + 用户已经同意该组件安装计划(ComponentPlan)的安装 + - `Actioned` + + 某个操作已经完成 + - `Succeeded` + + 用户期待的操作已经全部完成 + +- `status.images` + + 该 ComponentPlan 会引入的镜像列表 +- `status.installedRevision` + + 该 ComponentPlan 安装的helm release revision版本。 +- `status.latest` + + helm release 的最新版本是否是该 ComponentPlan 安装的。支持多个 ComponentPlan 按部署时间安装/升级同一个 helm release。 +- `status.observedGeneration` + + 用于程序内部处理。表示该 ComponentPlan 基于的 `.metadata.generation` 的过期次数。 例如,如果 `.metadata.generation` 当前为 12,但 `.status.observedGeneration` 为 9, 则相对于实例的当前状态已过期。 +- `status.resources` + + 数组,ComponentPlan 涉及的资源 + + - `status.resources[].specDiffwithExist` + + 展示该资源的 manifest 在该 ComponentPlan 应用前后的对比 + - `status.resources[].NewCreated` + + 布尔值,该资源是否是新创建的 + - `status.resources[].kind` + + 该资源的类型 + - `status.resources[].name` + + 该资源的名称 + - `status.resources[].apiVersion` + + 该资源的 apiVersion 信息 + +## 工作原理 + +组件安装以 Kubernetes Operator 方式实现, 底层通过调用 Helm Go SDK 实现组件安装、升级和卸载。 + +在运行时,通过监测集群中是否有同名 `helm release` 来智能使用 `helm install` 或者 `helm upgrade` 相关函数进行安装或升级。 + +安装或升级时,会将 ComponentPlan 中的配置传递给相关函数,功能和 `helm install` 或者 `helm upgrade` 基本一致。 + +当删除 ComponentPlan 时,判断当前集群中的同名的 `helm release` 的最新版本是否由待删除的 ComponentPlan 安装,如果是,则同时调用 `helm uninstall` 相关函数删除该 helm release。 + +一些细节: + +1. 创建 ComponentPlan 后,operator 会尝试自动解析该 ComponentPlan 中引入的 helm release 会对集群中现有资源的影响,结果会展示在 ComponentPlan 的 status + 字段中,类似于先进行 `helm install/upgrade --dry-run` 后,将生成的 manifest 再进行 `kubectl diff` 操作, +2. 只有 ComponentPlan 中的 `spec.approved` 为 `true`,对应的 `helm release` 才会真正安装。 +3. 单个 ComponentPlan 的镜像替换 (即 `spec.override.images` + 字段)的规则遵循 [kustomize:ImageTagTransformer](https://kubectl.docs.kubernetes.io/references/kustomize/builtins/#_imagetagtransformer_) + 规范,代码实现也是直接调用了 kustomize 的这部分代码,降低了用户学习成本,保证了代码的兼容性和有效性。 +4. 单个 ComponentPlan 的镜像替换和整个 Repository 的镜像替换,都是通过 [Helm:post-rendering](https://helm.sh/docs/topics/advanced/#post-rendering) + 技术实现的。 + +### 镜像覆盖策略 + +![image-changed](../images/image-changed.png) + +### ComponentPlan 和 Helm release 的关系 + +![componentplan](../images/componentplan-helm-release.png) diff --git a/core/concepts/repository.md b/core/concepts/repository.md new file mode 100644 index 000000000..2c69533b2 --- /dev/null +++ b/core/concepts/repository.md @@ -0,0 +1,135 @@ +--- +sidebar_position: 1 +--- +# 仓库 + +仓库是将 `chart repository` 映射为集群资源的一个概念。仓库定义了 `chart repository` 的 URL,认证信息等相关信息。仓库是组件部署,升级的基础。 + + + +## 使用 + +下面是一个仓库示例: + +```yaml +apiVersion: core.kubebb.k8s.com.cn/v1alpha1 +kind: Repository +metadata: + name: repository-bitnami-special-version + namespace: kubebb-system +spec: + url: https://charts.bitnami.com/bitnami + pullStategy: + intervalSeconds: 120 + retry: 5 + filter: + - name: wordpress + operation: keep + versionedFilterCond: + versions: + - 16.1.14 + - 16.1.13 + imageOverride: + - registry: docker.io + newRegistry: 192.168.1.1 + pathOverride: + path: library + newPath: system-container +``` + +上述仓库定义了数据来源是 `https://charts.bitnami.com/bitnami` ,数据获取策略是,每隔 120s 获取一次,如果发生错误最多尝试 5 次。 +对 `wordpress` 的版本定义了多虑条件,精确匹配 `16.1.14`, `16.1.13` 两个版本。 +对仓库中所有来自 `docker.io` 的镜像,替换为 `192.168.1.1` ,并将镜像路径为 `library` 的镜像替换为 `system-container` ,比如仓库中有镜像 `docker.io/library/nginx:v1.2.3` 会替换为 `192.168.1.1/system-container/nginx:v1.2.3` 。 + +## CRD 定义说明 + +CRD 的代码定义位于 [RepositoryTypes](https://github.com/kubebb/core/blob/main/api/v1alpha1/repository_types.go)。接下来会详细介绍每个字段的含义及其作用。 + +:::tip +说明 对于下面的 yaml,我们想要访问 bar 字段,书写格式为 `spec.foo.bar` + +```yaml +spec: + foo: + bar: xx +``` + +::: + +- `spec.url` + + 该字段用来保存 `chart repository` 的地址 +- `spec.authSecret` + + 对于需要认证,或者有自定义证书的 `chart repository`,需要将认证信息,证书信息存放到以该字段为名字的 `secret` 中。secret 中的主要字段信息如下 + + - `username` 定义认证需要的用户名 + - `password` 定义认证需要的密码 + - `cadata` 定义签发证书的 RootCA + - `certdata` 定义客户端通过 RootCA 签发的证书 + - `keydata` 定义客户端私钥 + + 如果服务端要求 TLS 双向认证,那么需要提供 `certdata` 和 `keydata`。 +- `spec.insecure` + + 是否跳过 https 验证 +- `spec.repositoryType` + + 仓库类型,是字符串,理解为标记即可。 +- `spec.PullStrategy.intervalSeconds` + + 定义获取数据的周期,可以不填写,默认是 120 秒。 +- `spec.PullStrategy.timeoutSeconds` + + 定义一次 http 请求的超时时间。 +- `spec.PullStrategy.retry` + + 定义请求失败的重试次数。默认不填写,只会做一次请求 +- `spec.filter` + + 该字段是数组,定义了一系列的对 `chart package` 和 版本的过滤条件。因为是数组,所以可以出现对同一个 `chart package` 的多个过滤条件,只会使用最后一条。 + + 数组的每一项的介绍 + + - `spec.filter[index].name` 定义了要参与过滤的 `chart package` 的名称。 + - `spec.filter[index].operation` 有两个可选值 `keep`, `ignore`。`ignore` 定义 `chart package` 要忽略的版本, `keep` 定义 `chart package` 要保留的版本。 + - `spec.filter[index].keepDeprecated` `false` 表示不保留 `chart package` 已经废弃的版本,`true` 表示保留。 + - `spec.filter[index].versionedFilterCond.versions` 是一个版本的数组,只要 `chart package` 的版本与该数组中任意一个精确匹配上,即符合规则。 + - `spec.fitler[index].versionedFilterCond.versionRegexp` 版本过滤的正则表达式。 + - `spec.filter[index].versionedFilterCond.versionConstraint` 版本验证条件,表达式格式请参考 [semver](https://github.com/Masterminds/semver#semver) + + 当 `operation=keep` 的时候, `versions, versionRegexp, VersionConstraint` 满足任一条件就会保留版本。 + 当 `operation=ignore` 的时候, `versions, versionRegexp, VersionConstraint` 满足任一条件就会忽略版本。 + + `keepDeprecated` 在对最终留下来的版本进行过滤,是否保留废弃版本。 + +- `spec.imageOverride` 非必需 + 该字段是数组,定义了一系列仓库级别的镜像覆盖策略。 + + 每一项内容包括: + + - `spec.imageOverride[].registry` 该镜像仓库域名地址,可以包含端口,例如:`docker.io`,`192.168.1.1:5000` + - `spec.imageOverride[].newRegistry` 要将 `registry` 替换后的镜像仓库域名地址,可以包含端口。 + - `spec.imageOverride[].pathOverride` 非必需 + - `spec.imageOverride[].pathOverride.path` 旧的镜像仓库路径,比如镜像地址 `docker.io/library/nginx:latest` 中的 path 为 `library` + - `spec.imageOverride[].pathOverride.newPath` 要将 `path` 替换后的镜像仓库新路径。 + +## 工作原理 + +仓库以 Kubernetes Operator 方式实现。周期性的获取 `chart repository` 的数据,对集群中组件更新或者创建,**一般不会删除组件,而是将在 `chart repository` 中不存在的组件标记为废弃**。 + +1. 当 `Repository` 创建,更新时 + +创建或者更新 `Repository` 时,会检查该资源是否添加 finalizers, 以及 URL 变更历史是否正确更新。 + +当所有的更新都处理完成后,将会启动 `chartmuseum watcher`,在每次获取到若干的 `chart package` 后,与集群中已经存在的 `Component` 对比,将会执行 `新增 component`, `更新 component`。 + +我们不会删除已经创建的 `Component`, 而是在发现集群中存在 `Component` 且并不存在于当前的 `chart repository` 中,那么会将其标记为废弃。 + +2. 当 `Repoistory` 删除时 + +由 `Repository` 创建出来的 `Component` 都会添加 `OwnerReferences`,删除 `Repository` 的时候会自动删除关联的 `Component`。 + +3. 镜像覆盖策略 + +![image-changed](../images/image-changed.png) diff --git a/core/concepts/subscription.md b/core/concepts/subscription.md new file mode 100644 index 000000000..eef214ce2 --- /dev/null +++ b/core/concepts/subscription.md @@ -0,0 +1,92 @@ +--- +sidebar_position: 3 +--- +# 订阅 + +创建一个订阅,表示用户将追踪一个组件(Component)在 仓库(Repository)中的更新,当组件更新时,该组件会根据订阅中的配置自动或待批准后安装到集群中。 + +## 使用 + +下面是一个订阅的示例: + +```yaml +apiVersion: core.kubebb.k8s.com.cn/v1alpha1 +kind: Subscription +metadata: + name: wordpress-sample + namespace: kubebb-system +spec: + component: + name: repository-bitnami-sample.wordpress + namespace: kubebb-system + repository: + name: repository-bitnami-sample + namespace: kubebb-system + componentPlanInstallMethod: auto + name: my-wordpress +#status: +# conditions: +# - lastTransitionTime: "2023-06-07T13:32:26Z" +# reason: ReconcileSuccess +# status: "True" +# type: SourceSynced +# - lastTransitionTime: "2023-06-07T13:34:35Z" +# reason: Available +# status: "True" +# type: Ready +# - lastTransitionTime: "2023-06-07T13:34:34Z" +# reason: ReconcileSuccess +# status: "True" +# type: PlanSynced +# installed: +# - componentPlan: +# name: sub-wordpress-sample-16.1.13 +# namespace: kubebb-system +# installedTime: "2023-06-07T13:34:34Z" +# installedVersion: +# appVersion: 6.2.2 +# createdAt: "2023-06-06T19:08:58Z" +# deprecated: false +# digest: 47096ed3f0a385e5830e90c75f443b7be107d7fa6df6aa869e7deb60b6cb6f8f +# updatedAt: "2023-06-07T13:34:31Z" +# version: 16.1.13 +# repositoryHealth: +# healthy: true +# lastUpdated: "2023-06-07T13:34:35Z" +# repository: +# name: repository-bitnami-sample +# namespace: kubebb-system +``` + +上述订阅定义了监控的组件是 `kubebb-system` 命名空间的 `repository-bitnami-sample.wordpress`。 +当组件有新版本发布时,安装方式为 `auto` ,即自动安装。 +该组件会被安装为 `my-wordpress` 。 +查看该订阅的 `status` 可以看到该订阅会显示由该订阅创建的组件安装计划(ComponentPlan),以及该订阅对应的组件的仓库的健康状态。 + +## CRD 定义说明 + +CRD 的代码定义位于 [subscription_types.go](https://github.com/kubebb/core/blob/main/api/v1alpha1/subscription_types.go)。接下来会详细介绍每个字段的含义及其作用。 + +:::tip +说明 对于下面的 yaml,我们想要访问 bar 字段,书写格式为 `spec.foo.bar` + +```yaml +spec: + foo: + bar: xx +``` + +::: + +- `spec.componet` + 该字段用来指明要监控的组件实例,一般使用 `namespace` 和 `name` 来唯一确定 +- `spec.repository` *可选字段* + 该字段用来指明要监控的组件所在的仓库实例,一般使用 `namespace` 和 `name` 来唯一确定,一般由控制器自动填充,不需要用户填写。 +- `spec.componentPlanInstallMethod` *可选字段* + 组件安装计划的安装方式,默认为 `auto`,可选项为 `auto` 或 `manual` +- `spec.其他` + 订阅中完整的包含了组件安装计划中的自定义配置字段。详细内容见组件安装计划的文档。 + +## 工作原理 + +订阅以 Kubernetes Operator 方式实现。当订阅控制器监视发现集群中订阅对应的组件创建或更新时,判断订阅未处理该更新事件时,用订阅中的组件安装计划配置创建一个名为 `sub-<订阅名>-<安装版本>` 的 `ComponentPlan`,触发后续的组件安装步骤。 diff --git a/core/images/componentplan-helm-release.excalidraw b/core/images/componentplan-helm-release.excalidraw new file mode 100644 index 000000000..405176312 --- /dev/null +++ b/core/images/componentplan-helm-release.excalidraw @@ -0,0 +1,5533 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "line", + "version": 1054, + "versionNonce": 1343992616, + "isDeleted": false, + "id": "hDT10lNGxOmueCJdvTs_x", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 480.6150211915374, + "y": 2411.411057874562, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 179.008480899036, + "height": 119.99999999999713, + "seed": 1922500440, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142046223, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 59.999999999998565 + ], + [ + 107.40508853942157, + 59.99999999999855 + ], + [ + 107.40508853942163, + 89.99999999999783 + ], + [ + 179.008480899036, + 29.99999999999929 + ], + [ + 107.40508853942157, + -29.999999999999297 + ], + [ + 107.40508853942157, + -2.842170943040401e-14 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 171, + "versionNonce": 125955928, + "isDeleted": false, + "id": "Ps1aU1DYgZ3vYu1OCQ7Kq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 939.9800455759673, + "y": 2289.601127604623, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 340, + "height": 100, + "seed": 1683417176, + "groupIds": [ + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "wzAB8L4llzveWAJQOxoO1" + } + ], + "updated": 1689142031484, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 161, + "versionNonce": 492393000, + "isDeleted": false, + "id": "wzAB8L4llzveWAJQOxoO1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 972.8706705759673, + "y": 2296.401127604623, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 274.21875, + "height": 86.39999999999999, + "seed": 1191714136, + "groupIds": [ + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": "Helm release \nrevision 2", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Ps1aU1DYgZ3vYu1OCQ7Kq", + "originalText": "Helm release revision 2", + "lineHeight": 1.2, + "baseline": 78 + }, + { + "type": "line", + "version": 2446, + "versionNonce": 2100970584, + "isDeleted": false, + "id": "rYfe6Uucoq7JtysCDNkp7", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 997.1176629143861, + "y": 2491.4273150513363, + "strokeColor": "#aaa", + "backgroundColor": "transparent", + "width": 116.41346201192735, + "height": 117.21202429245167, + "seed": 130724440, + "groupIds": [ + "kyB4JwDySPU6sG4kI-S4q", + "4AeMr5SAs1QAxUNuYGc4X", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -45.41825822666448, + 21.93317786250327 + ], + [ + -56.008758020263684, + 73.89921309644683 + ], + [ + -23.226449164345212, + 114.8019249876782 + ], + [ + 27.771448817200238, + 115.98170475270521 + ], + [ + 60.404703991663666, + 74.07373494971006 + ], + [ + 51.975750469818365, + 26.413023041480926 + ], + [ + 0.9647884008229255, + -1.2303195397464606 + ] + ] + }, + { + "type": "line", + "version": 1292, + "versionNonce": 1035783464, + "isDeleted": false, + "id": "cLfBKC6CztYLYTrH0gD6l", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 998.3797674663151, + "y": 2490.434071601059, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 115.41867093283915, + "height": 115.59042490744159, + "seed": 494053208, + "groupIds": [ + "kyB4JwDySPU6sG4kI-S4q", + "4AeMr5SAs1QAxUNuYGc4X", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -46.03006519345368, + 22.156262723714654 + ], + [ + -57.194073542612244, + 73.85420907904887 + ], + [ + -25.59134221576342, + 114.90340900903183 + ], + [ + 25.591342215763476, + 115.59042490744159 + ], + [ + 58.224597390226904, + 73.68245510444643 + ], + [ + 46.8888350664659, + 21.984508749112223 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1427, + "versionNonce": 589298008, + "isDeleted": false, + "id": "a5KQqwqiQ_3G2dTRPG5oa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 997.196588759638, + "y": 2565.736832734282, + "strokeColor": "#228be6", + "backgroundColor": "#fff", + "width": 70.66703236148203, + "height": 62.735747637392535, + "seed": 72612952, + "groupIds": [ + "4AeMr5SAs1QAxUNuYGc4X", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 13.004448826885437 + ], + [ + -8.93162694154222, + 12.43282470262676 + ], + [ + -20.435562442248596, + 6.930942506636768 + ], + [ + -28.72411224399977, + -4.144274900875587 + ], + [ + -31.86804492742263, + -19.649579271392895 + ], + [ + -29.295736368258474, + -32.65402809827839 + ], + [ + -21.936075768427685, + -41.15693694662656 + ], + [ + -13.218807873482476, + -48.23078548432795 + ], + [ + -3.5011977610845406, + -49.7312988105071 + ], + [ + 8.217096786218832, + -47.51625532900459 + ], + [ + 17.50598880542273, + -43.30052741259669 + ], + [ + 24.79419638972118, + -35.72650776616888 + ], + [ + 28.36684716633806, + -29.724454461452524 + ], + [ + 28.081035104208723, + -21.43590465970135 + ], + [ + 38.7989874340594, + -20.72137450437799 + ], + [ + 17.07727071222871, + 3.3582917300198574 + ], + [ + 6.859489491104426, + -20.22120339565157 + ], + [ + 16.00547547924367, + -19.86393831798989 + ], + [ + 13.647525966676511, + -29.724454461452524 + ], + [ + 2.786667605761153, + -37.155568076815655 + ], + [ + -8.431455832815857, + -35.86941379723356 + ], + [ + -16.434193572437678, + -28.724112243999798 + ], + [ + -18.43487800734313, + -17.720347852019756 + ], + [ + -16.791458650099372, + -10.146328205591942 + ], + [ + -11.289576454109351, + -3.4297447455522274 + ], + [ + -1.3576072951144198, + -1.0003422174527827 + ] + ] + }, + { + "type": "text", + "version": 524, + "versionNonce": 435742760, + "isDeleted": false, + "id": "J6XcTwD_DoOd4xEUBba5b", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 969.5314345352822, + "y": 2572.9025022964142, + "strokeColor": "#fff", + "backgroundColor": "transparent", + "width": 57.899932861328125, + "height": 25, + "seed": 239251800, + "groupIds": [ + "4AeMr5SAs1QAxUNuYGc4X", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "deploy", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "deploy", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "line", + "version": 2673, + "versionNonce": 1283919448, + "isDeleted": false, + "id": "GDVMHwswFG5xR3HdNSxT_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1237.809173114886, + "y": 2491.9570258607664, + "strokeColor": "#aaa", + "backgroundColor": "transparent", + "width": 116.41346201192735, + "height": 117.21202429245167, + "seed": 848479832, + "groupIds": [ + "ACGQfqVJQ_TKe0kVaUEIM", + "XIV5d9FZG96EwdCiCTBMQ", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -45.41825822666448, + 21.93317786250327 + ], + [ + -56.008758020263684, + 73.89921309644683 + ], + [ + -23.226449164345212, + 114.8019249876782 + ], + [ + 27.771448817200238, + 115.98170475270521 + ], + [ + 60.404703991663666, + 74.07373494971006 + ], + [ + 51.975750469818365, + 26.413023041480926 + ], + [ + 0.9647884008229255, + -1.2303195397464606 + ] + ] + }, + { + "type": "line", + "version": 1519, + "versionNonce": 1845076776, + "isDeleted": false, + "id": "hqa-wPdw0tGbKGX2muTEv", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1239.0712776668156, + "y": 2490.9637824104893, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 115.41867093283915, + "height": 115.59042490744159, + "seed": 1578646360, + "groupIds": [ + "ACGQfqVJQ_TKe0kVaUEIM", + "XIV5d9FZG96EwdCiCTBMQ", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -46.03006519345368, + 22.156262723714654 + ], + [ + -57.194073542612244, + 73.85420907904887 + ], + [ + -25.59134221576342, + 114.90340900903183 + ], + [ + 25.591342215763476, + 115.59042490744159 + ], + [ + 58.224597390226904, + 73.68245510444643 + ], + [ + 46.8888350664659, + 21.984508749112223 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 530, + "versionNonce": 1111720792, + "isDeleted": false, + "id": "DFt1YIX198AhuaUkOsHAd", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1222.7354681218076, + "y": 2519.5835958156044, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 31.919838740452235, + "height": 14.716934995597882, + "seed": 1126633560, + "groupIds": [ + "XIV5d9FZG96EwdCiCTBMQ", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 668, + "versionNonce": 405470760, + "isDeleted": false, + "id": "ddORj-ISWRXzgv9xTJrS_", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1202.996876252712, + "y": 2563.0383295526062, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 20.285504993932324, + "height": 13.026476246103528, + "seed": 697517400, + "groupIds": [ + "XIV5d9FZG96EwdCiCTBMQ", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 748, + "versionNonce": 313088088, + "isDeleted": false, + "id": "thqRdrq-OEsGrdo4hlqoe", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.701793120023, + "y": 2562.4914164277698, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 20.285504993932324, + "height": 13.026476246103528, + "seed": 1051777624, + "groupIds": [ + "XIV5d9FZG96EwdCiCTBMQ", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 710, + "versionNonce": 1232664872, + "isDeleted": false, + "id": "vysakNtyp5hSPX2KCvCyD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1255.749133111932, + "y": 2562.988610177621, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 20.285504993932324, + "height": 13.026476246103528, + "seed": 1699991384, + "groupIds": [ + "XIV5d9FZG96EwdCiCTBMQ", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 447, + "versionNonce": 1636601176, + "isDeleted": false, + "id": "ryRRdD_X8usghwQVub3O4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1239.6400556167514, + "y": 2534.0022145612916, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 0.4971937498513057, + "height": 27.743411241701438, + "seed": 97526872, + "groupIds": [ + "XIV5d9FZG96EwdCiCTBMQ", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.4971937498513057, + 27.743411241701438 + ] + ] + }, + { + "type": "line", + "version": 478, + "versionNonce": 894407720, + "isDeleted": false, + "id": "7WMlCoTRHvxd9wTzFHgzx", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1211.3000118752284, + "y": 2562.0439420529037, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 55.38738373343267, + "height": 15.015251245508665, + "seed": 1576655192, + "groupIds": [ + "XIV5d9FZG96EwdCiCTBMQ", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.4915812495538034, + -12.927037496133295 + ], + [ + 54.19411873378954, + -14.418618745687127 + ], + [ + 55.38738373343267, + 0.5966324998215384 + ] + ] + }, + { + "type": "text", + "version": 397, + "versionNonce": 943792728, + "isDeleted": false, + "id": "CG25TED9cawjJ6skO27m7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1221.4057233260842, + "y": 2576.0289512266354, + "strokeColor": "#fff", + "backgroundColor": "transparent", + "width": 31.359970092773438, + "height": 25, + "seed": 1361374808, + "groupIds": [ + "XIV5d9FZG96EwdCiCTBMQ", + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "svc", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "svc", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "line", + "version": 155, + "versionNonce": 1100664616, + "isDeleted": false, + "id": "339V--CQLuGZWLWZfX5aV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1099.9800455759673, + "y": 2389.601127604623, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 0, + "height": 60, + "seed": 941974360, + "groupIds": [ + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 60 + ] + ] + }, + { + "type": "line", + "version": 154, + "versionNonce": 1436227416, + "isDeleted": false, + "id": "SH0I-QMjcd7Abrc4jdZmU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 999.9800455759673, + "y": 2449.601127604623, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 240, + "height": 0, + "seed": 827275352, + "groupIds": [ + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 240, + 0 + ] + ] + }, + { + "type": "line", + "version": 144, + "versionNonce": 918989352, + "isDeleted": false, + "id": "G6jaTYUnQfOwDu-kPQpdM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 999.9800455759673, + "y": 2449.601127604623, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 0, + "height": 40, + "seed": 1886809432, + "groupIds": [ + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 40 + ] + ] + }, + { + "type": "line", + "version": 144, + "versionNonce": 2112777304, + "isDeleted": false, + "id": "Un_av9Hb5596vq0v3LWGV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1239.9800455759673, + "y": 2449.601127604623, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 0, + "height": 40, + "seed": 250544728, + "groupIds": [ + "bK0_tPfL_lVuaQK3-ItbV" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 40 + ] + ] + }, + { + "id": "iIixGRrFmOkySyLh8p9tX", + "type": "rectangle", + "x": -159.86495542526285, + "y": 2289.988345081587, + "width": 340, + "height": 100, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 239662168, + "version": 236, + "versionNonce": 1274926680, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "akoNM_gCDzeCKzQ7Go8w_" + } + ], + "updated": 1689142724529, + "link": null, + "locked": false + }, + { + "id": "akoNM_gCDzeCKzQ7Go8w_", + "type": "text", + "x": -126.97433042526285, + "y": 2296.788345081587, + "width": 274.21875, + "height": 86.39999999999999, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "seed": 1021038376, + "version": 221, + "versionNonce": 166740008, + "isDeleted": false, + "boundElements": null, + "updated": 1689142031484, + "link": null, + "locked": false, + "text": "Helm release \nrevision 1", + "fontSize": 36, + "fontFamily": 3, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 78, + "containerId": "iIixGRrFmOkySyLh8p9tX", + "originalText": "Helm release revision 1", + "lineHeight": 1.2, + "isFrameName": false + }, + { + "type": "line", + "version": 2508, + "versionNonce": 2085697112, + "isDeleted": false, + "id": "zhu3s4Q-hT10cDx8nM2JS", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -102.72733808684384, + "y": 2491.8145325283003, + "strokeColor": "#aaa", + "backgroundColor": "transparent", + "width": 116.41346201192735, + "height": 117.21202429245167, + "seed": 2079961384, + "groupIds": [ + "Qf9iVTNTmyCzjrKXRunSb", + "QstFjO7eEuApzDZpFwrtn", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -45.41825822666448, + 21.93317786250327 + ], + [ + -56.008758020263684, + 73.89921309644683 + ], + [ + -23.226449164345212, + 114.8019249876782 + ], + [ + 27.771448817200238, + 115.98170475270521 + ], + [ + 60.404703991663666, + 74.07373494971006 + ], + [ + 51.975750469818365, + 26.413023041480926 + ], + [ + 0.9647884008229255, + -1.2303195397464606 + ] + ] + }, + { + "type": "line", + "version": 1354, + "versionNonce": 356907816, + "isDeleted": false, + "id": "wDAteBoSaHn5AbyQicy04", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -101.4652335349148, + "y": 2490.821289078023, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 115.41867093283915, + "height": 115.59042490744159, + "seed": 1190743080, + "groupIds": [ + "Qf9iVTNTmyCzjrKXRunSb", + "QstFjO7eEuApzDZpFwrtn", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -46.03006519345368, + 22.156262723714654 + ], + [ + -57.194073542612244, + 73.85420907904887 + ], + [ + -25.59134221576342, + 114.90340900903183 + ], + [ + 25.591342215763476, + 115.59042490744159 + ], + [ + 58.224597390226904, + 73.68245510444643 + ], + [ + 46.8888350664659, + 21.984508749112223 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1489, + "versionNonce": 1183361880, + "isDeleted": false, + "id": "mhZov5RG3Ye_bEroJN_yV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -102.64841224159196, + "y": 2566.124050211246, + "strokeColor": "#228be6", + "backgroundColor": "#fff", + "width": 70.66703236148203, + "height": 62.735747637392535, + "seed": 1699579688, + "groupIds": [ + "QstFjO7eEuApzDZpFwrtn", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 13.004448826885437 + ], + [ + -8.93162694154222, + 12.43282470262676 + ], + [ + -20.435562442248596, + 6.930942506636768 + ], + [ + -28.72411224399977, + -4.144274900875587 + ], + [ + -31.86804492742263, + -19.649579271392895 + ], + [ + -29.295736368258474, + -32.65402809827839 + ], + [ + -21.936075768427685, + -41.15693694662656 + ], + [ + -13.218807873482476, + -48.23078548432795 + ], + [ + -3.5011977610845406, + -49.7312988105071 + ], + [ + 8.217096786218832, + -47.51625532900459 + ], + [ + 17.50598880542273, + -43.30052741259669 + ], + [ + 24.79419638972118, + -35.72650776616888 + ], + [ + 28.36684716633806, + -29.724454461452524 + ], + [ + 28.081035104208723, + -21.43590465970135 + ], + [ + 38.7989874340594, + -20.72137450437799 + ], + [ + 17.07727071222871, + 3.3582917300198574 + ], + [ + 6.859489491104426, + -20.22120339565157 + ], + [ + 16.00547547924367, + -19.86393831798989 + ], + [ + 13.647525966676511, + -29.724454461452524 + ], + [ + 2.786667605761153, + -37.155568076815655 + ], + [ + -8.431455832815857, + -35.86941379723356 + ], + [ + -16.434193572437678, + -28.724112243999798 + ], + [ + -18.43487800734313, + -17.720347852019756 + ], + [ + -16.791458650099372, + -10.146328205591942 + ], + [ + -11.289576454109351, + -3.4297447455522274 + ], + [ + -1.3576072951144198, + -1.0003422174527827 + ] + ] + }, + { + "type": "text", + "version": 587, + "versionNonce": 1143756328, + "isDeleted": false, + "id": "mrQhH9wgJstFuUQv30mql", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -130.31356646594799, + "y": 2573.2897197733782, + "strokeColor": "#fff", + "backgroundColor": "transparent", + "width": 57.899932861328125, + "height": 25, + "seed": 1130521128, + "groupIds": [ + "QstFjO7eEuApzDZpFwrtn", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "deploy", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "deploy", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "line", + "version": 2735, + "versionNonce": 604602456, + "isDeleted": false, + "id": "gu04Oi3I_17f2y6OvQxX2", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 137.96417211365633, + "y": 2492.3442433377304, + "strokeColor": "#aaa", + "backgroundColor": "transparent", + "width": 116.41346201192735, + "height": 117.21202429245167, + "seed": 882349864, + "groupIds": [ + "IzC72tvjxm-Mp7vmmTWhO", + "P8k87Ss4evGmN9nIA2Y-O", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -45.41825822666448, + 21.93317786250327 + ], + [ + -56.008758020263684, + 73.89921309644683 + ], + [ + -23.226449164345212, + 114.8019249876782 + ], + [ + 27.771448817200238, + 115.98170475270521 + ], + [ + 60.404703991663666, + 74.07373494971006 + ], + [ + 51.975750469818365, + 26.413023041480926 + ], + [ + 0.9647884008229255, + -1.2303195397464606 + ] + ] + }, + { + "type": "line", + "version": 1581, + "versionNonce": 462377256, + "isDeleted": false, + "id": "us_4ljCjN-A07I3DoYVyL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 139.22627666558583, + "y": 2491.3509998874533, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 115.41867093283915, + "height": 115.59042490744159, + "seed": 1055552040, + "groupIds": [ + "IzC72tvjxm-Mp7vmmTWhO", + "P8k87Ss4evGmN9nIA2Y-O", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -46.03006519345368, + 22.156262723714654 + ], + [ + -57.194073542612244, + 73.85420907904887 + ], + [ + -25.59134221576342, + 114.90340900903183 + ], + [ + 25.591342215763476, + 115.59042490744159 + ], + [ + 58.224597390226904, + 73.68245510444643 + ], + [ + 46.8888350664659, + 21.984508749112223 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 592, + "versionNonce": 614970712, + "isDeleted": false, + "id": "MwXcm_GWbmq5fqLA1SCDo", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 122.8904671205778, + "y": 2519.9708132925684, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 31.919838740452235, + "height": 14.716934995597882, + "seed": 1344924968, + "groupIds": [ + "P8k87Ss4evGmN9nIA2Y-O", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 730, + "versionNonce": 584772648, + "isDeleted": false, + "id": "Qe62UEiImkxSJqh_HKKJv", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 103.15187525148212, + "y": 2563.42554702957, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 20.285504993932324, + "height": 13.026476246103528, + "seed": 566364200, + "groupIds": [ + "P8k87Ss4evGmN9nIA2Y-O", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 810, + "versionNonce": 1035422296, + "isDeleted": false, + "id": "QmkuMw56M5dwjSrMi7y3-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 128.85679211879324, + "y": 2562.8786339047338, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 20.285504993932324, + "height": 13.026476246103528, + "seed": 1604240168, + "groupIds": [ + "P8k87Ss4evGmN9nIA2Y-O", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 772, + "versionNonce": 335226664, + "isDeleted": false, + "id": "9mPTe5Id03tRmlTVDs_MD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 155.90413211070245, + "y": 2563.375827654585, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 20.285504993932324, + "height": 13.026476246103528, + "seed": 1479286312, + "groupIds": [ + "P8k87Ss4evGmN9nIA2Y-O", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 509, + "versionNonce": 437010264, + "isDeleted": false, + "id": "MMk_sFIHtGHQkGYo9kIAj", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 139.79505461552162, + "y": 2534.3894320382556, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 0.4971937498513057, + "height": 27.743411241701438, + "seed": 743840040, + "groupIds": [ + "P8k87Ss4evGmN9nIA2Y-O", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.4971937498513057, + 27.743411241701438 + ] + ] + }, + { + "type": "line", + "version": 540, + "versionNonce": 190579240, + "isDeleted": false, + "id": "iPm2SF5Fvqtp5FvcUPxUl", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 111.45501087399862, + "y": 2562.4311595298677, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 55.38738373343267, + "height": 15.015251245508665, + "seed": 2139665448, + "groupIds": [ + "P8k87Ss4evGmN9nIA2Y-O", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.4915812495538034, + -12.927037496133295 + ], + [ + 54.19411873378954, + -14.418618745687127 + ], + [ + 55.38738373343267, + 0.5966324998215384 + ] + ] + }, + { + "type": "text", + "version": 459, + "versionNonce": 1778029656, + "isDeleted": false, + "id": "d_uT5dCl-LKphKg2tG14l", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 121.5607223248544, + "y": 2576.4161687035994, + "strokeColor": "#fff", + "backgroundColor": "transparent", + "width": 31.359970092773438, + "height": 25, + "seed": 665841448, + "groupIds": [ + "P8k87Ss4evGmN9nIA2Y-O", + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142031484, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "svc", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "svc", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "id": "28UYMbilyU34n9u0tJ5pM", + "type": "line", + "x": 0.13504457473754883, + "y": 2389.988345081587, + "width": 0, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1372213592, + "version": 217, + "versionNonce": 938048808, + "isDeleted": false, + "boundElements": null, + "updated": 1689142031484, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 60 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "Id2FUTPQSleBRxDrcqyWl", + "type": "line", + "x": -99.8649554252626, + "y": 2449.988345081587, + "width": 240, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 21137960, + "version": 216, + "versionNonce": 861292888, + "isDeleted": false, + "boundElements": null, + "updated": 1689142031484, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 240, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "PJMECs9RwWKoUUDEJ9D4j", + "type": "line", + "x": -99.8649554252626, + "y": 2449.988345081587, + "width": 0, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1383839016, + "version": 206, + "versionNonce": 185571368, + "isDeleted": false, + "boundElements": null, + "updated": 1689142031484, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 40 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "RoEA3UUkuOQ-XBhgvWunq", + "type": "line", + "x": 140.13504457473755, + "y": 2449.988345081587, + "width": 0, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "xyMvoYlTvdJjpuP1oyG8a" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 557914968, + "version": 206, + "versionNonce": 561208920, + "isDeleted": false, + "boundElements": null, + "updated": 1689142031484, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 40 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "p0WahXWQ7xJocgp8GN3OH", + "type": "arrow", + "x": 2340, + "y": 2380, + "width": 80, + "height": 360, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#e9ecef", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 986689880, + "version": 391, + "versionNonce": 14669864, + "isDeleted": false, + "boundElements": null, + "updated": 1689142150641, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -80, + -360 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "type": "line", + "version": 2696, + "versionNonce": 473088296, + "isDeleted": false, + "id": "6t_ellIOuyLcpSZHXpeKm", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 957.5927561490355, + "y": 1522.7780857775147, + "strokeColor": "#aaa", + "backgroundColor": "transparent", + "width": 116.41346201192735, + "height": 117.21202429245167, + "seed": 2007970600, + "groupIds": [ + "oUv1WpIpy_x6IP7wGnn3-", + "9yEzOGqo2asjQvX-ZeAZ7", + "olaDFY7owimyh-VyFWaHx" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142749834, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -45.41825822666448, + 21.93317786250327 + ], + [ + -56.008758020263684, + 73.89921309644683 + ], + [ + -23.226449164345212, + 114.8019249876782 + ], + [ + 27.771448817200238, + 115.98170475270521 + ], + [ + 60.404703991663666, + 74.07373494971006 + ], + [ + 51.975750469818365, + 26.413023041480926 + ], + [ + 0.9647884008229255, + -1.2303195397464606 + ] + ] + }, + { + "type": "line", + "version": 1542, + "versionNonce": 104023384, + "isDeleted": false, + "id": "MgpZ8KWUXTdWXEi7x5-KD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 958.8548607009648, + "y": 1521.7848423272371, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 115.41867093283915, + "height": 115.59042490744159, + "seed": 1957596712, + "groupIds": [ + "oUv1WpIpy_x6IP7wGnn3-", + "9yEzOGqo2asjQvX-ZeAZ7", + "olaDFY7owimyh-VyFWaHx" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142749834, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -46.03006519345368, + 22.156262723714654 + ], + [ + -57.194073542612244, + 73.85420907904887 + ], + [ + -25.59134221576342, + 114.90340900903183 + ], + [ + 25.591342215763476, + 115.59042490744159 + ], + [ + 58.224597390226904, + 73.68245510444643 + ], + [ + 46.8888350664659, + 21.984508749112223 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 604, + "versionNonce": 496000040, + "isDeleted": false, + "id": "zNdHfkwSfZhhHGcgGGikw", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 931.1668831218558, + "y": 1549.5912755859895, + "strokeColor": "#228be6", + "backgroundColor": "#fff", + "width": 53.92113510641704, + "height": 57.34858523803945, + "seed": 1862961448, + "groupIds": [ + "LOMu5NpDzSNZc8ERPF2Hk", + "9yEzOGqo2asjQvX-ZeAZ7", + "olaDFY7owimyh-VyFWaHx" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142749834, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 505, + "versionNonce": 122739288, + "isDeleted": false, + "id": "2UyZFCL_JvMn9XZRzoU_g", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 950.5074945788681, + "y": 1541.1330343477002, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 15.178707725756453, + "height": 16.782048700800715, + "seed": 1378821160, + "groupIds": [ + "LOMu5NpDzSNZc8ERPF2Hk", + "9yEzOGqo2asjQvX-ZeAZ7", + "olaDFY7owimyh-VyFWaHx" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142749834, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 665, + "versionNonce": 1988269864, + "isDeleted": false, + "id": "AkWDVEXqhPHuA5zN_82-4", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 976.3969839659442, + "y": 1572.818370674395, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 17.111639278897893, + "height": 11.139212927772919, + "seed": 1007181608, + "groupIds": [ + "LOMu5NpDzSNZc8ERPF2Hk", + "9yEzOGqo2asjQvX-ZeAZ7", + "olaDFY7owimyh-VyFWaHx" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142749834, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 708, + "versionNonce": 435408728, + "isDeleted": false, + "id": "6glK1RbF_OncYmI3Q16Jn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 921.2823617601232, + "y": 1572.1145193080795, + "strokeColor": "#228be6", + "backgroundColor": "#228be6", + "width": 20.460165757730927, + "height": 12.608120127039674, + "seed": 755120680, + "groupIds": [ + "LOMu5NpDzSNZc8ERPF2Hk", + "9yEzOGqo2asjQvX-ZeAZ7", + "olaDFY7owimyh-VyFWaHx" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142749834, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 818, + "versionNonce": 192246312, + "isDeleted": false, + "id": "PmoZSzvPqDyjMkk00OSVs", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 952.1906174113608, + "y": 1594.392945163625, + "strokeColor": "#228be6", + "backgroundColor": "#228be6", + "width": 14.199436259578652, + "height": 17.137250658112155, + "seed": 940094760, + "groupIds": [ + "LOMu5NpDzSNZc8ERPF2Hk", + "9yEzOGqo2asjQvX-ZeAZ7", + "olaDFY7owimyh-VyFWaHx" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142749834, + "link": null, + "locked": false + }, + { + "id": "rfAQW2D9f1BPtjXhv33cb", + "type": "text", + "x": 880, + "y": 1650.4, + "width": 316.40625, + "height": 43.199999999999996, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "olaDFY7owimyh-VyFWaHx" + ], + "frameId": null, + "roundness": null, + "seed": 1227095592, + "version": 62, + "versionNonce": 752321320, + "isDeleted": false, + "boundElements": null, + "updated": 1689143094493, + "link": null, + "locked": false, + "text": "ComponentPlan A", + "fontSize": 36, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 35, + "containerId": null, + "originalText": "ComponentPlan A", + "lineHeight": 1.2, + "isFrameName": false + }, + { + "id": "o6B31cOzHzFXLPjg9dnst", + "type": "text", + "x": 880, + "y": 1700, + "width": 764.162109375, + "height": 354.19999999999993, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "olaDFY7owimyh-VyFWaHx" + ], + "frameId": null, + "roundness": null, + "seed": 278310488, + "version": 226, + "versionNonce": 353127208, + "isDeleted": false, + "boundElements": [ + { + "id": "PIIipfLUYb2x2Fx3LhZCM", + "type": "arrow" + } + ], + "updated": 1689142899852, + "link": null, + "locked": false, + "text": "apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n labels:\n core.kubebb.k8s.com.cn/componentplan-release: my-nginx\nspec:\n name: my-nginx\n xxx: yyy\nstatus:\n installedRevision: 2\n latest: false", + "fontSize": 28, + "fontFamily": 2, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 347, + "containerId": null, + "originalText": "apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n labels:\n core.kubebb.k8s.com.cn/componentplan-release: my-nginx\nspec:\n name: my-nginx\n xxx: yyy\nstatus:\n installedRevision: 2\n latest: false", + "lineHeight": 1.15, + "isFrameName": false + }, + { + "id": "zRC5DxGzVcINY61vq3zUy", + "type": "text", + "x": 575, + "y": 2775, + "width": 1070.5078125, + "height": 75.6, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "psLZmELEA-SeljPwDxE6D" + ], + "frameId": null, + "roundness": null, + "seed": 1985285928, + "version": 169, + "versionNonce": 2018285144, + "isDeleted": false, + "boundElements": null, + "updated": 1689142617448, + "link": null, + "locked": false, + "text": "my-nginx helm release history", + "fontSize": 63, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 61, + "containerId": null, + "originalText": "my-nginx helm release history", + "lineHeight": 1.2, + "isFrameName": false + }, + { + "id": "TRnIx7vmRXYVkWtxV05kg", + "type": "ellipse", + "x": 540, + "y": 2740, + "width": 350, + "height": 140, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "psLZmELEA-SeljPwDxE6D" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1552032088, + "version": 80, + "versionNonce": 1899010856, + "isDeleted": false, + "boundElements": null, + "updated": 1689142617448, + "link": null, + "locked": false + }, + { + "id": "i-qaoIeKFihteymriZ237", + "type": "ellipse", + "x": 880, + "y": 1880, + "width": 260, + "height": 62, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1121506136, + "version": 31, + "versionNonce": 1593507112, + "isDeleted": false, + "boundElements": [], + "updated": 1689142807779, + "link": null, + "locked": false + }, + { + "id": "F5K4H2CP63t6RnSS1NiIw", + "type": "ellipse", + "x": 1440, + "y": 1800, + "width": 280, + "height": 80, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 874339880, + "version": 24, + "versionNonce": 756444504, + "isDeleted": false, + "boundElements": null, + "updated": 1689142758947, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 2723, + "versionNonce": 981635880, + "isDeleted": false, + "id": "7Q14k9mt5YdQoKF1ijI7N", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2058.9370343852265, + "y": 1542.9914888988344, + "strokeColor": "#aaa", + "backgroundColor": "transparent", + "width": 116.41346201192735, + "height": 117.21202429245167, + "seed": 1057328728, + "groupIds": [ + "XmMJP6CgsA58gdHKsp2Dc", + "OsTRapkbzB6DBVmlhK_jD", + "m2dI8Y1KS3wJKOdC8A6i5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142151042, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -45.41825822666448, + 21.93317786250327 + ], + [ + -56.008758020263684, + 73.89921309644683 + ], + [ + -23.226449164345212, + 114.8019249876782 + ], + [ + 27.771448817200238, + 115.98170475270521 + ], + [ + 60.404703991663666, + 74.07373494971006 + ], + [ + 51.975750469818365, + 26.413023041480926 + ], + [ + 0.9647884008229255, + -1.2303195397464606 + ] + ] + }, + { + "type": "line", + "version": 1569, + "versionNonce": 318870360, + "isDeleted": false, + "id": "7Hf9xacwp_Io0rA-ARgAB", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2060.199138937156, + "y": 1541.9982454485569, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 115.41867093283915, + "height": 115.59042490744159, + "seed": 1626473304, + "groupIds": [ + "XmMJP6CgsA58gdHKsp2Dc", + "OsTRapkbzB6DBVmlhK_jD", + "m2dI8Y1KS3wJKOdC8A6i5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142151042, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -46.03006519345368, + 22.156262723714654 + ], + [ + -57.194073542612244, + 73.85420907904887 + ], + [ + -25.59134221576342, + 114.90340900903183 + ], + [ + 25.591342215763476, + 115.59042490744159 + ], + [ + 58.224597390226904, + 73.68245510444643 + ], + [ + 46.8888350664659, + 21.984508749112223 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 631, + "versionNonce": 1175842344, + "isDeleted": false, + "id": "8c1476JFUZH2yp7dsDLn8", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2032.511161358047, + "y": 1569.8046787073092, + "strokeColor": "#228be6", + "backgroundColor": "#fff", + "width": 53.92113510641704, + "height": 57.34858523803945, + "seed": 1468520536, + "groupIds": [ + "AXd4Ppk5ozyDdabUEznZs", + "OsTRapkbzB6DBVmlhK_jD", + "m2dI8Y1KS3wJKOdC8A6i5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142151042, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 532, + "versionNonce": 1092970584, + "isDeleted": false, + "id": "KzMU9M_zZff8ulpjsuOo7", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2051.8517728150596, + "y": 1561.34643746902, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 15.178707725756453, + "height": 16.782048700800715, + "seed": 110824792, + "groupIds": [ + "AXd4Ppk5ozyDdabUEznZs", + "OsTRapkbzB6DBVmlhK_jD", + "m2dI8Y1KS3wJKOdC8A6i5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142151042, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 692, + "versionNonce": 1552279848, + "isDeleted": false, + "id": "ns46A0AqnhDD9_txbNN6L", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2077.741262202135, + "y": 1593.0317737957146, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 17.111639278897893, + "height": 11.139212927772919, + "seed": 931111512, + "groupIds": [ + "AXd4Ppk5ozyDdabUEznZs", + "OsTRapkbzB6DBVmlhK_jD", + "m2dI8Y1KS3wJKOdC8A6i5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142151042, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 735, + "versionNonce": 101096792, + "isDeleted": false, + "id": "h6aZJ1DMf3Kp0bWzj6zbb", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2022.6266399963147, + "y": 1592.327922429399, + "strokeColor": "#228be6", + "backgroundColor": "#228be6", + "width": 20.460165757730927, + "height": 12.608120127039674, + "seed": 1762236248, + "groupIds": [ + "AXd4Ppk5ozyDdabUEznZs", + "OsTRapkbzB6DBVmlhK_jD", + "m2dI8Y1KS3wJKOdC8A6i5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142151042, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 845, + "versionNonce": 960398376, + "isDeleted": false, + "id": "Ecqoc9GMHs4orPj0hdRkp", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2053.5348956475523, + "y": 1614.6063482849447, + "strokeColor": "#228be6", + "backgroundColor": "#228be6", + "width": 14.199436259578652, + "height": 17.137250658112155, + "seed": 529329240, + "groupIds": [ + "AXd4Ppk5ozyDdabUEznZs", + "OsTRapkbzB6DBVmlhK_jD", + "m2dI8Y1KS3wJKOdC8A6i5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142151042, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 89, + "versionNonce": 1786031448, + "isDeleted": false, + "id": "PB_VKCp1N01WxcOmR3_sH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1981.3442782361913, + "y": 1670.6134031213198, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 316.40625, + "height": 43.199999999999996, + "seed": 886939992, + "groupIds": [ + "m2dI8Y1KS3wJKOdC8A6i5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689143097696, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": "ComponentPlan B", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ComponentPlan B", + "lineHeight": 1.2, + "baseline": 35 + }, + { + "type": "text", + "version": 172, + "versionNonce": 1244380968, + "isDeleted": false, + "id": "JeI71zvo9IZiWMvXDyjI6", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1981.3442782361913, + "y": 1720, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 764.162109375, + "height": 321.99999999999994, + "seed": 676312664, + "groupIds": [ + "m2dI8Y1KS3wJKOdC8A6i5" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142151042, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 2, + "text": "apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n labels:\n core.kubebb.k8s.com.cn/componentplan-release: my-nginx\nspec:\n name: my-nginx\nstatus:\n installedRevision: 3\n latest: true", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n labels:\n core.kubebb.k8s.com.cn/componentplan-release: my-nginx\nspec:\n name: my-nginx\nstatus:\n installedRevision: 3\n latest: true", + "lineHeight": 1.15, + "baseline": 315 + }, + { + "id": "qYpISMgDtfeO27-BClSE3", + "type": "ellipse", + "x": 1961.3442782361913, + "y": 1900, + "width": 280, + "height": 60, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "m2dI8Y1KS3wJKOdC8A6i5" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1224771160, + "version": 16, + "versionNonce": 248588120, + "isDeleted": false, + "boundElements": null, + "updated": 1689142151042, + "link": null, + "locked": false + }, + { + "id": "o1BK_lQGuozUGme2Bh_lY", + "type": "ellipse", + "x": 2541.3442782361913, + "y": 1820, + "width": 260, + "height": 80, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "m2dI8Y1KS3wJKOdC8A6i5" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 226210344, + "version": 14, + "versionNonce": 1605999144, + "isDeleted": false, + "boundElements": null, + "updated": 1689142151042, + "link": null, + "locked": false + }, + { + "id": "pvtVJbiGgN4D3G_ExfAE9", + "type": "freedraw", + "x": 2221.0552978515625, + "y": 2069.9963989257812, + "width": 381.8851318359375, + "height": 95.39904738838231, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "groupIds": [ + "m2dI8Y1KS3wJKOdC8A6i5" + ], + "frameId": null, + "roundness": null, + "seed": 1748987224, + "version": 83, + "versionNonce": 2146137944, + "isDeleted": false, + "boundElements": null, + "updated": 1689142186268, + "link": null, + "locked": false, + "points": [ + [ + 0, + -17.46362971453412 + ], + [ + -0.2706298828125, + -17.46362971453412 + ], + [ + -0.639404296875, + -17.46362971453412 + ], + [ + -1.2822265625, + -17.46362971453412 + ], + [ + -4.0924072265625, + -17.46362971453412 + ], + [ + -10.5086669921875, + -17.46362971453412 + ], + [ + -22.249267578125, + -17.46362971453412 + ], + [ + -40.0242919921875, + -17.46362971453412 + ], + [ + -59.65869140625, + -17.46362971453412 + ], + [ + -80.172607421875, + -17.46362971453412 + ], + [ + -100.6971435546875, + -17.46362971453412 + ], + [ + -119.1729736328125, + -17.46362971453412 + ], + [ + -135.328857421875, + -17.639144631476007 + ], + [ + -148.6123046875, + -18.485236719873 + ], + [ + -160.6512451171875, + -19.661009574341886 + ], + [ + -172.0623779296875, + -20.98538964968562 + ], + [ + -182.873291015625, + -22.177641623318053 + ], + [ + -193.328857421875, + -24.075741002555624 + ], + [ + -202.8516845703125, + -27.31371574829071 + ], + [ + -210.9906005859375, + -30.82295647201796 + ], + [ + -217.1953125, + -34.98688554484262 + ], + [ + -220.3397216796875, + -40.25914606206686 + ], + [ + -221.0552978515625, + -46.17018151033058 + ], + [ + -220.0023193359375, + -52.39230337528165 + ], + [ + -214.85888671875, + -59.50860192260693 + ], + [ + -191.134765625, + -74.53315596941721 + ], + [ + -176.7176513671875, + -80.09992540136429 + ], + [ + -157.8997802734375, + -84.90626956886456 + ], + [ + -135.015625, + -88.37514874849124 + ], + [ + -109.5479736328125, + -89.85974521522503 + ], + [ + -80.6170654296875, + -89.99639892578125 + ], + [ + -50.342041015625, + -89.99639892578125 + ], + [ + -20.7373046875, + -88.88152502511674 + ], + [ + 7.853271484375, + -85.90704401609669 + ], + [ + 33.5897216796875, + -83.3740558264582 + ], + [ + 56.649658203125, + -81.51530956761118 + ], + [ + 82.069580078125, + -78.03826461550346 + ], + [ + 104.4249267578125, + -73.9191243128233 + ], + [ + 120.2437744140625, + -70.00597299968746 + ], + [ + 133.3218994140625, + -65.35308140601012 + ], + [ + 143.6072998046875, + -58.76399169341709 + ], + [ + 152.50439453125, + -50.048898843124675 + ], + [ + 158.21826171875, + -42.36308685664729 + ], + [ + 160.523193359375, + -36.405811491924666 + ], + [ + 160.829833984375, + -29.285823589562774 + ], + [ + 157.5576171875, + -21.11250022854712 + ], + [ + 150.0762939453125, + -14.332424903558485 + ], + [ + 136.036865234375, + -8.900366121848341 + ], + [ + 111.0843505859375, + -3.3325636704910195 + ], + [ + 40.1942138671875, + 4.745943266083639 + ], + [ + 6.7703857421875, + 5.402648462601068 + ], + [ + -12.360595703125, + 2.9674281814328722 + ], + [ + -24.9716796875, + -1.4452372079603606 + ], + [ + -30.55029296875, + -5.440710329813195 + ], + [ + -32.4774169921875, + -8.073630849543457 + ], + [ + -32.8477783203125, + -9.389254855600289 + ], + [ + -32.8477783203125, + -9.824057644515463 + ], + [ + -32.744873046875, + -9.888031060850363 + ], + [ + -32.629150390625, + -9.888031060850363 + ], + [ + -32.526611328125, + -9.888031060850363 + ], + [ + -32.409423828125, + -9.849243641565419 + ], + [ + -32.380126953125, + -9.754746961227593 + ], + [ + -32.380126953125, + -9.754746961227593 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -32.380126953125, + 9.564941406250227 + ] + }, + { + "type": "rectangle", + "version": 220, + "versionNonce": 617054552, + "isDeleted": false, + "id": "5lN9-zHV-cu05kXRhDgCT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2040.5696821591748, + "y": 2340, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 340, + "height": 100, + "seed": 340642392, + "groupIds": [ + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "fYZk35xpRfEt0QuQppyOx" + } + ], + "updated": 1689142192091, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 196, + "versionNonce": 886227752, + "isDeleted": false, + "id": "fYZk35xpRfEt0QuQppyOx", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2073.460307159171, + "y": 2346.8, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 274.21875, + "height": 86.39999999999999, + "seed": 1506983768, + "groupIds": [ + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": "Helm release \nrevision 3", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "5lN9-zHV-cu05kXRhDgCT", + "originalText": "Helm release revision 3", + "lineHeight": 1.2, + "baseline": 78 + }, + { + "type": "line", + "version": 2473, + "versionNonce": 1225548632, + "isDeleted": false, + "id": "hJSfu48QxpI422kfaJBln", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2097.707299497586, + "y": 2541.8261874467134, + "strokeColor": "#aaa", + "backgroundColor": "transparent", + "width": 116.41346201192735, + "height": 117.21202429245167, + "seed": 1827738712, + "groupIds": [ + "eYJFMns4j4QLBVqDcZ4r7", + "N3n0k7IXudg0bAXu9sDFO", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -45.41825822666448, + 21.93317786250327 + ], + [ + -56.008758020263684, + 73.89921309644683 + ], + [ + -23.226449164345212, + 114.8019249876782 + ], + [ + 27.771448817200238, + 115.98170475270521 + ], + [ + 60.404703991663666, + 74.07373494971006 + ], + [ + 51.975750469818365, + 26.413023041480926 + ], + [ + 0.9647884008229255, + -1.2303195397464606 + ] + ] + }, + { + "type": "line", + "version": 1319, + "versionNonce": 1725963816, + "isDeleted": false, + "id": "_MYXimiNsSlo5ACV_4iMz", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2098.969404049515, + "y": 2540.832943996436, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 115.41867093283915, + "height": 115.59042490744159, + "seed": 326945112, + "groupIds": [ + "eYJFMns4j4QLBVqDcZ4r7", + "N3n0k7IXudg0bAXu9sDFO", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -46.03006519345368, + 22.156262723714654 + ], + [ + -57.194073542612244, + 73.85420907904887 + ], + [ + -25.59134221576342, + 114.90340900903183 + ], + [ + 25.591342215763476, + 115.59042490744159 + ], + [ + 58.224597390226904, + 73.68245510444643 + ], + [ + 46.8888350664659, + 21.984508749112223 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1454, + "versionNonce": 223754328, + "isDeleted": false, + "id": "BER6C9Mqlr09vI-a0Y6Eu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2097.7862253428384, + "y": 2616.135705129659, + "strokeColor": "#228be6", + "backgroundColor": "#fff", + "width": 70.66703236148203, + "height": 62.735747637392535, + "seed": 952753752, + "groupIds": [ + "N3n0k7IXudg0bAXu9sDFO", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 13.004448826885437 + ], + [ + -8.93162694154222, + 12.43282470262676 + ], + [ + -20.435562442248596, + 6.930942506636768 + ], + [ + -28.72411224399977, + -4.144274900875587 + ], + [ + -31.86804492742263, + -19.649579271392895 + ], + [ + -29.295736368258474, + -32.65402809827839 + ], + [ + -21.936075768427685, + -41.15693694662656 + ], + [ + -13.218807873482476, + -48.23078548432795 + ], + [ + -3.5011977610845406, + -49.7312988105071 + ], + [ + 8.217096786218832, + -47.51625532900459 + ], + [ + 17.50598880542273, + -43.30052741259669 + ], + [ + 24.79419638972118, + -35.72650776616888 + ], + [ + 28.36684716633806, + -29.724454461452524 + ], + [ + 28.081035104208723, + -21.43590465970135 + ], + [ + 38.7989874340594, + -20.72137450437799 + ], + [ + 17.07727071222871, + 3.3582917300198574 + ], + [ + 6.859489491104426, + -20.22120339565157 + ], + [ + 16.00547547924367, + -19.86393831798989 + ], + [ + 13.647525966676511, + -29.724454461452524 + ], + [ + 2.786667605761153, + -37.155568076815655 + ], + [ + -8.431455832815857, + -35.86941379723356 + ], + [ + -16.434193572437678, + -28.724112243999798 + ], + [ + -18.43487800734313, + -17.720347852019756 + ], + [ + -16.791458650099372, + -10.146328205591942 + ], + [ + -11.289576454109351, + -3.4297447455522274 + ], + [ + -1.3576072951144198, + -1.0003422174527827 + ] + ] + }, + { + "type": "text", + "version": 559, + "versionNonce": 1149901096, + "isDeleted": false, + "id": "UJhz_pcc2p7AqVEyhhlTa", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2070.121071118486, + "y": 2623.3013746917914, + "strokeColor": "#fff", + "backgroundColor": "transparent", + "width": 57.899932861328125, + "height": 25, + "seed": 1034703704, + "groupIds": [ + "N3n0k7IXudg0bAXu9sDFO", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "deploy", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "deploy", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "line", + "version": 2700, + "versionNonce": 865955160, + "isDeleted": false, + "id": "mjLM2ZOdRoMsDg8Xok8-L", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2338.3988096980866, + "y": 2542.3558982561435, + "strokeColor": "#aaa", + "backgroundColor": "transparent", + "width": 116.41346201192735, + "height": 117.21202429245167, + "seed": 1215834200, + "groupIds": [ + "Es26LU5Ato1e5eEaRsmro", + "HtQLXEeurMV50k4d4LEPC", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -45.41825822666448, + 21.93317786250327 + ], + [ + -56.008758020263684, + 73.89921309644683 + ], + [ + -23.226449164345212, + 114.8019249876782 + ], + [ + 27.771448817200238, + 115.98170475270521 + ], + [ + 60.404703991663666, + 74.07373494971006 + ], + [ + 51.975750469818365, + 26.413023041480926 + ], + [ + 0.9647884008229255, + -1.2303195397464606 + ] + ] + }, + { + "type": "line", + "version": 1546, + "versionNonce": 1899803688, + "isDeleted": false, + "id": "rHyzoREeRrSntMsFH_f9b", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2339.6609142500156, + "y": 2541.3626548058664, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 115.41867093283915, + "height": 115.59042490744159, + "seed": 352410968, + "groupIds": [ + "Es26LU5Ato1e5eEaRsmro", + "HtQLXEeurMV50k4d4LEPC", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -46.03006519345368, + 22.156262723714654 + ], + [ + -57.194073542612244, + 73.85420907904887 + ], + [ + -25.59134221576342, + 114.90340900903183 + ], + [ + 25.591342215763476, + 115.59042490744159 + ], + [ + 58.224597390226904, + 73.68245510444643 + ], + [ + 46.8888350664659, + 21.984508749112223 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 557, + "versionNonce": 1429602904, + "isDeleted": false, + "id": "8dRfWGVq762q5OnxxfgKZ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2323.325104705008, + "y": 2569.9824682109816, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 31.919838740452235, + "height": 14.716934995597882, + "seed": 1151070808, + "groupIds": [ + "HtQLXEeurMV50k4d4LEPC", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 695, + "versionNonce": 1122234152, + "isDeleted": false, + "id": "vjKuIGoE4HDtvuFeh32T5", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2303.586512835912, + "y": 2613.4372019479833, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 20.285504993932324, + "height": 13.026476246103528, + "seed": 773580632, + "groupIds": [ + "HtQLXEeurMV50k4d4LEPC", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 775, + "versionNonce": 1089730392, + "isDeleted": false, + "id": "LcGCc7sjkPlbx0v7ACPih", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2329.291429703223, + "y": 2612.890288823147, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 20.285504993932324, + "height": 13.026476246103528, + "seed": 768949336, + "groupIds": [ + "HtQLXEeurMV50k4d4LEPC", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 737, + "versionNonce": 1911278120, + "isDeleted": false, + "id": "iDXSt1IOb3-gqeW3vzCsT", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2356.338769695132, + "y": 2613.387482572998, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 20.285504993932324, + "height": 13.026476246103528, + "seed": 1973154136, + "groupIds": [ + "HtQLXEeurMV50k4d4LEPC", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 474, + "versionNonce": 1261128792, + "isDeleted": false, + "id": "dVBGBftLVxvEVu2s3ryYp", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2340.2296921999514, + "y": 2584.4010869566687, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 0.4971937498513057, + "height": 27.743411241701438, + "seed": 1556350552, + "groupIds": [ + "HtQLXEeurMV50k4d4LEPC", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.4971937498513057, + 27.743411241701438 + ] + ] + }, + { + "type": "line", + "version": 505, + "versionNonce": 1228948776, + "isDeleted": false, + "id": "1USMMNRmLoKkcfnILcdaJ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2311.8896484584284, + "y": 2612.442814448281, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 55.38738373343267, + "height": 15.015251245508665, + "seed": 807500632, + "groupIds": [ + "HtQLXEeurMV50k4d4LEPC", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.4915812495538034, + -12.927037496133295 + ], + [ + 54.19411873378954, + -14.418618745687127 + ], + [ + 55.38738373343267, + 0.5966324998215384 + ] + ] + }, + { + "type": "text", + "version": 424, + "versionNonce": 498073944, + "isDeleted": false, + "id": "zudtO8CfTvzoJtHprz11T", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2321.995359909284, + "y": 2626.4278236220125, + "strokeColor": "#fff", + "backgroundColor": "transparent", + "width": 31.359970092773438, + "height": 25, + "seed": 34099288, + "groupIds": [ + "HtQLXEeurMV50k4d4LEPC", + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "svc", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "svc", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "line", + "version": 182, + "versionNonce": 1447911464, + "isDeleted": false, + "id": "CxQmOmpK7HBU-cWCKuDlG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2200.5696821591673, + "y": 2440, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 0, + "height": 60, + "seed": 2051835224, + "groupIds": [ + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 60 + ] + ] + }, + { + "type": "line", + "version": 181, + "versionNonce": 131470936, + "isDeleted": false, + "id": "toML5fu3hqQwfUQhzBiys", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2100.5696821591673, + "y": 2500, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 240, + "height": 0, + "seed": 641866328, + "groupIds": [ + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 240, + 0 + ] + ] + }, + { + "type": "line", + "version": 171, + "versionNonce": 419371816, + "isDeleted": false, + "id": "tGh26skvv0TPXkr89aNaF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2100.5696821591673, + "y": 2500, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 0, + "height": 40, + "seed": 1220349784, + "groupIds": [ + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 40 + ] + ] + }, + { + "type": "line", + "version": 171, + "versionNonce": 1316064088, + "isDeleted": false, + "id": "I9JPeBvRzesWz0oIYfDsa", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2340.5696821591673, + "y": 2500, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 0, + "height": 40, + "seed": 705782872, + "groupIds": [ + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1689142017392, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 40 + ] + ] + }, + { + "id": "oCIVkEaAwY2CP2LF0vcRd", + "type": "freedraw", + "x": 2242.8777676622467, + "y": 2460.705321802445, + "width": 322.714599609375, + "height": 78.1759033203125, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "groupIds": [ + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "seed": 498612008, + "version": 111, + "versionNonce": 1881006168, + "isDeleted": false, + "boundElements": null, + "updated": 1689142195104, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.270263671875, + 0 + ], + [ + -0.8887939453125, + 0 + ], + [ + -2.7677001953125, + 0 + ], + [ + -6.923583984375, + 0 + ], + [ + -14.0596923828125, + 0 + ], + [ + -26.41064453125, + 0 + ], + [ + -42.267333984375, + 0 + ], + [ + -59.869873046875, + -0.142822265625 + ], + [ + -77.8037109375, + -0.61932373046875 + ], + [ + -92.900390625, + -1.50103759765625 + ], + [ + -105.5048828125, + -2.58074951171875 + ], + [ + -115.255615234375, + -3.64990234375 + ], + [ + -123.741455078125, + -5.088623046875 + ], + [ + -132.300537109375, + -6.923828125 + ], + [ + -139.6529541015625, + -8.79852294921875 + ], + [ + -147.2000732421875, + -10.872314453125 + ], + [ + -154.81298828125, + -13.44207763671875 + ], + [ + -161.332763671875, + -16.3201904296875 + ], + [ + -167.3841552734375, + -19.3929443359375 + ], + [ + -173.5477294921875, + -23.1590576171875 + ], + [ + -178.94287109375, + -26.872802734375 + ], + [ + -183.343505859375, + -30.654296875 + ], + [ + -186.998291015625, + -35.15740966796875 + ], + [ + -189.0755615234375, + -39.3358154296875 + ], + [ + -189.68505859375, + -43.4967041015625 + ], + [ + -189.68505859375, + -48.04779052734375 + ], + [ + -183.55419921875, + -59.14453125 + ], + [ + -179.2701416015625, + -64.17340087890625 + ], + [ + -174.9310302734375, + -68.2930908203125 + ], + [ + -168.5838623046875, + -72.508056640625 + ], + [ + -161.400146484375, + -75.52960205078125 + ], + [ + -153.0689697265625, + -77.1937255859375 + ], + [ + -142.2091064453125, + -77.96051025390625 + ], + [ + -131.048583984375, + -78.1759033203125 + ], + [ + -120.826171875, + -78.1759033203125 + ], + [ + -109.480712890625, + -78.1759033203125 + ], + [ + -96.9898681640625, + -77.84344482421875 + ], + [ + -84.2576904296875, + -76.86767578125 + ], + [ + -70.645263671875, + -76.111572265625 + ], + [ + -56.166015625, + -75.99884033203125 + ], + [ + -26.7451171875, + -75.962890625 + ], + [ + -10.5947265625, + -75.6722412109375 + ], + [ + 11.440673828125, + -73.8548583984375 + ], + [ + 33.4013671875, + -71.05682373046875 + ], + [ + 52.354248046875, + -67.9429931640625 + ], + [ + 71.9661865234375, + -63.830810546875 + ], + [ + 90.0657958984375, + -59.0535888671875 + ], + [ + 102.5447998046875, + -55.1494140625 + ], + [ + 110.8294677734375, + -52.4122314453125 + ], + [ + 118.5838623046875, + -49.20343017578125 + ], + [ + 124.416259765625, + -45.64654541015625 + ], + [ + 128.3927001953125, + -42.50390625 + ], + [ + 132.376953125, + -36.125732421875 + ], + [ + 133.029541015625, + -32.177734375 + ], + [ + 132.17529296875, + -28.15032958984375 + ], + [ + 128.6070556640625, + -23.823974609375 + ], + [ + 121.5654296875, + -19.54827880859375 + ], + [ + 110.533447265625, + -15.60394287109375 + ], + [ + 95.8236083984375, + -12.60479736328125 + ], + [ + 78.648193359375, + -11.2509765625 + ], + [ + 56.938232421875, + -11.26556396484375 + ], + [ + 35.3516845703125, + -12.41650390625 + ], + [ + 18.496826171875, + -13.6114501953125 + ], + [ + 4.456298828125, + -14.40087890625 + ], + [ + -7.38037109375, + -15.27044677734375 + ], + [ + -17.5391845703125, + -16.167236328125 + ], + [ + -24.6226806640625, + -16.9407958984375 + ], + [ + -28.433349609375, + -17.35638427734375 + ], + [ + -30.28955078125, + -17.44482421875 + ], + [ + -31.185791015625, + -17.44482421875 + ], + [ + -31.5146484375, + -17.44482421875 + ], + [ + -31.4495849609375, + -17.44482421875 + ], + [ + -31.2830810546875, + -17.44482421875 + ], + [ + -30.9271240234375, + -17.54803466796875 + ], + [ + -30.9271240234375, + -17.54803466796875 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -30.9271240234375, + -17.54803466796875 + ] + }, + { + "id": "AGt618kQfGm8cYD6WpJQ0", + "type": "text", + "x": 2040.0000000000039, + "y": 2240, + "width": 525, + "height": 67.2, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lw_qW9E7CI0c0pC3u1x_c" + ], + "frameId": null, + "roundness": null, + "seed": 426415960, + "version": 130, + "versionNonce": 242081832, + "isDeleted": false, + "boundElements": null, + "updated": 1689142192091, + "link": null, + "locked": false, + "text": "Only revision 3\nactually running in the cluster.", + "fontSize": 28, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 61, + "containerId": null, + "originalText": "Only revision 3\nactually running in the cluster.", + "lineHeight": 1.2, + "isFrameName": false + }, + { + "type": "line", + "version": 2716, + "versionNonce": 509618216, + "isDeleted": false, + "id": "ZNlBhFCmXZbdpkXiZM6xy", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -182.4072438509645, + "y": 1559.1846222110798, + "strokeColor": "#aaa", + "backgroundColor": "transparent", + "width": 116.41346201192735, + "height": 117.21202429245167, + "seed": 806306344, + "groupIds": [ + "V5ZZ7lI85RXR__amVWviW", + "Rz2K0hkinmU2mg1xPdEg2", + "V5D__pmFVGAWI_8iXGnml" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689143107430, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -45.41825822666448, + 21.93317786250327 + ], + [ + -56.008758020263684, + 73.89921309644683 + ], + [ + -23.226449164345212, + 114.8019249876782 + ], + [ + 27.771448817200238, + 115.98170475270521 + ], + [ + 60.404703991663666, + 74.07373494971006 + ], + [ + 51.975750469818365, + 26.413023041480926 + ], + [ + 0.9647884008229255, + -1.2303195397464606 + ] + ] + }, + { + "type": "line", + "version": 1562, + "versionNonce": 355716696, + "isDeleted": false, + "id": "5ucx630MRSj9AAsHdncBB", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -181.14513929903524, + "y": 1558.1913787608023, + "strokeColor": "#fff", + "backgroundColor": "#228be6", + "width": 115.41867093283915, + "height": 115.59042490744159, + "seed": 1681177896, + "groupIds": [ + "V5ZZ7lI85RXR__amVWviW", + "Rz2K0hkinmU2mg1xPdEg2", + "V5D__pmFVGAWI_8iXGnml" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689143107430, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -46.03006519345368, + 22.156262723714654 + ], + [ + -57.194073542612244, + 73.85420907904887 + ], + [ + -25.59134221576342, + 114.90340900903183 + ], + [ + 25.591342215763476, + 115.59042490744159 + ], + [ + 58.224597390226904, + 73.68245510444643 + ], + [ + 46.8888350664659, + 21.984508749112223 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 624, + "versionNonce": 1668866856, + "isDeleted": false, + "id": "fRmOZcnIXQc7L8RsaylPR", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -208.8331168781442, + "y": 1585.9978120195547, + "strokeColor": "#228be6", + "backgroundColor": "#fff", + "width": 53.92113510641704, + "height": 57.34858523803945, + "seed": 200464424, + "groupIds": [ + "QXZj9pwRdruEch4FVsj8-", + "Rz2K0hkinmU2mg1xPdEg2", + "V5D__pmFVGAWI_8iXGnml" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689143107430, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 525, + "versionNonce": 1465402200, + "isDeleted": false, + "id": "8PBz0Hc3RgVeomVYZq1MQ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -189.4925054211319, + "y": 1577.5395707812654, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 15.178707725756453, + "height": 16.782048700800715, + "seed": 1798673192, + "groupIds": [ + "QXZj9pwRdruEch4FVsj8-", + "Rz2K0hkinmU2mg1xPdEg2", + "V5D__pmFVGAWI_8iXGnml" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689143107430, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 685, + "versionNonce": 465714728, + "isDeleted": false, + "id": "spfP73ql_I9pbrPu6BPMS", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -163.60301603405583, + "y": 1609.22490710796, + "strokeColor": "#fff", + "backgroundColor": "#fff", + "width": 17.111639278897893, + "height": 11.139212927772919, + "seed": 1751707176, + "groupIds": [ + "QXZj9pwRdruEch4FVsj8-", + "Rz2K0hkinmU2mg1xPdEg2", + "V5D__pmFVGAWI_8iXGnml" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689143107430, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 728, + "versionNonce": 656808024, + "isDeleted": false, + "id": "serQqUJh35tdNEuaEL6R2", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -218.7176382398768, + "y": 1608.5210557416444, + "strokeColor": "#228be6", + "backgroundColor": "#228be6", + "width": 20.460165757730927, + "height": 12.608120127039674, + "seed": 1014556968, + "groupIds": [ + "QXZj9pwRdruEch4FVsj8-", + "Rz2K0hkinmU2mg1xPdEg2", + "V5D__pmFVGAWI_8iXGnml" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689143107430, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 838, + "versionNonce": 1479031080, + "isDeleted": false, + "id": "ZS0oPZlewXk-DJTWox_6n", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -187.8093825886392, + "y": 1630.7994815971902, + "strokeColor": "#228be6", + "backgroundColor": "#228be6", + "width": 14.199436259578652, + "height": 17.137250658112155, + "seed": 584156200, + "groupIds": [ + "QXZj9pwRdruEch4FVsj8-", + "Rz2K0hkinmU2mg1xPdEg2", + "V5D__pmFVGAWI_8iXGnml" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689143107430, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 85, + "versionNonce": 1215384920, + "isDeleted": false, + "id": "ySJg0dzZoU6ubTdQgqTLI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -260, + "y": 1686.8065364335653, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 316.40625, + "height": 43.199999999999996, + "seed": 157204264, + "groupIds": [ + "V5D__pmFVGAWI_8iXGnml" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689143107430, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": "ComponentPlan A", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ComponentPlan A", + "lineHeight": 1.2, + "baseline": 35 + }, + { + "type": "text", + "version": 194, + "versionNonce": 739693608, + "isDeleted": false, + "id": "zluuYukeiOlEzM9qHsUMP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -260, + "y": 1736.4065364335652, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 764.162109375, + "height": 321.99999999999994, + "seed": 1082956328, + "groupIds": [ + "V5D__pmFVGAWI_8iXGnml" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689143107430, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 2, + "text": "apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n labels:\n core.kubebb.k8s.com.cn/componentplan-release: my-nginx\nspec:\n name: my-nginx\nstatus:\n installedRevision: 1\n latest: false", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "apiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n labels:\n core.kubebb.k8s.com.cn/componentplan-release: my-nginx\nspec:\n name: my-nginx\nstatus:\n installedRevision: 1\n latest: false", + "lineHeight": 1.15, + "baseline": 315 + }, + { + "type": "ellipse", + "version": 36, + "versionNonce": 1495573848, + "isDeleted": false, + "id": "oZB72qhPvW3u5qHpIkc8P", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -240, + "y": 1919.4140254787478, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 260, + "height": 60, + "seed": 726078760, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1689141933910, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 35, + "versionNonce": 887421992, + "isDeleted": false, + "id": "W8mKcBy1Lg5mJuR5sNIhC", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 260, + "y": 1839.4140254787478, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 280, + "height": 80, + "seed": 1861890088, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1689141933910, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1070, + "versionNonce": 2103271720, + "isDeleted": false, + "id": "TcHLV96QtDJLvC_9cH7ZI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1581.1869734972715, + "y": 2411.747904613613, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 179.008480899036, + "height": 119.99999999999713, + "seed": 1985415464, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689142051584, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 59.999999999998565 + ], + [ + 107.40508853942157, + 59.99999999999855 + ], + [ + 107.40508853942163, + 89.99999999999783 + ], + [ + 179.008480899036, + 29.99999999999929 + ], + [ + 107.40508853942157, + -29.999999999999297 + ], + [ + 107.40508853942157, + -5.684341886080802e-14 + ], + [ + 0, + 0 + ] + ] + }, + { + "id": "HrDeFQ8ynMtODkiy3W8-9", + "type": "rectangle", + "x": -340, + "y": 2180, + "width": 3140, + "height": 740, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 979390248, + "version": 37, + "versionNonce": 1486968104, + "isDeleted": false, + "boundElements": null, + "updated": 1689142105079, + "link": null, + "locked": false + }, + { + "id": "GrGgxiE76h73_DbXmYIni", + "type": "text", + "x": -1040, + "y": 1200, + "width": 3756.8671875, + "height": 183.20000000000002, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1997303848, + "version": 127, + "versionNonce": 167224408, + "isDeleted": false, + "boundElements": null, + "updated": 1689147465150, + "link": null, + "locked": false, + "text": "How does ComponentPlan change Helm Release", + "fontSize": 152.66666666666669, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 147, + "containerId": null, + "originalText": "How does ComponentPlan change Helm Release", + "lineHeight": 1.2, + "isFrameName": false + }, + { + "id": "c8QRGPo3rqjxqpXHLrjo4", + "type": "text", + "x": -1100, + "y": 2040, + "width": 751.1951293945312, + "height": 160.80000000000035, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 112109912, + "version": 339, + "versionNonce": 90085464, + "isDeleted": false, + "boundElements": [ + { + "id": "AEP7UUKsBQdKNLm6ewb8I", + "type": "arrow" + }, + { + "id": "YrRMkmxD-waiBuDJTfYVV", + "type": "arrow" + } + ], + "updated": 1689142739333, + "link": null, + "locked": false, + "text": "1. When ComponentPlan A\nis created,the helm release \nwill be install same time.", + "fontSize": 44.66666666666677, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 150, + "containerId": null, + "originalText": "1. When ComponentPlan A\nis created,the helm release \nwill be install same time.", + "lineHeight": 1.2, + "isFrameName": false + }, + { + "id": "AEP7UUKsBQdKNLm6ewb8I", + "type": "arrow", + "x": -320, + "y": 1840, + "width": 299.9999999999998, + "height": 180, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1165097768, + "version": 80, + "versionNonce": 1471172648, + "isDeleted": false, + "boundElements": null, + "updated": 1689142733326, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -299.9999999999998, + 180 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "c8QRGPo3rqjxqpXHLrjo4", + "focus": -0.12349136336235073, + "gap": 20 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "YrRMkmxD-waiBuDJTfYVV", + "type": "arrow", + "x": -660, + "y": 2220, + "width": 440, + "height": 200, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1350830888, + "version": 19, + "versionNonce": 1463926312, + "isDeleted": false, + "boundElements": null, + "updated": 1689142739333, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 440, + 200 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "c8QRGPo3rqjxqpXHLrjo4", + "focus": 0.28004316298715953, + "gap": 19.199999999999818 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "type": "text", + "version": 532, + "versionNonce": 1792895832, + "isDeleted": false, + "id": "bweaa2s3KCnhsChVbJa3H", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 120, + "y": 1980, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 680.3671875, + "height": 160.80000000000035, + "seed": 81451560, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689143135655, + "link": null, + "locked": false, + "fontSize": 44.66666666666677, + "fontFamily": 3, + "text": "2. update ComponentPlan A \nwill make helm release \nupgrade same time", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2. update ComponentPlan A \nwill make helm release \nupgrade same time", + "lineHeight": 1.2, + "baseline": 150 + }, + { + "id": "PIIipfLUYb2x2Fx3LhZCM", + "type": "arrow", + "x": 80, + "y": 1960, + "width": 780, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1453125928, + "version": 28, + "versionNonce": 1978525272, + "isDeleted": false, + "boundElements": null, + "updated": 1689142899852, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 780, + -20 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "o6B31cOzHzFXLPjg9dnst", + "focus": -0.28138623628243703, + "gap": 20 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "2nVtzjKLWveUH_3WdRMpI", + "type": "arrow", + "x": 1180, + "y": 2000, + "width": 0, + "height": 260, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 822558760, + "version": 19, + "versionNonce": 770790184, + "isDeleted": false, + "boundElements": null, + "updated": 1689142917386, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 260 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "type": "text", + "version": 779, + "versionNonce": 1569925928, + "isDeleted": false, + "id": "dy733kqIbDz45LoUk7AaB", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2460, + "y": 1980, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 575.6953125, + "height": 268.0000000000006, + "seed": 1871961432, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1689143081862, + "link": null, + "locked": false, + "fontSize": 44.66666666666677, + "fontFamily": 3, + "text": "3.It is ok to create \nComponentPlan B\nPointing to \nthe same helm relase,\nit will upgrade either", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.It is ok to create \nComponentPlan B\nPointing to \nthe same helm relase,\nit will upgrade either", + "lineHeight": 1.2, + "baseline": 257 + } + ], + "appState": { + "gridSize": 20, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/core/images/componentplan-helm-release.png b/core/images/componentplan-helm-release.png new file mode 100644 index 000000000..1ecb8bb3f Binary files /dev/null and b/core/images/componentplan-helm-release.png differ diff --git a/core/images/image-changed.excalidraw b/core/images/image-changed.excalidraw new file mode 100644 index 000000000..829db5c2a --- /dev/null +++ b/core/images/image-changed.excalidraw @@ -0,0 +1,564 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "GTgfACU3d_uwwW9lx49ZQ", + "type": "text", + "x": -452.3746845678919, + "y": 4072.5121815254897, + "width": 900.84375, + "height": 43.199999999999996, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#15aabf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1398775111, + "version": 232, + "versionNonce": 1403940136, + "isDeleted": false, + "boundElements": [], + "updated": 1689131832487, + "link": null, + "locked": false, + "text": "Raw Image: docker.com/library/nginx:1.25.1", + "fontSize": 36, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 35, + "containerId": null, + "originalText": "Raw Image: docker.com/library/nginx:1.25.1", + "lineHeight": 1.2, + "isFrameName": false + }, + { + "id": "zngXicvdKhr4jvZD8JNym", + "type": "line", + "x": -220, + "y": 4120, + "width": 210.1094970703125, + "height": 0, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#15aabf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1767419719, + "version": 99, + "versionNonce": 1839154264, + "isDeleted": false, + "boundElements": null, + "updated": 1689131894827, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 210.1094970703125, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "-KsSCEOuRrXW4sEEejItu", + "type": "line", + "x": 10.953240412487276, + "y": 4121.703631755288, + "width": 152.601318359375, + "height": 0, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#15aabf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 86578407, + "version": 48, + "versionNonce": 1085704232, + "isDeleted": false, + "boundElements": null, + "updated": 1689131832487, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 152.601318359375, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "d2HFjeOb1IyOO9GMuaPiy", + "type": "line", + "x": 189.40380193592478, + "y": 4124.3433107103665, + "width": 245.924072265625, + "height": 0, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#15aabf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1126086279, + "version": 32, + "versionNonce": 838037080, + "isDeleted": false, + "boundElements": null, + "updated": 1689131832487, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 245.924072265625, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "3uaSo0J178BSgqtEBLXsi", + "type": "arrow", + "x": 300.9516534984248, + "y": 4149.558276530679, + "width": 17.3525390625, + "height": 386.6170654296875, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#15aabf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 985127559, + "version": 218, + "versionNonce": 738411304, + "isDeleted": false, + "boundElements": null, + "updated": 1689131832487, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 17.3525390625, + 386.6170654296875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "R1mVyES0yntp8nM1mZ_72", + "type": "arrow", + "x": 48.033806818737276, + "y": 4156.054644938882, + "width": 126.8997802734375, + "height": 570.9933471679688, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#15aabf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 161361639, + "version": 247, + "versionNonce": 874447144, + "isDeleted": false, + "boundElements": null, + "updated": 1689131959696, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -126.8997802734375, + 570.9933471679688 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "y2azV2_ZdnG7EV-HJM542", + "focus": 0.9359113154727035, + "gap": 12.95200789314913 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "-iLOgYtCddP4n1ijgwGzE", + "type": "arrow", + "x": -136.23853204845022, + "y": 4153.242358561929, + "width": 13.97161865234375, + "height": 510.3995361328125, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#15aabf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 229808233, + "version": 212, + "versionNonce": 604020264, + "isDeleted": false, + "boundElements": null, + "updated": 1689131832487, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -13.97161865234375, + 510.3995361328125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "L1MSk5m2kYyHNbQNay_iD", + "type": "text", + "x": -400, + "y": 4300, + "width": 403.125, + "height": 480, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#15aabf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1623284103, + "version": 189, + "versionNonce": 2035510360, + "isDeleted": false, + "boundElements": null, + "updated": 1689131921814, + "link": null, + "locked": false, + "text": "仓库CRD定义\n\napiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: Repository\nmetadata:\n name: repository-bitnami-special-version\n namespace: kubebb-system\nspec:\n url: https://charts.bitnami.com/bitnami\n pullStategy:\n intervalSeconds: 120\n retry: 5\n filter:\n - name: wordpress\n operation: keep\n versionedFilterCond:\n versions:\n - 16.1.14\n - 16.1.13\n imageOverride:\n - registry: docker.com\n newRegistry: 192.168.1.1\n pathOverride:\n path: library\n newPath: system-container", + "fontSize": 16, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 476, + "containerId": null, + "originalText": "仓库CRD定义\n\napiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: Repository\nmetadata:\n name: repository-bitnami-special-version\n namespace: kubebb-system\nspec:\n url: https://charts.bitnami.com/bitnami\n pullStategy:\n intervalSeconds: 120\n retry: 5\n filter:\n - name: wordpress\n operation: keep\n versionedFilterCond:\n versions:\n - 16.1.14\n - 16.1.13\n imageOverride:\n - registry: docker.com\n newRegistry: 192.168.1.1\n pathOverride:\n path: library\n newPath: system-container", + "lineHeight": 1.2, + "isFrameName": false + }, + { + "id": "hez3e14f4DN75wOrUQRrt", + "type": "rectangle", + "x": -380, + "y": 4680, + "width": 248.033935546875, + "height": 43.25213623046875, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 364071783, + "version": 78, + "versionNonce": 549089624, + "isDeleted": false, + "boundElements": [], + "updated": 1689131952535, + "link": null, + "locked": false + }, + { + "id": "y2azV2_ZdnG7EV-HJM542", + "type": "rectangle", + "x": -360, + "y": 4740, + "width": 277.76971435546875, + "height": 43.634521484375, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 716875113, + "version": 63, + "versionNonce": 1646986584, + "isDeleted": false, + "boundElements": [ + { + "id": "R1mVyES0yntp8nM1mZ_72", + "type": "arrow" + } + ], + "updated": 1689131959696, + "link": null, + "locked": false + }, + { + "id": "ULzG1kVpPqhQ9RkFKch5d", + "type": "text", + "x": 160, + "y": 4300, + "width": 403.125, + "height": 422.4, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 133335561, + "version": 264, + "versionNonce": 578172504, + "isDeleted": false, + "boundElements": null, + "updated": 1689131925543, + "link": null, + "locked": false, + "text": "组件CRD定义\n\napiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n name: nginx-15.0.2\n namespace: kubebb-system\nspec:\n approved: true\n component:\n name: repository-bitnami-sample.nginx\n namespace: kubebb-system\n name: my-nginx\n override:\n images:\n - name: docker.io/library/nginx\n newTag: latest\n repository:\n name: repository-bitnami-sample\n namespace: kubebb-system\n version: 15.0.2\n name: my-nginx", + "fontSize": 16, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 418, + "containerId": null, + "originalText": "组件CRD定义\n\napiVersion: core.kubebb.k8s.com.cn/v1alpha1\nkind: ComponentPlan\nmetadata:\n name: nginx-15.0.2\n namespace: kubebb-system\nspec:\n approved: true\n component:\n name: repository-bitnami-sample.nginx\n namespace: kubebb-system\n name: my-nginx\n override:\n images:\n - name: docker.io/library/nginx\n newTag: latest\n repository:\n name: repository-bitnami-sample\n namespace: kubebb-system\n version: 15.0.2\n name: my-nginx", + "lineHeight": 1.2, + "isFrameName": false + }, + { + "id": "20GuH5wCK7HSfUDVNPGow", + "type": "rectangle", + "x": 180, + "y": 4560, + "width": 340, + "height": 65.3388671875, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 1411896967, + "version": 161, + "versionNonce": 2016882472, + "isDeleted": false, + "boundElements": [], + "updated": 1689131987225, + "link": null, + "locked": false + }, + { + "id": "Uhm9bEmejFtlAXKVW72qJ", + "type": "text", + "x": -497.18300539154984, + "y": 4843.742862038698, + "width": 1160.15625, + "height": 43.199999999999996, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2071112713, + "version": 196, + "versionNonce": 1574203176, + "isDeleted": false, + "boundElements": null, + "updated": 1689131832487, + "link": null, + "locked": false, + "text": "Changed Image 192.168.1.1/system-container/nginx:latest", + "fontSize": 36, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 35, + "containerId": null, + "originalText": "Changed Image 192.168.1.1/system-container/nginx:latest", + "lineHeight": 1.2, + "isFrameName": false + }, + { + "id": "lW2S2DGyHAYLZ1QDocteK", + "type": "arrow", + "x": 94.39434148670603, + "y": 4141.050372477945, + "width": 14.32574462890625, + "height": 683.4826965332031, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 523784615, + "version": 97, + "versionNonce": 1800107864, + "isDeleted": false, + "boundElements": null, + "updated": 1689131832487, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -14.32574462890625, + 683.4826965332031 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "triangle" + } + ], + "appState": { + "gridSize": 20, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/core/images/image-changed.png b/core/images/image-changed.png new file mode 100644 index 000000000..b145201cf Binary files /dev/null and b/core/images/image-changed.png differ diff --git a/core/overview.md b/core/overview.md new file mode 100644 index 000000000..8283929a3 --- /dev/null +++ b/core/overview.md @@ -0,0 +1,91 @@ +--- +sidebar_position: 1 +--- + +# 介绍 + +[内核](https://github.com/kubebb/core)基于[kubernetes operator](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/)模式进行开发,提供完整的组件生命周期管理、组件订阅和自动化部署能力,并通过[tekton](https://tekton.dev/)扩展实现组件自动化评级和安装前校验等能力。 + +## 背景 + +## 整体架构 + +![KubeBB Core架构图](https://raw.githubusercontent.com/kubebb/core/main/assets/arch.png) + +## 核心优势 + +### 声明式组件生命周期管理 + +**声明式**的组件生命周期管理有以下优势: + +- **可读性:** 更易于理解和阅读组件定义本身,因为它们表达了想要的结果,而不是实现的步骤。 +- **可维护性:**更易于维护组件,因为它们更容易理解,更容易修改,而且更少有错误。 +- **可重用性:**更容易重用组件,因为它们通常是独立于上下文的,可以在不同的环境中使用。 +- **可扩展性:**更易于扩展组件,因为它们通常是基于组件和模块的,可以简单地组合起来创建更复杂的系统。 +- **可靠性:**更可靠,因为它们通常是基于静态配置的,而不是基于运行时状态的。这意味着它们更少出现运行时错误和意外行为。 + +为实现**声明式生命周期管理**,定义了四种CRD: + +- [Repository](./concepts/repository.md): 定义了组件仓库的访问信息、轮询策略和过滤选项,从而实现周期性地向仓库服务获取最新的组件列表信息。 +- [Component](./concepts/component.md): 记录了组件的基础描述、版本列表等信息 +- [ComponentPlan](./concepts/componentplan.md): 定义了组件安装部署的手动批准、组件引用、版本设置、类helm的配置覆盖策略,从而实现组件的可追踪部署、升级和回滚。 +- [Subscription](./concepts/subscription.md): 定义了用户订阅组件版本更新 + +### 多维度组件评级 + +通过集成[Tekton](https://github.com/kubebb/components/tree/main/examples/tekton-operator)流水线组件,实现自动化的组件评级,并通过`CRD Rating`完成评测数据总结和分析。 + +目前组件评级围绕三个维度展开: + +- [**安全性:**](./rating#安全性任务) 评估组件的安全性和软件供应链的安全性。 +- [**可靠性:**](./rating#可靠性任务) 评估组件本身是否已经过良好的功能测试、性能测试 +- [**可用性:**](./rating#可用性任务) 评估组件是否有充足的文档、示例来指导用户使用 + +### 全面适配Helm生态 + +[Helm](https://helm.sh/)是一种成熟的包管理工具,提供一种简单的方式来管理Kubernetes应用程序的部署和升级。它拥有庞大的社区和众多优秀的项目。 +因此,内核从设计之初就确定了必须全面兼容**Helm生态**。 + +这一特点体现在**内核设计**的各个方面,我们支持: + +- [Charts](https://helm.sh/docs/chart_template_guide/getting_started/)作为组件, 并遵循[Charts]版本标准 +- [组件仓库](./concepts/repository.md)完全适配**Helm类型**仓库 +- [组件部署](./concepts/componentplan.md)基本全面覆盖[Helm CLI](https://helm.sh/docs/helm/helm/)能力 + +### 扩展适配底座服务 + +底座服务支持通过**自定义菜单**和**路由**扩展平台服务,为支撑适配这一能力,我们做了以下努力: + +- 移植**Menu**资源类型 +- 移植**Route**配置 + +从而通过**内核**串联**低代码开发平台**与**底座服务**。 + +:::tip + +1. 低代码开发平台定义**Menus**、**Route**等底座相关资源,并打包到组件模版中 +2. 内核获取**底座自定义资源**后,自动解析、配置、创建对应资源 + +::: + +## 路线图 + +### v0.1.0 + +- 支持管理组件仓库 **Repository** + - 支持与 Helm 仓库兼容的 **Repository Server** + - **Watcher** 监视 **Repository** +- 实现 **Component** 管理 + - **Watcher** 实现 **Components** 的 CRUD 操作 +- 支持 **ComponentPlan** 和 **Subscription** + - 允许用户订阅 **Component** 的最新版本更改 + - 使用与 Helm Chart 兼容的 **ComponentPlan** 计划组件部署 + +### v0.2.0 + +- 支持内核各控制器的**Events**记录 +- 适配 Kubebb 底座服务 +- 基于[Tekton Pipeline](https://tekton.dev/) 从 **安全性**、**可靠性** 和 **可用性** 三个维度对 **Component** 进行评级**Rating** +- 基于[Tekton Pipeline](https://tekton.dev/)实现**ComponentPlan**组件部署前的预先校验**Check** +- 组件仓库**Repository** 中启用 **auth** 和 **OCI** +- 实现与低代码平台集成 diff --git a/core/rating.md b/core/rating.md new file mode 100644 index 000000000..db1a03989 --- /dev/null +++ b/core/rating.md @@ -0,0 +1,44 @@ +--- +sidebar_position: 3 +--- + +# 组件评级 + +待补充 + +## 核心流程(待补充) + +1. 获取组件 + +2. 触发流水线 + +3. 创建`CR Rating` + +4. 获取流水线结果并计算评分 + +## 任务列表 + +:::tip +所有任务权重目前都为`1`,后续需要根据实际的任务重要性赋予不同的权重,并以此获得最终的评分 +::: + +| 评测任务 | 类型 | 描述 | 权重 | 状态 | +| ---------------------------------- | ------ | -------------------------------------- | ---- | ------- | +| **rating-security-rback** | **安全性** | 通过 dryrun 的方式获取完整的组件 RBAC | 1 | 已支持 | +| **rating-security-slsa** | **安全性** | 验证 SLSA 供应链安全等级 | 1 | 已支持 | +| **rating-reliability-linting** | **可靠性** | 通过 `helm lint` 验证组件是否符合规范 | 1 | 已支持 | +| **rating-reliability-testing** | **可靠性** | 通过 `helm testing` | 1 | 研发中 | +| **rating-reliability-deployment-testing** | **可靠性** | 验证部署后的组件,功能和性能是否符合预期 | 1 | 研发中 | +| **rating-availability-sample** | **可用性** | 验证组件包是否包含 ComponentPlan 示例 | 1 | 研发中 | + +### 安全性任务 + +(待补充) + +### 可靠性任务 + +(待补充) + +### 可用性任务 + +(待补充) diff --git a/docs/building-base/_category_.json b/docs/building-base/_category_.json new file mode 100644 index 000000000..dfd84f52c --- /dev/null +++ b/docs/building-base/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "底座服务", + "position": 4, + "link": { + "type": "generated-index", + "description": "提供底座服务,快速开始搭建服务门户" + } +} \ No newline at end of file diff --git a/docs/configuration/3rd-party-account.md b/docs/building-base/configuration/3rd-party-account.md similarity index 100% rename from docs/configuration/3rd-party-account.md rename to docs/building-base/configuration/3rd-party-account.md diff --git a/docs/configuration/_category_.json b/docs/building-base/configuration/_category_.json similarity index 100% rename from docs/configuration/_category_.json rename to docs/building-base/configuration/_category_.json diff --git a/docs/configuration/audit-config.md b/docs/building-base/configuration/audit-config.md similarity index 100% rename from docs/configuration/audit-config.md rename to docs/building-base/configuration/audit-config.md diff --git a/docs/configuration/customize-menu.md b/docs/building-base/configuration/customize-menu.md similarity index 93% rename from docs/configuration/customize-menu.md rename to docs/building-base/configuration/customize-menu.md index b3f379473..bd73bb115 100644 --- a/docs/configuration/customize-menu.md +++ b/docs/building-base/configuration/customize-menu.md @@ -5,6 +5,7 @@ sidebar_position: 2 # 自定义菜单 kubebb 的所有菜单均基于 menu 的 CRD 进行定义,如果需要添加自己的菜单,可以参考以下 memnu 示例: + ```yaml # 主菜单 apiVersion: component.t7d.io/v1beta1 @@ -65,4 +66,4 @@ spec: ``` 使用 `kubectl apply -f` 即可将菜单项部署到环境中,如下图所示: -![图 1](../quick-start/images/4a52ae49bf01baee581357a57038c5792dab1fe153770917e42a5888a7ebebdc.png) +![图 1](./images/4a52ae49bf01baee581357a57038c5792dab1fe153770917e42a5888a7ebebdc.png) diff --git a/docs/configuration/customize-portal.md b/docs/building-base/configuration/customize-portal.md similarity index 100% rename from docs/configuration/customize-portal.md rename to docs/building-base/configuration/customize-portal.md diff --git a/docs/configuration/images/19b4c83b8381c4f6c82d3526ccdbc309014fac7a9f1f502854b9c6251eea03be.png b/docs/building-base/configuration/images/19b4c83b8381c4f6c82d3526ccdbc309014fac7a9f1f502854b9c6251eea03be.png similarity index 100% rename from docs/configuration/images/19b4c83b8381c4f6c82d3526ccdbc309014fac7a9f1f502854b9c6251eea03be.png rename to docs/building-base/configuration/images/19b4c83b8381c4f6c82d3526ccdbc309014fac7a9f1f502854b9c6251eea03be.png diff --git a/docs/quick-start/images/4a52ae49bf01baee581357a57038c5792dab1fe153770917e42a5888a7ebebdc.png b/docs/building-base/configuration/images/4a52ae49bf01baee581357a57038c5792dab1fe153770917e42a5888a7ebebdc.png similarity index 100% rename from docs/quick-start/images/4a52ae49bf01baee581357a57038c5792dab1fe153770917e42a5888a7ebebdc.png rename to docs/building-base/configuration/images/4a52ae49bf01baee581357a57038c5792dab1fe153770917e42a5888a7ebebdc.png diff --git a/docs/configuration/images/73946089d53ccbedf6b6c58cbb6cb8c55e3bd650bc3beede41ea1622211d02bd.png b/docs/building-base/configuration/images/73946089d53ccbedf6b6c58cbb6cb8c55e3bd650bc3beede41ea1622211d02bd.png similarity index 100% rename from docs/configuration/images/73946089d53ccbedf6b6c58cbb6cb8c55e3bd650bc3beede41ea1622211d02bd.png rename to docs/building-base/configuration/images/73946089d53ccbedf6b6c58cbb6cb8c55e3bd650bc3beede41ea1622211d02bd.png diff --git a/docs/configuration/images/7ef885f51a16d83577089c409efafa2583f60d9376d5efc7d03cb7faa4092fbf.png b/docs/building-base/configuration/images/7ef885f51a16d83577089c409efafa2583f60d9376d5efc7d03cb7faa4092fbf.png similarity index 100% rename from docs/configuration/images/7ef885f51a16d83577089c409efafa2583f60d9376d5efc7d03cb7faa4092fbf.png rename to docs/building-base/configuration/images/7ef885f51a16d83577089c409efafa2583f60d9376d5efc7d03cb7faa4092fbf.png diff --git a/docs/configuration/images/94ca51f03578085968c8e1ffd03f27606ed0d473e32d5eb511feff0513e4ff11.png b/docs/building-base/configuration/images/94ca51f03578085968c8e1ffd03f27606ed0d473e32d5eb511feff0513e4ff11.png similarity index 100% rename from docs/configuration/images/94ca51f03578085968c8e1ffd03f27606ed0d473e32d5eb511feff0513e4ff11.png rename to docs/building-base/configuration/images/94ca51f03578085968c8e1ffd03f27606ed0d473e32d5eb511feff0513e4ff11.png diff --git a/docs/configuration/oidc-integration.md b/docs/building-base/configuration/oidc-integration.md similarity index 100% rename from docs/configuration/oidc-integration.md rename to docs/building-base/configuration/oidc-integration.md diff --git a/docs/tech-intro/images/6b8d0cb645caee89c8df55940f5c5b3379940f8714667f8fb2dc780f3442b8f0.png b/docs/building-base/images/6b8d0cb645caee89c8df55940f5c5b3379940f8714667f8fb2dc780f3442b8f0.png similarity index 100% rename from docs/tech-intro/images/6b8d0cb645caee89c8df55940f5c5b3379940f8714667f8fb2dc780f3442b8f0.png rename to docs/building-base/images/6b8d0cb645caee89c8df55940f5c5b3379940f8714667f8fb2dc780f3442b8f0.png diff --git a/docs/tech-intro/tech-arch.md b/docs/building-base/tech-arch.md similarity index 76% rename from docs/tech-intro/tech-arch.md rename to docs/building-base/tech-arch.md index 2e28581fd..07dfe4aaa 100644 --- a/docs/tech-intro/tech-arch.md +++ b/docs/building-base/tech-arch.md @@ -4,28 +4,34 @@ sidebar_position: 1 # 技术架构 ## 相关技术组件 -- Kubernetes 集群 + - `u4a-component` 提供账号、认证、权限及审计管理功能,包含以下主要资料 - - [nginx ingress](https://docs.nginx.com/nginx-ingress-controller/) - - [cert-manager](https://cert-manager.io/) - - [基于 dex 构建](https://github.com/dexidp/dex) - - [多租户基于 capsule 构建](https://github.com/clastix/capsule) - - [oidc-proxy 基于 kube-oidc-proxy 构建](https://github.com/jetstack/kube-oidc-proxy) + - [nginx ingress](https://docs.nginx.com/nginx-ingress-controller/) + - [cert-manager](https://cert-manager.io/) + - [基于 dex 构建](https://github.com/dexidp/dex) + - [多租户基于 capsule 构建](https://github.com/clastix/capsule) + - [oidc-proxy 基于 kube-oidc-proxy 构建](https://github.com/jetstack/kube-oidc-proxy) ## 技术架构 + 平台开发采取前后端分离,以 K8S 为核心的开发框架,遵循 K8S 的扩展机制及 API 规范,整体开发架构的基本逻辑如下图所示: ![图 2](images/6b8d0cb645caee89c8df55940f5c5b3379940f8714667f8fb2dc780f3442b8f0.png) 1. 所有组件的开发、扩展的认证都通过统一认证中心进行认证 2. 认证由微前端的主框架 DockApp 统一进行,其他微前端的扩展不需要单独支持同认证中心的处理 3. 开发架构上整体可以按照三层来看 + - 第一层,前端采用微前端架构,尽量采用低代码方式进行开发,提高代码自动化生成比例 - 第二层,根据业务需求增加 OpenAPI,形成统一的 BFF 层,对 API 进行聚合,提供前端所需要的业务场景数据 - 后端采用 CRD + controller 的 Operator 模式进行开发,形成数据驱动的流程开发模式 + 4. 对外 API 主要包括两部分: + - 从 BFF 层提供的 OpenAPI - 从 K8S 层提供的资源 API # 使用域名访问 + 在代理服务器/负载均衡上,使用 nip.io 来支持 http/https 域名的绑定方式,便于默认统一采用域名进行配置。 -* 使用 nip.io 进行访问 ```http://.nip.io,比如 http://192.168.1.123.nip.io``` + +- 使用 nip.io 进行访问 ```http://.nip.io,比如 http://192.168.1.123.nip.io``` diff --git a/docs/component-market/_category_.json b/docs/component-market/_category_.json deleted file mode 100644 index 3f2779eef..000000000 --- a/docs/component-market/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "组件市场", - "position": 6, - "link": { - "type": "generated-index", - "description": "检索可用的服务组件,加入自己的服务门户" - } -} \ No newline at end of file diff --git a/docs/component-market/blockchain.md b/docs/component-market/blockchain.md deleted file mode 100644 index 4cfec0ef3..000000000 --- a/docs/component-market/blockchain.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 区块链 - 联盟链 - diff --git a/docs/component-market/kubedashboard.md b/docs/component-market/kubedashboard.md deleted file mode 100644 index 8e662732d..000000000 --- a/docs/component-market/kubedashboard.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -sidebar_position: 1 ---- - -# kubedashboard 管理工具 -这里介绍一下如何基于 kubebb 的底座来部署 Kubernetes Dashboard,并使用统一的 OIDC 认证、单点登录及原生 Kubernetes RBAC 认证。 - -* 工具代码地址:[kubernetes dashboard ](https://github.com/kubernetes/dashboard) - -* Prerequisite - - 部署 kubebb 的底座组件 u4a-component,提供基于 K8S 构建的基本的账号、认证、权限和审计功能。 - - 获取部署组件 - ```shell - $ git clone https://github.com/kubebb/addon-components.git - # 进入对应目录 - $ cd kube-dashboard - ``` - -### 安装 Kubernetes dashboard -1. 编辑 values.yaml,按需要替换镜像地址,替换 `.nip.io - -# You must check and update the value of each variable below -kubeOidcProxy: - issuerUrl: # https://portal.172.22.96.209.nip.io/oidc - clientId: - clientSecret: - usernameClaim: preferred_username - groupClaim: groups - hostConfig: - enabled: true - hostAliases: - - hostnames: - # MUST update this value - - portal..nip.io - ip: -``` - -2. 运行 helm 安装插件 -``` -# 如果需要,创建单独的 namespace 来部署此插件,比如 addon-system -kubectl create ns addon-system -# 部署 kube-dashboard 插件 -helm install kube-dashboard -n addon-system . -``` - -* Note: 此时,dashboard 的 pod 会处于 ContainerCreating 的状态,这是因为缺少所依赖的配置文件,接下来我们需要准备此配置文件。 - -3. 创建 kube-dashboard 所需要的 kubeconfig 文件, 以便 kube-dashboard 可以使用统一的 kube-oidc-proxy 进行认证,同时,也需要在配置中使用正确的证书和连接 token 信息 -``` -# copy the kubeconfig template -$ cp sample-kubeconfig kubeconfig -# edit kubeconfig file to use the correct cluster.certificate-authority-data, cluster.server, user.token - -# Step 1 -$ export CLUSTER_CA=$(kubectl get secret -n u4a-system oidc-server-root-secret -o jsonpath='{.data.ca\.crt}') -$ use the value from $CLUSTER_CA to replace cluster.certificate-authority-data() in kubeconfig file - -# Step 2 -$ export USER_TOKEN_NAME=$(kubectl -n addon-system get serviceaccount kubernetes-dashboard -o=jsonpath='{.secrets[0].name}') -$ export USER_TOKEN_VALUE=$(kubectl -n addon-system get secret/${USER_TOKEN_NAME} -o=go-template='{{.data.token}}' | base64 --decode) -# use the value from $USER_TOKEN_VALUE to replace user.token() in kubeconfig file - -# Step 3 replace cluster.server() with the address of kube-oidc-proxy - -# Step 4 create the configmap -$ kubectl create cm dashboard-kubeconfig --from-file=kubeconfig -n addon-system -``` - -4. 重启 kube-dashboard -``` -$ kubectl delete pod -n addon-system $(kubectl get pod -n addon-system | grep kubernetes-dashboard | awk '{print $1}') -``` - -5. 在 OIDC 服务中添加 kube-dashboard 的 callback 地址. -``` -$ kubectl edit cm oidc-server -n u4a-system -# find redirectURIs and add a new redirect url 'https:///oauth/callback' -``` - -6. 使用 `kubedashboard..nip.io` 地址访问 kube-dashboard. 如果处于未登录状态,会被重定向到统一的认证服务进行登录,成功登录后即刻携带授权的 token 回到 kube-dashboard 进行正常使用了。 - -7. 可以通过给登录的用户授权不同的 RBAC 策略,来验证是否只有授权的资源才能被该用户访问。 - -### Uninstall -通过 helm uninstall 来卸载该插件 -``` -helm uninstall kube-dashboard -n addon-system -``` diff --git a/docs/component-market/kubelogin.md b/docs/component-market/kubelogin.md deleted file mode 100644 index 505215943..000000000 --- a/docs/component-market/kubelogin.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 使用 kubelogin 工具 -Here is the steps about how to install kubelogin to integrate with OIDC server for kubectl tool, so you can do authentication with Kubernetes. - -* Refer to [kubelogin](https://github.com/int128/kubelogin) for details. -* Prerequisite -Install u4a-component and it'll provide the account, authentication, authorization and audit funcationality built on Kubernetes. - -### Install kubelogin -Get the binary here [download](https://github.com/int128/kubelogin/releases) and download the one matching your OS. - -Then you need to put the kubelogin binary on your path under the name kubectl-oidc_login so that the kubectl plugin mechanism can find it when you invoke kubectl oidc-login. - -### Prepare kubeconfig file -1. Backup your original config file under ~/.kube/config and create a new one. -``` -$ cd ~/.kube -$ cp config config_backup -$ kubectl config set-credentials oidc \ - --exec-api-version=client.authentication.k8s.io/v1beta1 \ - --exec-command=kubectl \ - --exec-arg=oidc-login \ - --exec-arg=get-token \ - --exec-arg=--oidc-extra-scope=email \ - --exec-arg=--oidc-extra-scope=profile \ - --exec-arg=--oidc-issuer-url=https://portal.172.22.96.209.nip.io/oidc \ - --exec-arg=--oidc-client-id=bff-client \ - --exec-arg=--oidc-client-secret=61324af0-1234-4f61-b110-ef57013267d6 \ - --exec-arg=--insecure-skip-tls-verify -``` - -2. Point the cluster to kube-oidc-server or k8s-apiserver if oidc is enabled. -``` -- cluster: - certificate-authority-data: .... - server: https://172.22.96.133 # Update this value - name: cluster-name -``` - -3. Add `http://localhost:8000` as a valid redirect URL of your OIDC server, so it can redirect to local server after successful login. - -4. Switch current context to oidc -``` -$ kubectl config set-context --current --user=oidc -``` -Run `kubectl get nodes`, kubectl executes kubelogin before calling the Kubernetes APIs. Kubelogin automatically opens the browser, and you can log in to the provider. - -After successful login, you'll get a `Authenticated` response. - -5. If you get `Unable to connect to the server: x509: certificate signed by unknown authority` error after `kubectl get nodes`. Remove certificate-authority-data, and add insecure-skip-tls-verify as true. -``` -- cluster: - # certificate-authority-data: .... - server: https://172.22.96.133 - insecure-skip-tls-verify: true # Add it here - name: cluster-name -``` -You can also use a valid certificate data, for example: -``` -export CLUSTER_CA=$(kubectl get secret -n u4a-system oidc-proxy-cert-tls -o jsonpath='{.data.ca\.crt}') -# Use the data from CLUSTER_CA and set to certificate-authority-data -``` -Then you can run any kubectl using the logged in user, Kubernetes RBAC and audit will take effect for the user. - -### Get id token from cached file -The id_token will be cached in ~/.kube/cache/oidc-login/\, you can use `cat` to get the content and token from this file. For example: -``` -{"id_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6IjBkMzEyM2U1MWIxN2IzZTNlNDYzNjgxZTMzZTFkOTNkM2RiY2IwZDkifQ.eyJpc3MiOiJodHRwczovL3BvcnRhbC4xNzIuMjIuOTYuMjA5Lm5pcC5pby9vaWRjIiwic3ViIjoiQ2dWaFpHMXBiaElHYXpoelkzSmsiLCJhdWQiOiJiZmYtY2xpZW50IiwiZXhwIjoxNjc0MzU3OTU0LCJpYXQiOjE2NzQyNzE1NTQsIm5vbmNlIjoiVHhJVlE4VlFINW9PTGtLeGV1ekk3VWp3VVU0WUYyOEQ1N18xLWVpVWEtVSIsImF0X2hhc2giOiJOamZKZWJ1Ry1uUlVlWDJNY2dfZzVRIiwiY19oYXNoIjoiQWVQdUtsTmN5RjgyTy1xWFFqUzEwdyIsImVtYWlsIjoiYWRtaW5AdGVueGNsb3VkLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJuYW1lIjoiYWRtaW4iLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsInBob25lIjoiIiwidXNlcmlkIjoiYWRtaW4ifQ.YtmRZbS7-B0s0vVh9myH1FYcWuKoKNNYkPZQ5asbrQE2n8eC7w74n8D7pvM6v44kvBnp27hNOeo06EK4leNR2Inb2UJtd2QBS1L9i4A3V_vm06o4DkvqfyNcbD7-hL6ES0XkzIKimG3WMMJIznvuA71W_88t77U7jC7wvtKbT7k1KZWgOV6VappWlz7uecuBSQahoCku5AO-s25H1O-FbodOYtL8-ju0sqiHrgmbNaV-f6Wuvvk9XkquAe_dztqWCJ0axfUW7u4J-M947mlR1JlWwbhm-nQXgvugyMVh3FjFOjwi7jR3BA3Me-iuS_XPNSWx-DB0dfsCfErCJ9DvBA"} -``` - -### Get id token using username/password -1. Enable passwordConnector in the oidc-server configuration -``` -# kubectl edit cm oidc-server -n u4a-system - oauth2: - # Enable this one - passwordConnector: k8scrd - skipApprovalScreen: true -``` -2. Get id token using kubelogin or curl - -* kubelogin -``` -kubelogin get-token --oidc-issuer-url=https://portal.172.22.96.209.nip.io/oidc --oidc-client-id=bff-client --oidc-client-secret=61324af0-1234-4f61-b110-ef57013267d6 --insecure-skip-tls-verify --grant-type=password --username=admin --password=admiN\$123 - -# here is the response, get the token from the json -{"kind":"ExecCredential","apiVersion":"client.authentication.k8s.io/v1beta1","spec":{"interactive":false},"status":{"expirationTimestamp":"2023-02-11T04:37:32Z","token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImY2ZjFjMjFkNzFhOGEyYmU3ZTg2YjQyYWIwOTYwY2MxNzU3NjdiM2MifQ.eyJpc3MiOiJodHRwczovL3BvcnRhbC4xNzIuMjIuOTYuMjA5Lm5pcC5pby9vaWRjIiwic3ViIjoiQ2dWaFpHMXBiaElHYXpoelkzSmsiLCJhdWQiOiJiZmYtY2xpZW50IiwiZXhwIjoxNjc2MDkwMjUyLCJpYXQiOjE2NzYwMDM4NTIsImF0X2hhc2giOiJyLWtsUnBQcEd3U0I5TFQyelVQSWtRIiwicGhvbmUiOiIifQ.tFOmGN1w79I_s5pWZZK4zEEHwCyuJRwkNtacmxVcCY-Jms-JOzXUJTxnNm8XzIBC3cZqt5U6oNXMuk68MHq0v3g2tQKJeAwV1aojJrIIp5QHefXMUjl_hTaFe1tRgwsvZqBWhExLi1yaTSUfjmP_SZEb23A0R_AWvc7ClO7sbuKQlkPG_gi2TPCBOeTx0UmlQ14w6U3dIJhR57hXfttdSr2nRqKma8bp_jAiUiWaKLSWSyc3tQsxWl7LeAAbRM3URx-3winVIEPEpUgwIBXnrr-ba9BZwZoD5NGytOGw4xA80eGDmmMIG8U2QarJKsZErpzS7EWbiPBLgS2_Wg1eBA"}} -``` -* curl -``` -curl -k -XPOST https://portal.172.22.96.209.nip.io/oidc/token -H "Authorization: Basic " -H "Content-Type: application/x-www-form-urlencoded" --data 'grant_type=password&password=password&scope=openid&username=username' - -# here is the response, and get id_token from the json -{"access_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImY2ZjFjMjFkNzFhOGEyYmU3ZTg2YjQyYWIwOTYwY2MxNzU3NjdiM2MifQ.eyJpc3MiOiJodHRwczovL3BvcnRhbC4xNzIuMjIuOTYuMjA5Lm5pcC5pby9vaWRjIiwic3ViIjoiQ2dWaFpHMXBiaElHYXpoelkzSmsiLCJhdWQiOiJiZmYtY2xpZW50IiwiZXhwIjoxNjc2MDkyOTk0LCJpYXQiOjE2NzYwMDY1OTQsImF0X2hhc2giOiJtM2xsQWprUXdlQnhJbUJlQkgxRG1RIiwicGhvbmUiOiIifQ.iel5l_mzlVf2LjbMqzqXb3sqb7L195a-fY4Aaon2_CVn1lBMzOf2qDYbtVF3KhGHxNlaKRxig63uCDfyts84BMD5-Uaz_x4_mq5QaMVYVYEUw9NWsLP-jQ0bTSZE7MZKlxz_a3AGW_fXwW0Y02dqemugBfC3IagBhroYI2PSTKcNCCQz2aao-ZSQ5-rysKSyo0VPDtcY_K8ikpDChLM9GhUKzbdIvctO6mGBOOKHRkiCAbRegOCFhJ6-0O4k6b-m3rXyJkQAIBfesOPIAFxhQQhg3y9wDEVxbBTZ99fwfvfIuSxN_vsITKCsqpRr7t-30jqReIKsYktyzZ15jiJhKg","token_type":"bearer","expires_in":86399,"id_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImY2ZjFjMjFkNzFhOGEyYmU3ZTg2YjQyYWIwOTYwY2MxNzU3NjdiM2MifQ.eyJpc3MiOiJodHRwczovL3BvcnRhbC4xNzIuMjIuOTYuMjA5Lm5pcC5pby9vaWRjIiwic3ViIjoiQ2dWaFpHMXBiaElHYXpoelkzSmsiLCJhdWQiOiJiZmYtY2xpZW50IiwiZXhwIjoxNjc2MDkyOTk0LCJpYXQiOjE2NzYwMDY1OTQsImF0X2hhc2giOiJRT3NNWGdSeDRYaUJJTVZwSElXeUlRIiwicGhvbmUiOiIifQ.ZDU7AouftfpLAs2SDE3Kb86ggVyDEwrgA3jtUxitKUQwKqosjWiaEEGc3w824FAC3eDZhFr1w5uXT6R30O2s0DPzPb0nesDN8wa2ZscU9ESjZrKAAgpgM7uE1vU41mi7GfdZEUHabx83XFvu69KvmA9OKnqaSdyi3-aPYHyBP5GfNYoQ-mteCBsAbRF8l6fe1VREIYV3sQrBC8b9s1Ony4F8YFWgFE4G_1gxV-0qz8IxgzhLGUgehuwsHTUjMLvyGgTiFrFvrPsftEuEGtOQbKswngWQGlYWSsUIWb79Fdk_-wD08fyM9YUGJyb0Bg_HO2M95CFsSASB4HDO4QHOXw"} -``` - -### Logout -You can remove the local cache files under `~/.kube/cache/oidc-login/` to logout current user. diff --git a/docs/component-market/logging.md b/docs/component-market/logging.md deleted file mode 100644 index c5ab16a6e..000000000 --- a/docs/component-market/logging.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 日志组件 - diff --git a/docs/component-market/monitoring.md b/docs/component-market/monitoring.md deleted file mode 100644 index e5664d41b..000000000 --- a/docs/component-market/monitoring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -sidebar_position: 3 ---- - -# 监控组件 \ No newline at end of file diff --git a/docs/contribute.md b/docs/contribute_guidelines.md similarity index 100% rename from docs/contribute.md rename to docs/contribute_guidelines.md diff --git a/docs/development/low-code-engine.md b/docs/development/low-code-engine.md deleted file mode 100644 index b7428aebb..000000000 --- a/docs/development/low-code-engine.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 前端基于低代码引擎的开发 -本章节对 Kubebb 的低代码引擎进行详细介绍 diff --git a/docs/intro.md b/docs/intro.md index a40006865..9a3df7de8 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -2,6 +2,4 @@ sidebar_position: 1 --- -# 教程介绍 - -通过本教程,可以快速搭建一个基于 Kubebb 的门户底座,并开发一个自己的 Hello world 组件,部署到门户上进行体验,对如何基于 Kubebb 来快速开发和扩展组件有个基本的理解,并熟悉一些自定义的个性配置。 +# 介绍 diff --git a/docs/lowcode-development/_category_.json b/docs/lowcode-development/_category_.json new file mode 100644 index 000000000..d5eb5fbf2 --- /dev/null +++ b/docs/lowcode-development/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "低代码开发平台", + "position": 5, + "link": { + "type": "generated-index", + "description": "基于 Kubebb 开发自己服务组件,并添加到服务门户" + } +} \ No newline at end of file diff --git a/docs/development/components.md b/docs/lowcode-development/components.md similarity index 82% rename from docs/development/components.md rename to docs/lowcode-development/components.md index 852e3f972..c13712650 100644 --- a/docs/development/components.md +++ b/docs/lowcode-development/components.md @@ -2,5 +2,6 @@ sidebar_position: 1 --- -# 组件的组成 +# 组件定义 + 本章节对 Kubebb 的组件概念进行详细介绍 diff --git a/docs/development/_category_.json b/docs/lowcode-development/development/_category_.json similarity index 90% rename from docs/development/_category_.json rename to docs/lowcode-development/development/_category_.json index 38ea4397a..0d4978777 100644 --- a/docs/development/_category_.json +++ b/docs/lowcode-development/development/_category_.json @@ -1,6 +1,6 @@ { "label": "组件开发", - "position": 4, + "position": 5, "link": { "type": "generated-index", "description": "基于 Kubebb 开发自己服务组件,并添加到服务门户" diff --git a/docs/development/operator-dev.md b/docs/lowcode-development/development/backend-operator.md similarity index 89% rename from docs/development/operator-dev.md rename to docs/lowcode-development/development/backend-operator.md index 3caee84ce..eb298a537 100644 --- a/docs/development/operator-dev.md +++ b/docs/lowcode-development/development/backend-operator.md @@ -1,6 +1,7 @@ --- -sidebar_position: 2 +sidebar_position: 3 --- # 开发后端服务组件 + 本章节对 Kubebb 的后端服务开发标准进行详细介绍,主要是基于 Controller + CRD 的 K8S Operator 的开发模式。 diff --git a/docs/development/bff-graphql.md b/docs/lowcode-development/development/bff-apis.md similarity index 73% rename from docs/development/bff-graphql.md rename to docs/lowcode-development/development/bff-apis.md index 11841aea8..19e6061e9 100644 --- a/docs/development/bff-graphql.md +++ b/docs/lowcode-development/development/bff-apis.md @@ -1,6 +1,7 @@ --- -sidebar_position: 3 +sidebar_position: 2 --- -# BFF 层 API 开发 +# BFF层API开发 + 本章节对 Kubebb 的 BFF 层进行详细介绍,包括如何使用 GraphQL 快速开发 BFF 层的 API diff --git a/docs/development/develop-hello-world.md b/docs/lowcode-development/development/develop-hello-world.md similarity index 82% rename from docs/development/develop-hello-world.md rename to docs/lowcode-development/development/develop-hello-world.md index 8bf1b01e5..db623852d 100644 --- a/docs/development/develop-hello-world.md +++ b/docs/lowcode-development/development/develop-hello-world.md @@ -1,6 +1,7 @@ --- -sidebar_position: 6 +sidebar_position: 4 --- # 发布一个 Hello World 组件 + 本章节对 Kubebb 的组件概念进行详细介绍 diff --git a/docs/lowcode-development/development/frontend.md b/docs/lowcode-development/development/frontend.md new file mode 100644 index 000000000..e85ab49b8 --- /dev/null +++ b/docs/lowcode-development/development/frontend.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 1 +--- + +# 前端开发 + +基于低代码引擎进行前端页面开发 diff --git a/docs/quick-start/_category_.json b/docs/quick-start/_category_.json index de9406cf2..bc595a7f6 100644 --- a/docs/quick-start/_category_.json +++ b/docs/quick-start/_category_.json @@ -1,8 +1,8 @@ { "label": "快速开始", - "position": 1, + "position": 2, "link": { "type": "generated-index", - "description": "10 分钟快速体验服务门户的使用" + "description": "5 分钟快速体验服务门户的使用" } -} +} \ No newline at end of file diff --git a/docs/quick-start/buildingbase_customization.md b/docs/quick-start/buildingbase_customization.md deleted file mode 100644 index 7ad64a929..000000000 --- a/docs/quick-start/buildingbase_customization.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -sidebar_position: 4 ---- - -# 体验自定义配置 - -:::tip -安装前需完成[安装底座组件](./buildingbase_quickstart)。 -::: - -1. 自定义门户的主色调 - -```shell -kubectl edit cm portal-global-configs -n u4a-system -``` - -修改 primaryColor 即可自定义门户主色调 - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: portal-global-configs -data: - global-configs: | - {"theme": {"primaryColor": "#FE8F35"}} -``` - -2. 自定义菜单 - -kubebb 的所有菜单均基于 menu 的 CRD 进行定义,如果需要添加自己的菜单,可以参考以下 memnu 示例: - -```yaml -# 主菜单 -apiVersion: component.t7d.io/v1beta1 -kind: Menu -metadata: - name: demo-menu -spec: - column: 1 - isRenderSelectCurrent: false - parentOwnerReferences: - apiVersion: "" - kind: "" - name: "" - uid: "" - rankingInColumn: 100 - tenant: true - text: 测试菜单 - textEn: "Test Menu" ---- -# 测试菜单索引菜单 -apiVersion: component.t7d.io/v1beta1 -kind: Menu -metadata: - name: demo-menu-index -spec: - getTitleForReplaceSider: {} - parentOwnerReferences: - apiVersion: component.t7d.io/v1beta1 - blockOwnerDeletion: false - controller: false - kind: Menu - name: demo-menu - uid: "" - rankingInColumn: 100 - tenant: true - text: 菜单索引项 - textEn: “Menu Index Item" ---- -# 子菜单,具备实际链接功能 -apiVersion: component.t7d.io/v1beta1 -kind: Menu -metadata: - name: demo-menu-submenu1 -spec: - getTitleForReplaceSider: {} - isRenderSelectCurrent: false - parentOwnerReferences: - apiVersion: component.t7d.io/v1beta1 - blockOwnerDeletion: false - controller: false - kind: Menu - name: demo-menu-index - uid: "" - pathname: /demo-feature1 - rankingInColumn: 200 - text: 测试子菜单 - textEn: "Test Submenu" -``` - -使用 `kubectl apply -f` 即可将菜单项部署到环境中,如下图所示: -![图 1](images/4a52ae49bf01baee581357a57038c5792dab1fe153770917e42a5888a7ebebdc.png) - -* 详细介绍参考 [自定义菜单](../configuration/customize-menu.md) - -3. 多语言 & 白天/黑夜模式 - -1)通过右上角的语言切换按钮进行多语言切换,目前支持中文、英文两种语言 - -2)通过右上角的按钮切换白天/黑夜模式 diff --git a/docs/quick-start/buildingbase_quickstart.md b/docs/quick-start/buildingbase_quickstart.md index 46966219f..f419c723d 100644 --- a/docs/quick-start/buildingbase_quickstart.md +++ b/docs/quick-start/buildingbase_quickstart.md @@ -2,23 +2,21 @@ sidebar_position: 3 --- -# 部署底座组件 +# 安装底座 本章节主要介绍底座组件的部署步骤,包括相关的开源技术组件、前提条件以及快速部署,并将部署的集群添加到服务门户上。 -## 通过内核部署(推荐) - :::tip 安装前需完成[安装内核](./core_quickstart)。 ::: -### 部署 +## 部署 -#### 1. 创建官方组件仓库 +### 1. 创建官方组件仓库 > 可参考[使用官方组件仓库](./core_quickstart#%E4%BD%BF%E7%94%A8%E5%AE%98%E6%96%B9%E7%BB%84%E4%BB%B6%E4%BB%93%E5%BA%93) -#### 2. 创建底座组件空间 +### 2. 创建底座组件空间 :::tip 目前仅支持使用命名空间`u4a-system` @@ -28,7 +26,7 @@ sidebar_position: 3 kubectl create namespace u4a-system ``` -#### 3. 部署`Cluster Component` +### 3. 部署Cluster Component 组件部署信息`cluster_componentplan.yaml`如下: @@ -89,7 +87,7 @@ status: type: Succeeded ``` -#### 4. 部署`U4A Component` +### 4. 部署U4A Component 组件部署信息`u4a_componentplan.yaml`如下: @@ -128,7 +126,7 @@ spec: kubectl get componentplan -nu4a-system u4a-component -oyaml ``` -#### 5. 访问底座服务门户 +### 5. 访问底座服务门户 通过以下命令获取门户服务的访问地址: @@ -147,123 +145,16 @@ kube-oidc-proxy-server-ingress k8s.172.18.0.2.nip.io 8 > 注意: 由于使用了[nip.io](https://nip.io/)作为域名解析服务,因此需要将`HOSTS`中的域名解析到`ADDRESS`对应的IP地址上。 -### 卸载 +## 卸载 -#### 1. 卸载`U4A Component` +### 1. 卸载U4A Component ```shell kubectl delete componentplan -nu4a-system u4a-component ``` -#### 2. 卸载`Cluster Component` +### 2. 卸载Cluster Component ```shell kubectl delete componentplan -nu4a-system cluster-component ``` - -## 通过Helm部署 - -### 部署 - -首先,需要部署 u4a-component 组件,负责提供基于 Kubernetes 的账号、认证、权限和审计的功能。并且,基于该组件底座,可以按照后面的步骤添加更多的功能组件。 - -> **注意** -> 以下步骤将部署一个 ingress nginx controller,ingressclass 名字为 'portal-ingress',同时,部署 cert-manager 用来进行证书管理. - -本步骤完成后,会部署以下服务: - -- 证书管理:cert-manager -- 负载均衡:ingress-nginx -- 多租户管理:capsule -- 在没有开启 OIDC 的 Kubernetes 集群上提供 OIDC 代理:kube-oidc-proxy -- 提供 OIDC 及 IAM 服务:oidc-server -- 资源聚合服务,为对多个资源提供统一的视图资源:resource-view-controller - -获取本项目的源代码后,进入 u4a-component 目录,并按照以下步骤部署: - -1. 创建 namespace `u4a-namespace` - -``` shell -kubectl create ns u4a-system -``` - -2. 编辑 u4a-component/values.yaml(helm的配置文件) 来替换以下占位符: - -- ``, 替换为 ingress nginx 所部署节点的 IP - -- 如果使用自己的镜像仓库,注意更新 registryServer 及其他镜像地址 - -3. 编辑 `charts/cluster-component/values.yaml` 文件,替换`` 为 ingress nginx 所部署节点的名称 - - ```yaml - ingress-nginx: - # MUST update this value - deployedHost: &deployedHost - - ``` - -2. 使用 helm 安装 u4a-component - - ``` - # 部署组件 - # 1. 部署 cluster-component - $ helm install --wait -n u4a-system cluster-component -f charts/cluster-component/values.yaml charts/cluster-component - # 等待所有的 pod 正常运行,默认 ingress-nginx 会对外暴露 80,443 端口 - - # 2. 部署 u4a-component - $ helm install --wait -n u4a-system u4a-component . - # 等待所有的 pod 正常运行 - $ kubectl get pod -n u4a-system - NAME READY STATUS RESTARTS AGE - bff-server-6c9b4b97f5-gqrx6 1/1 Running 0 45m - capsule-controller-manager-6cf656b98c-sjm5n 1/1 Running 0 66m - cert-manager-756fd78bff-wb2vh 1/1 Running 0 76m - cert-manager-cainjector-64685f8d48-qg69v 1/1 Running 0 76m - cert-manager-webhook-5c46d68c6b-f4dkh 1/1 Running 0 76m - cluster-component-ingress-nginx-controller-5bd67897dd-5m9n7 1/1 Running 0 76m - kube-oidc-proxy-5f4598c77c-fzl5q 1/1 Running 0 65m - oidc-server-85db495594-k6pkt 2/2 Running 0 65m - resource-view-controller-76d8c79cf-smkj5 1/1 Running 0 66m - ``` - -3. 在安装成功结束后,控制台会有以下提示: - - ``` - NOTES: - 1. Get the ServiceAccount token by running these commands: - - export TOKENNAME=$(kubectl get serviceaccount/host-cluster-reader -n u4a-system -o jsonpath='{.secrets[0].name}') - kubectl get secret $TOKENNAME -n u4a-system -o jsonpath='{.data.token}' | base64 -d - ``` - - 按照提示的步骤,保存 token,会在后面添加集群的步骤中使用。 - -6. 此时,可以在浏览器中打开在第 2 步中配置的 ingress 地址: - - `https://portal..nip.io` - -- 注意:如果由于环境不支持自动解析 nip.io, 可以手动将域名和 ip 的映射添加到本地的 hosts 文件中. 使用默认的 admin/kubebb-admin 用户信息登录,登录后控制台如下图所示: - -![图 2](images/5e2e1023efba5f947965f4e079471928781ee74cff236bb0872267d111237626.png) - -7. 环境准备,创建集群管理的 namespace,目前必须使用 'cluster-system'. - - ``` - kubectl create ns cluster-system - ``` - -8. 在管理平台添加当前集群. 访问“管理控制台”,'集群管理',点击 '添加集群'。 - -- API Host, 使用安装时配置的 `hostK8sApiWithOidc` 值 - -- API Token, 使用步骤 4 中保存的 token . - -现在通过服务门户,已经将当前的部署集群进行了纳管;同时,在“租户管理”中,会有一个默认的系统租户,名称为'system-tenant'. - -### 卸载 - - ``` - helm uninstall cluster-comoponent -n u4a-system - helm uninstall u4a-component -n u4a-system - kubectl delete ns u4a-system - ``` diff --git a/docs/tech-intro/_category_.json b/docs/tech-intro/_category_.json deleted file mode 100644 index 5d5db4ccb..000000000 --- a/docs/tech-intro/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "技术总览", - "position": 2, - "link": { - "type": "generated-index", - "description": "Kubebb 相关的技术知识及架构介绍" - } -} diff --git a/docs/tech-intro/micro-services.md b/docs/tech-intro/micro-services.md deleted file mode 100644 index bdb0ea90a..000000000 --- a/docs/tech-intro/micro-services.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -sidebar_position: 2 ---- - -# 服务组件 -服务组件介绍 \ No newline at end of file diff --git a/docusaurus.config.dev.js b/docusaurus.config.dev.js index 95e0d0b4d..9432da247 100644 --- a/docusaurus.config.dev.js +++ b/docusaurus.config.dev.js @@ -72,7 +72,7 @@ const config = { type: 'doc', docId: 'intro', position: 'left', - label: '教程', + label: '文档', }, /*{to: '/blog', label: 'Blog', position: 'left'},*/ { @@ -113,10 +113,6 @@ const config = { { title: '文档', items: [ - { - label: '教程', - to: '/docs/intro', - }, { label: '内核', to: '/docs/category/内核', diff --git a/docusaurus.config.js b/docusaurus.config.js index d20241a34..d61841fff 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -72,7 +72,7 @@ const config = { type: 'doc', docId: 'intro', position: 'left', - label: '教程', + label: '文档', }, /*{to: '/blog', label: 'Blog', position: 'left'},*/ { @@ -80,7 +80,7 @@ const config = { position: 'right', }, { - href: 'https://github.com/kubebb/building-base', + href: 'https://github.com/kubebb/', label: 'GitHub', position: 'right', }, @@ -90,49 +90,54 @@ const config = { style: 'dark', links: [ { - title: '相关技术', + title: '快速开始', items: [ { - label: '认证 OIDC - dex', - href: 'https://github.com/dexidp/dex', + label: '预先准备', + to: '/docs/quick-start/prerequisite', }, { - label: '租户管理 - capsule', - href: 'https://github.com/clastix/capsule', + label: '安装内核', + to: '/docs/quick-start/core_quickstart', }, { - label: '权限管理 - K8S RBAC', - href: 'https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/', + label: '安装底座', + to: '/docs/quick-start/buildingbase_quickstart', }, - { - label: '审计操作 - K8S Audit', - href: 'https://kubernetes.io/zh-cn/docs/tasks/debug/debug-cluster/audit/', - }, ], }, { - title: '文档', + title: '内核', items: [ { - label: '教程', - to: '/docs/intro', + label: '概念', + to: '/docs/category/概念', + }, + { + label: '组件评级', + to: '/docs/core/rating', }, + ], + }, + { + title: '底座服务', + items: [ { - label: '内核', - to: '/docs/category/内核', + label: '技术架构', + to: '/docs/building-base/tech-arch', }, ], }, { - title: '代码', + title: '低代码开发平台', items: [ { - label: '基础底座', - href: 'https://github.com/kubebb/building-base', + label: '组件定义', + to: '/docs/lowcode-development/components', }, { - label: '示例组件', - href: 'https://github.com/kubebb/addon-components', + label: '组件开发', + to: '/docs/category/组件开发', }, ], }, diff --git a/src/components/HomepageFeatures/index.js b/src/components/HomepageFeatures/index.js index 4fc2e558c..5bcd06d0c 100644 --- a/src/components/HomepageFeatures/index.js +++ b/src/components/HomepageFeatures/index.js @@ -8,31 +8,31 @@ const FeatureList = [ Svg: require('@site/static/img/buidling-block.svg').default, description: ( <> - 基于 Kubernetes 提供了账号、认证(OIDC)、权限(RBAC)、审计(Audit)的基础功能,采用更加标准的技术方式提供构建的底座服务 + 提供账号、认证(OIDC)、权限(RBAC)、审计(Audit)的基础功能,采用更加标准的技术方式提供构建的底座服务 ), }, { - title: '可扩展的组件管理模式', - Svg: require('@site/static/img/component-arch.svg').default, + title: '开放、共享的组件市场生态', + Svg: require('@site/static/img/open-market.svg').default, description: ( <> - 基于微前端框架、低代码开发,定义了标准的组件封装及发布模式,让开发者可以在底座之上按照开发规范进行组件的快速开发及部署,并在统一的服务门户上对外提供服务 + 基于 Kubebb 构建的组件均可通过开放的市场进行共享,并可以下载并部署在自己的服务门户上,让用户选择适合自己的组件进行服务的管理 ), }, { - title: '开放、共享的组件市场生态', - Svg: require('@site/static/img/open-market.svg').default, + title: '灵活的组件开发模式', + Svg: require('@site/static/img/component-arch.svg').default, description: ( <> - 基于 Kubebb 构建的组件均可通过开放的市场进行共享,并可以下载并部署在自己的服务门户上,让用户选择适合自己的组件进行服务的管理 + 基于微前端框架和低代码开发,定义了标准的组件封装及发布模式,让开发者可以在底座之上按照开发规范进行组件的快速开发和发布,并在统一的服务门户上对外提供服务 ), }, ]; -function Feature({Svg, title, description}) { +function Feature({ Svg, title, description }) { return (
diff --git a/src/pages/index.js b/src/pages/index.js index 3734a292d..37a46160c 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -8,7 +8,7 @@ import HomepageFeatures from '@site/src/components/HomepageFeatures'; import styles from './index.module.css'; function HomepageHeader() { - const {siteConfig} = useDocusaurusContext(); + const { siteConfig } = useDocusaurusContext(); return (
@@ -17,7 +17,7 @@ function HomepageHeader() {
+ to="/docs/quick-start/prerequisite"> 教程 - 5min ⏱️
@@ -27,7 +27,7 @@ function HomepageHeader() { } export default function Home() { - const {siteConfig} = useDocusaurusContext(); + const { siteConfig } = useDocusaurusContext(); return (