CCE密钥管理(对接DEW)插件
插件简介
CCE密钥管理(对接DEW)插件用于对接数据加密服务(Data Encryption Workshop, DEW)。该插件允许用户将存储在集群外部(即专门存储敏感信息的数据加密服务)的凭据挂载至业务Pod内,从而将敏感信息与集群环境解耦,有效避免程序硬编码或明文配置等问题导致的敏感信息泄密。安装该插件后,您可以使用以下能力:
- 基础挂载能力:通过CCE密钥管理(对接DEW)插件,可以将DEW中相关的凭据信息挂载至业务Pod中,从而减少信息泄露的风险。
- 定时轮转能力:当Pod正常运行后,若其在SPC中声明的、存储在云凭据管理服务中的凭据发生了更新,通过定时轮转,可以将最新的凭据值刷新至Pod内。使用该能力时,需要将凭据的版本指定为”latest”。
- 实时感知SPC变化能力:当Pod正常运行后,若用户修改了在SPC中声明的凭据信息(如新增凭据、改变原有凭据的版本号等),插件可实时感知该变化,并将更新后的凭据刷新至Pod内。
约束与限制
- 数据加密服务包含密钥管理(Key Management Service, KMS)、云凭据管理(Cloud Secret Management Service,CSMS)和密钥对管理(Key Pair Service, KPS)等服务。当前,该插件仅支持对接其中的云凭据管理服务。
- 安装CCE密钥管理(对接DEW)插件,要求集群版本要求在1.28.8-r0、1.31.4-r0及以上。如果您的集群版本不符合该要求,则需要通过集群升级使用该功能。
- 安装CCE密钥管理(对接DEW)插件,需要提前配置访问DEW服务的VPC终端节点,具体操作请参见配置访问DEW服务的VPC终端节点。
- CCE密钥管理(对接DEW)插件允许创建的SecretProviderClass对象个数上限为500个。
- 插件卸载时,会同时删除相关的CRD资源。即使重装插件,原有的SecretProviderClass对象也不可用,请谨慎操作。插件卸载再重装后,若需使用原有的SecretProviderClass资源,需重新手动创建。
计费说明
操作阶段↵ |
计费项 |
计费说明↵ |
相关文档↵ |
---|---|---|---|
安装插件 |
不计费 |
安装CCE密钥管理(对接DEW)插件时,暂不部署插件相关Pod实例,因此安装插件时不涉及费用。 |
- |
使用插件 |
Pod费用 |
在业务Pod中挂载DEW密钥卷时,系统会自动以DaemonSet形式部署插件Pod实例,每个业务Pod对应一组插件Pod实例。插件Pod实例的具体规格,请参见表1。 当集群内某业务Pod不再挂载DEW密钥卷时,相关插件Pod实例会自动销毁,停止计费的时间与业务Pod停止使用时间一致。若重新挂载DEW密钥卷,插件Pod实例将自动重建。 |
关于Pod费用的详细说明,请参见CCE Autopilot集群计费项。↵ |
安装插件
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧左侧导航栏中,单击“集群 > 插件中心”,在右侧找到CCE密钥管理(对接DEW)插件,单击“安装”。
- 在“安装插件”页面,在“参数配置栏”配置“凭据同步周期”,具体说明如下:
配置项
参数
参数说明
凭据同步周期
rotation_poll_interval
表示轮转时间间隔,单位为分钟,即m(注意不是min)。
轮转时间间隔表示向云凭据管理服务发起请求并获取最新的凭据的周期,合理的时间间隔范围为[1m, 1440m],默认值为2m。
- 配置无误后,在右下角单击“安装”。当插件状态变为运行中时,则说明插件安装成功。
组件说明
容器组件 |
说明 |
资源类型 |
资源规格(单Pod实例) |
---|---|---|---|
dew-provider |
dew-provider负责与云凭据管理服务交互,从云凭据管理服务中获取指定的凭据,并挂载到业务Pod内。 |
DaemonSet |
|
csi-secrets-store |
csi-secrets-store负责维护两个CRD资源,即SecretProviderClass(以下简称为SPC)和SecretProviderClassPodStatus(以下简称为spcPodStatus),其中SPC用于描述用户需要的凭据信息(比如指定凭据的版本、凭据的名称等),由用户创建,并在业务Pod中进行引用;spcPodStatus用于跟踪Pod与凭据的绑定关系,由csi-driver自动创建,用户无需关心。一个Pod对应一个spcPodStatus,当Pod正常启动后,会生成一个与之对应的spcPodStatus;当Pod生命周期结束时,相应的spcPodStatus也会被删除。 |
DaemonSet |
|
基础挂载
将DEW中的凭据信息挂载至容器中,需要完成3个步骤。首先,创建ServiceAccount,作为集群访问DEW的凭证;其次,创建SecretProviderClass,用于定义和获取DEW中的凭据信息;最后,将ServiceAccount和SecretProviderClass挂载到业务Pod中,确保Pod能够安全访问相关凭据。目前,支持两种挂载方式:
- 使用Volume挂载凭据:适合大规模数据的挂载,以卷的形式将凭据挂载到容器中。
- 使用密钥挂载凭据:适合小型的敏感数据,支持以环境变量的形式挂载至容器中。
以下内容将分别介绍两种方式的具体使用流程。
- 创建ServiceAccount,用于声明允许业务Pod使用的DEW凭据名称。进行该步骤之前,请确保DEW的凭据管理服务中已存在相应凭据。如果凭据未创建,则向凭据管理服务中获取相应凭据时会出错,从而导致Pod无法正常运行。如果需要在DEW的凭据管理服务中创建相关凭据,请参见创建凭据。
图1 DEW凭据列表
- 执行以下命令,创建ServiceAccount对象的YAML文件。
vim serviceaccount.yaml
文件内容如下,可以在cce.io/dew-resource字段中声明允许业务使用的凭据名称。如secret_1和secret_2,后续将允许在业务Pod中引用这两个凭据对象。若用户引用未在此处声明的凭据,则会挂载失败,从而导致Pod无法运行。
apiVersion: v1 kind: ServiceAccount metadata: name: nginx-spc-sa annotations: cce.io/dew-resource: "[\"secret_1\",\"secret_2\"]" #secrets that allow pod to use
- 执行以下命令,创建ServiceAccount对象。
kubectl apply -f serviceaccount.yaml
回显结果如下:
serviceaccount/nginx-spc-sa created
- 执行以下命令,查看ServiceAccount对象是否已经正常创建。
kubectl get sa
回显结果如下,则说明名为“nginx-spc-sa”的ServiceAccount对象已正常创建,该对象将在后续的业务Pod中被引用。
NAME SECRETS AGE default 1 18d # 此为系统默认的ServiceAccount对象 nginx-spc-sa 1 19s # 此为刚刚创建的ServiceAccount对象
- 执行以下命令,创建ServiceAccount对象的YAML文件。
- 创建SecretProviderClass,用于定义和管理来自DEW的凭据信息,以便凭据可以被CCE集群中的Pod安全地挂载。
- 执行以下命令,创建SecretProviderClass对象的YAML文件。
vim secretproviderclass.yaml
文件内容如下,主要关注parameters.objects字段,该字段以数组的形式声明您需要挂载的凭据信息。
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: spc-test spec: provider: cce # 固定为cce parameters: objects: | - objectName: "secret_1" objectAlias: "secret_test" objectVersion: "v1" objectType: "csms"
表2 objects参数说明 参数
参数类型
是否必选
参数说明
objectName
String
是
表示凭据名称,需填写ServiceAccount中引用的凭据。若同一个SecretProviderClass中定义了多个objectName,不允许重名,否则会挂载失败。
objectAlias
String
否
表示凭据写入到容器内的文件名称。
- 若不指定,则凭据写入到容器内的文件名默认为objectName;
- 若指定,则objectAlias与其他凭据的objectName和objectAlias均不允许重名,与自身的objectName也不允许重名,否则会挂载失败。
objectType
String
是
表示凭据类型。当前仅支持“csms”类型,其他均为非法输入。
objectVersion
String
是
表示凭据的版本。
- 指定某个具体的版本:v1,v2,…
- 指定最新版本:latest。当指定objectVersion为” latest”时,若在云凭据管理服务侧对应的凭据发生了更新,更新后的凭据值将在经过一定时间间隔后(即rotation_poll_interval)刷新至Pod内,即自动开启定时轮转能力。
- 执行以下命令,创建SecretProviderClass对象。
kubectl apply -f secretproviderclass.yaml
回显结果如下:
secretproviderclass/spc-test created
- 执行以下命令,查看SecretProviderClass对象是否已经正常创建。
kubectl get spc
回显结果如下,则说明一个名为“spc-test”的SecretProviderClass对象已正常创建,该对象将在后续的业务Pod中被引用。
NAME AGE spc-test 20h
- 执行以下命令,创建SecretProviderClass对象的YAML文件。
- 创建业务Pod,这里以创建一个nginx应用为例。
- 定义业务负载,在serviceAccountName中引用此前创建好的ServiceAccount对象,secretProviderClass中引用此前创建好的SPC对象,并在mountPath中指定容器内的挂载路径(这里需注意,用户不应该指定”/”,” /var/run”等特殊目录,否则可能影响容器的正常启动)。
vim deployment.yaml
文件内容如下:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-spc labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: serviceAccountName: nginx-spc-sa # 引用上面创建的ServiceAccount,作为访问凭据的身份认证 volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io # 指定Secrets Store CSI驱动,为固定值 readOnly: true # 将卷设置为只读,确保凭据不会被修改 volumeAttributes: secretProviderClass: "spc-test" # 引用上面创建的SPC containers: - name: nginx-spc image: nginx:alpine imagePullPolicy: IfNotPresent volumeMounts: # 将上方定义的volume挂载在容器中 - name: secrets-store-inline mountPath: "/mnt/secrets-store" # 定义容器内凭据的挂载路径 readOnly: true # 表示只读 imagePullSecrets: - name: default-secret
- 创建业务Pod。
kubectl apply -f deployment.yaml
回显结果如下:deployment/nginx-spc created
- 执行以下命令,查看Pod是否已经正常创建。
kubectl get pod
回显结果如下:
NAME READY STATUS RESTARTS AGE nginx-spc-67c9d5b594-642np 1/1 Running 0 20s
- 检查指定的凭据是否正常写入。
- 执行以下命令,进入容器内部。
kubectl exec -ti nginx-spc-67c9d5b594-642np -- /bin/sh
- 依次执行以下命令,查找指定凭据。
cd /mnt/secrets-store/ ls
回显结果如下,则说明用户在SPC对象中声明的secret_test已正常写入Pod。
secret_test
- 获取spcPodStatus查看Pod与凭据的绑定情况。
回显结果如下:
NAME AGE nginx-spc-67c9d5b594-642np-default-spc-test 103s
执行以下命令,查看Pod与凭据的绑定情况。
kubectl get spcps nginx-spc-67c9d5b594-642np-default-spc-test -o yaml
回显结果如下,则说明该Pod与凭据已绑定。
...... status: mounted: true objects: # 挂载的凭据信息 - id: secret_test version: v1 podName: nginx-spc-67c9d5b594-642np # 引用了SPC对象的Pod secretProviderClassName: spc-test # SPC对象 targetPath: /mnt/paas/kubernetes/kubelet/pods/6dd29596-5b78-44fb-9d4c-a5027c420617/volumes/kubernetes.io~csi/secrets-store-inline/mount
- 执行以下命令,进入容器内部。
- 定义业务负载,在serviceAccountName中引用此前创建好的ServiceAccount对象,secretProviderClass中引用此前创建好的SPC对象,并在mountPath中指定容器内的挂载路径(这里需注意,用户不应该指定”/”,” /var/run”等特殊目录,否则可能影响容器的正常启动)。
- 创建ServiceAccount,用于声明允许业务Pod使用的DEW凭据名称。进行该步骤之前,请确保DEW的凭据管理服务中已存在相应凭据。如果凭据未创建,则向凭据管理服务中获取相应凭据时会出错,从而导致Pod无法正常运行。如果需要在DEW的凭据管理服务中创建相关凭据,请参见创建凭据。
图2 DEW凭据列表
- 执行以下命令,创建ServiceAccount对象的YAML文件。
vim serviceaccount.yaml
文件内容如下,可以在cce.io/dew-resource字段中声明允许业务使用的凭据名称。如secret_1和secret_2,后续将允许在业务Pod中引用这两个凭据对象。若用户引用未在此处声明的凭据,则会挂载失败,从而导致Pod无法运行。
apiVersion: v1 kind: ServiceAccount metadata: name: nginx-spc-sa annotations: cce.io/dew-resource: "[\"secret_1\",\"secret_2\"]" #secrets that allow pod to use
- 执行以下命令,创建ServiceAccount对象。
kubectl apply -f serviceaccount.yaml
回显结果如下:
serviceaccount/nginx-spc-sa created
- 执行以下命令,查看ServiceAccount对象是否已经正常创建。
kubectl get sa
回显结果如下,则说明名为“nginx-spc-sa”的ServiceAccount对象已正常创建,该对象将在后续的业务Pod中被引用。
NAME SECRETS AGE default 1 18d # 此为系统默认的ServiceAccount对象 nginx-spc-sa 1 19s # 此为刚刚创建的ServiceAccount对象
- 执行以下命令,创建ServiceAccount对象的YAML文件。
- 创建SecretProviderClass,用于定义和管理来自DEW的凭据信息,以便凭据可以被CCE集群中的Pod安全地挂载。在SecretProviderClass对象中,您可以描述需要的凭据信息,例如指定凭据的名称、版本等。
- 执行以下命令,创建SecretProviderClass对象的YAML文件。
vim secretproviderclass.yaml
文件内容如下,主要关注parameters.objects字段,该字段以数组的形式声明您需要挂载的凭据信息。
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: nginx-deployment-spc-k8s-secrets spec: provider: cce parameters: # 引用凭据管理服务中的凭据 objects: | - objectName: "secret_1" objectType: "csms" objectVersion: "latest" jmesPath: - path: key1 objectAlias: dbusername01 - path: key2 objectAlias: dbusername02 # 根据凭据中的内容创建密钥,然后在Pod中进行挂载使用 secretObjects: - secretName: my-secret-01 type: Opaque data: - objectName: dbusername01 # 与objectAlias保持一致 key: db_username_01 - objectName: dbusername02 # 与objectAlias保持一致 key: db_username_02
表3 objects参数说明 参数
参数类型
是否必选
参数说明
objectName
String
是
表示凭据名称,需填写ServiceAccount中引用的凭据。若同一个SecretProviderClass中定义了多个objectName,不允许重名,否则会挂载失败。
objectType
String
是
表示凭据类型。当前仅支持“csms”类型,其他均为非法输入。
objectVersion
String
是
表示凭据的版本。
- 指定某个具体的版本:v1,v2,…
- 指定最新版本:latest。当指定objectVersion为” latest”时,若在云凭据管理服务侧对应的凭据发生了更新,更新后的凭据值将在经过一定时间间隔后(即rotation_poll_interval)刷新至Pod内,即自动开启定时轮转能力。
jmesPath
Array of Object
是
jmesPath是一种从json格式的对象中提取key-value的工具,CCE密钥管理插件使用该工具支持Secret挂载功能。当凭据中有多个key时,您需要填入多个path和objectAlias。
- path:填写DEW服务凭据中的key。
说明:
key不能带有\,对其余特殊符号无限制。
- objectAlias:挂载到Pod中的文件名,该值需要和secretObjects中定义的objectName保持一致。
表4 secretObjects参数说明 参数
参数类型
是否必选
参数说明
secretName
String
是
密钥名称。
type
String
是
密钥类型。
data
Array of Object
是
- objectName:在Pod中挂载的文件名,该值需要和objects中定义的objectAlias保持一致。
- key:密钥中的key,可自定义。在Pod中可使用key值对加密内容进行引用。
- 执行以下命令,创建SecretProviderClass对象。
kubectl apply -f secretproviderclass.yaml
回显内容如下:
secretproviderclass/nginx-deployment-spc-k8s-secrets created
- 执行以下命令,查看SecretProviderClass对象是否已经正常创建。
kubectl get spc
回显结果如下,则说明名为“nginx-deployment-spc-k8s-secrets”的SecretProviderClass对象已正常创建,该对象将在后续的业务Pod中被引用。
NAME AGE nginx-deployment-spc-k8s-secrets 20h
- 执行以下命令,创建SecretProviderClass对象的YAML文件。
- 创建业务Pod,这里以创建一个nginx应用为例。
- 定义业务负载,在serviceAccountName中引用此前创建好的ServiceAccount对象,secretProviderClass中引用此前创建好的SPC对象,并在mountPath中指定容器内的挂载路径(这里需注意,用户不应该指定”/”,” /var/run”等特殊目录,否则可能影响容器的正常启动)。
vim deployment.yaml
文件内容如下:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-k8s-secrets labels: app: nginx-k8s-secrets spec: replicas: 1 selector: matchLabels: app: nginx-k8s-secrets template: metadata: labels: app: nginx-k8s-secrets spec: serviceAccountName: nginx-spc-sa # 引用上面创建的ServiceAccount containers: - name: nginx-deployment-k8s-secrets image: nginx volumeMounts: # 在容器中挂载SPC - name: secrets-store-inline # 需要挂载的volume名称 mountPath: "/mnt/secrets" # 需要挂载的容器路径 readOnly: true env: # 设置环境变量,以便容器可以在运行时通过这些环境变量引用密钥 - name: DB_USERNAME_01 # 工作负载中的变量名 valueFrom: secretKeyRef: name: my-secret-01 # SPC中定义的密钥名称 key: db_username_01 # SPC中定义的密钥key值 - name: DB_USERNAME_02 valueFrom: secretKeyRef: name: my-secret-01 key: db_username_02 imagePullSecrets: - name: default-secret volumes: # 使用SPC中定义的密钥创建volume - name: secrets-store-inline # 自定义的volume名称 csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: nginx-deployment-spc-k8s-secrets # 上一步中创建的SPC名称
- 创建业务Pod。
kubectl apply -f deployment.yaml
回显结果如下:deployment/nginx-deployment-k8s-secrets created
- 执行以下命令,查看Pod是否已经正常创建。
kubectl get pod
回显结果如下:
NAME READY STATUS RESTARTS AGE nginx-deployment-k8s-secrets-6c945565fb-s7smv 1/1 Running 0 20s
- 定义业务负载,在serviceAccountName中引用此前创建好的ServiceAccount对象,secretProviderClass中引用此前创建好的SPC对象,并在mountPath中指定容器内的挂载路径(这里需注意,用户不应该指定”/”,” /var/run”等特殊目录,否则可能影响容器的正常启动)。
- 执行以下命令,验证结果。
kubectl get secrets
回显结果如下,结果表明已使用SPC对象中声明的凭据secret_1创建一个密钥my-secret-01。
NAME TYPE DATA AGE default-secret kubernetes.io/dockerconfigjson 1 33d my-secret-01 Opaque 2 1h
定时轮转
当Pod正常运行后,若其在SPC中声明的、存储在云凭据管理服务中的凭据发生了更新,通过定时轮转,可以将最新的凭据值刷新至Pod内。使用该能力时,需要将凭据的版本指定为”latest”,具体示例如下:
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: spc-test spec: provider: cce parameters: objects: | - objectName: "secret_1" objectVersion: "latest" # change "v1"to "latest" objectType: "csms"
更新该SPC对象后,插件将周期性地向凭据管理服务发起请求,获取凭据secret_1最新版本的值,并将其刷新至引用了该SPC对象的Pod内。此处插件周期性发起请求的时间间隔由安装插件时设置的rotation_poll_interval参数确定。
实时感知SPC变化
当Pod正常运行后,若用户修改了在SPC中声明的凭据信息(如新增凭据、改变原有凭据的版本号等),插件可实时感知该变化,并将更新后的凭据刷新至Pod内。例如,在SPC对象中新增一个凭据secret_2。更新该SPC对象后,新增的secret_2将自动挂载至引用该SPC对象的Pod内。
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: spc-test spec: provider: cce parameters: objects: | - objectName: "secret_1" objectVersion: "latest" objectType: "csms" - objectName: "secret_2" objectVersion: "v1" objectType: "csms"
查看组件日志
您可以通过kubectl命令行的方式,查看组件日志,具体步骤如下:
- 执行以下命令,查看插件的Pod名称。
kubectl get pod -n kube-system
回显结果如下:
NAME READY STATUS RESTARTS AGE csi-secrets-store-76tj2 3/3 Running 0 11h dew-provider-hm5fq 1/1 Running 0 11h
- 执行以下命令,查看dew-provider组件的Pod日志。
kubectl logs dew-provider-hm5fq -n kube-system
回显结果为具体的日志信息,这里不再展现。
... I0321 13:49:29.319708 1 dew_provider.go:43] object [secret_1]'s version [v1] doesn't change, read from local I0321 13:49:29.319735 1 server.go:108] Start writing into mount point I0321 13:49:29.319793 1 server.go:117] Write [secret_1/]'s value into file successfully I0321 13:49:29.319801 1 server.go:123] Write secret file finished I0321 13:49:29.320284 1 server.go:67] "Servicing mount request" Pod="nginx-deployment-k8s-secrets-6c945565fb-s7smv" Namespace="default" ServiceAccount="nginx-spc-sa" I0321 13:49:29.617666 1 dew_provider.go:107] "Get secret successfully" name="secret_1" version="v1" ...
- 执行以下命令,查看csi-secrets-store组件Pod日志。由于csi-secrets-store组件的Pod包含多个容器,在查看日志信息时,需通过”-c”命令指定某个容器。其中,secrets-store容器作为该插件的主业务容器,其包含了主要的日志信息。
kubectl logs csi-secrets-store-76tj2 -c secrets-store -n kube-system
回显结果为具体的日志信息,这里不再展现。
... I0321 10:17:29.314888 1 secrets-store.go:46] "Initializing Secrets Store CSI Driver" driver="secrets-store.csi.k8s.io" version="local-dev" buildTime="" I0321 10:17:29.314987 1 reconciler.go:143] "starting rotation reconciler" rotationPollInterval="2m0s" I0321 10:17:29.315141 1 server.go:126] "Listening for connections" address="//mnt/paas/kubernetes/kubelet/plugins/csi.sock" I0321 10:17:30.933328 1 nodeserver.go:359] "node: getting default node info\n" I0321 10:19:19.269337 1 nodeserver.go:353] "Using gRPC client" provider="cce" pod="nginx-spc-744b4c57dc-x74xq" I0321 10:19:19.543221 1 secretproviderclasspodstatus_controller.go:224] "reconcile started" spcps="default/nginx-spc-744b4c57dc-x74xq-default-spc-test" ...
配置访问DEW服务的VPC终端节点
- 登录VPC终端节点控制台。
- 在“终端节点”页面,单击“购买终端节点”。
- 根据界面提示配置必选参数。更多参数说明,请参见购买终端节点
表5 终端节点配置参数 参数
说明
区域
终端节点所在区域,需要与CCE Autopilot集群所在区域保持一致。
计费模式
仅支持按需计费。按需计费是后付费模式,按终端节点的实际使用时长计费,可以随时开通/删除终端节点。
服务类别
请选择“按名称查找服务”。
服务名称
请提交工单,联系DEW工作人员,获取当前区域的服务名称。
创建内网域名
请勾选该参数。
终端节点创建完成后,即可通过内网域名直接访问终端节点。
虚拟私有云
请选择CCE Autopilot集群所在的虚拟私有云。
子网
请选择一个已有子网。
IPv4地址
表示终端节点的IPv4地址,可选择“自动分配”或“手动分配”。
- 参数配置完成,单击“立即购买”,进行规格确认。
- 规格确认无误,单击“提交”,任务提交成功。
- 参数信息配置有误,需要修改,单击“上一步”,修改参数,然后单击“提交”。
- 返回终端节点列表,如果终端节点状态为“已接受”,表示终端节点已成功连接至终端节点服务。
版本记录
插件版本 |
支持的集群版本 |
更新特性 |
---|---|---|
1.0.0 |
1.28.8-r0、1.31.4-r0及以上 |
支持CCE Autopilot集群 |