使用极狐GitLab Shell chart
- Tier: 基础版,专业版,旗舰版
- Offering: 私有化部署
gitlab-shell 子 chart 为 SSH 访问极狐GitLab 提供了一个 SSH 服务器配置。
要求
这个 chart 依赖于对 Workhorse 服务的访问,可以是完整极狐GitLab chart 的一部分,也可以是 Kubernetes 集群中可以访问的外部服务。
设计选择
为了更容易支持 SSH 副本并避免为 SSH 授权密钥使用共享存储,我们使用 SSH AuthorizedKeysCommand 来对极狐GitLab 授权密钥端点进行身份验证。因此,我们不在这些 pod 内持久化或更新 AuthorizedKeys 文件。
配置
gitlab-shell chart 分为两部分配置:外部服务 和 chart 设置。通过 Ingress 暴露的端口使用 global.shell.port 配置,默认值为 22。服务的外部端口也由 global.shell.port 控制。
安装命令行选项
| 参数 | 默认值 | 描述 |
|---|---|---|
| affinity | {} | 用于 pod 分配的 亲和性规则 |
| annotations | Pod 注释 | |
| podLabels | 补充 Pod 标签,不用于选择器。 | |
| common.labels | 应用于此 chart 创建的所有对象的补充标签。 | |
| config.clientAliveInterval | 0 | 在其他情况下空闲的连接上保持活跃 pings 的间隔;默认值 0 禁用此 ping |
| config.loginGraceTime | 60 | 指定服务器将在用户未成功登录时断开连接的时间 |
| config.maxStartups.full | 100 | SSHd 拒绝概率将线性增加,当未经身份验证的连接数量达到指定数量时,所有未经身份验证的连接尝试将被拒绝 |
| config.maxStartups.rate | 30 | SSHd 将根据指定概率拒绝连接,当未经身份验证的连接数量过多时(可选) |
| config.maxStartups.start | 10 | 如果当前未经身份验证的连接数超过指定数量,SSHd 将以某种概率拒绝连接尝试(可选) |
| config.proxyProtocol | false | 为 gitlab-sshd 守护进程启用 PROXY 协议支持 |
| config.proxyPolicy | "use" | 指定处理 PROXY 协议的策略。值必须是 use、require、ignore、reject 中之一 |
| config.proxyHeaderTimeout | "500ms" | gitlab-sshd 在放弃读取 PROXY 协议头之前等待的最长时间。必须包括单位:ms、s 或 m。 |
| config.ciphers | [aes128-gcm@openssh.com, chacha20-poly1305@openssh.com, aes256-gcm@openssh.com, aes128-ctr, aes192-ctr, aes256-ctr] | 指定允许的密码。 |
| config.kexAlgorithms | [curve25519-sha256, curve25519-sha256@libssh.org, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, diffie-hellman-group14-sha256, diffie-hellman-group14-sha1] | 指定可用的 KEX(密钥交换)算法。 |
| config.macs | [hmac-sha2-256-etm@openssh.com, hmac-sha2-512-etm@openssh.com, hmac-sha2-256, hmac-sha2-512, hmac-sha1] | 指定可用的 MAC(消息认证码)算法。 |
| config.publicKeyAlgorithms | [] | 自定义公钥算法列表。如果为空,则使用默认算法。 |
| config.gssapi.enabled | false | 为 gitlab-sshd 守护进程启用 GSS-API 支持 |
| config.gssapi.keytab.secret | 持有 gssapi-with-mic 认证方法的 keytab 的 Kubernetes 密钥名称 | |
| config.gssapi.keytab.key | keytab | Kubernetes 密钥中的 keytab 密钥 |
| config.gssapi.krb5Config | 极狐GitLab Shell 容器中的 /etc/krb5.conf 文件内容 | |
| config.gssapi.servicePrincipalName | gitlab-sshd 守护进程使用的 Kerberos 服务名称 | |
| config.lfs.pureSSHProtocol | false | 启用 LFS 纯 SSH 协议支持 |
| config.pat.enabled | true | 启用通过 SSH 的 PAT |
| config.pat.allowedScopes | [] | 通过 SSH 生成的 PAT 允许的范围数组 |
| opensshd.supplemental_config | 补充配置,附加到 sshd_config。严格符合 手册页 | |
| deployment.livenessProbe.initialDelaySeconds | 10 | 活跃性探测启动前的延迟 |
| deployment.livenessProbe.periodSeconds | 10 | 进行活跃性探测的频率 |
| deployment.livenessProbe.timeoutSeconds | 3 | 活跃性探测的超时时间 |
| deployment.livenessProbe.successThreshold | 1 | 活跃性探测失败后被认为成功的最小连续成功次数 |
| deployment.livenessProbe.failureThreshold | 3 | 活跃性探测成功后被认为失败的最小连续失败次数 |
| deployment.readinessProbe.initialDelaySeconds | 10 | 就绪性探测启动前的延迟 |
| deployment.readinessProbe.periodSeconds | 5 | 进行就绪性探测的频率 |
| deployment.readinessProbe.timeoutSeconds | 3 | 就绪性探测的超时时间 |
| deployment.readinessProbe.successThreshold | 1 | 就绪性探测失败后被认为成功的最小连续成功次数 |
| deployment.readinessProbe.failureThreshold | 2 | 就绪性探测成功后被认为失败的最小连续失败次数 |
| deployment.strategy | {} | 允许配置部署使用的更新策略 |
| deployment.terminationGracePeriodSeconds | 30 | Kubernetes 在强制退出 pod 前等待的秒数 |
| enabled | true | Shell 启用标志 |
| extraContainers | 包含要包含的容器列表的多行字符串 | |
| extraInitContainers | 要包含的额外初始化容器列表 | |
| extraVolumeMounts | 要执行的额外卷挂载列表 | |
| extraVolumes | 要创建的额外卷列表 | |
| extraEnv | 要公开的额外环境变量列表 | |
| extraEnvFrom | 要从其他数据源公开的额外环境变量列表 | |
| hpa.behavior | {scaleDown: {stabilizationWindowSeconds: 300 }} | 行为包含上升和下降行为的规范(需要 autoscaling/v2beta2 或更高版本) |
| hpa.customMetrics | [] | 自定义指标包含用于计算所需副本数的规范(覆盖默认使用的平均 CPU 利用率配置在 targetAverageUtilization 中) |
| hpa.cpu.targetType | AverageValue | 设置自动缩放 CPU 目标类型,必须是 Utilization 或 AverageValue |
| hpa.cpu.targetAverageValue | 100m | 设置自动缩放 CPU 目标值 |
| hpa.cpu.targetAverageUtilization | 设置自动缩放 CPU 目标利用率 | |
| hpa.memory.targetType | 设置自动缩放内存目标类型,必须是 Utilization 或 AverageValue | |
| hpa.memory.targetAverageValue | 设置自动缩放内存目标值 | |
| hpa.memory.targetAverageUtilization | 设置自动缩放内存目标利用率 | |
| hpa.targetAverageValue | 已弃用 设置自动缩放 CPU 目标值 | |
| image.pullPolicy | IfNotPresent | Shell 镜像拉取策略 |
| image.pullSecrets | 镜像仓库的密钥 | |
| image.repository | registry.gitlab.com/gitlab-org/build/cng/gitlab-shell | Shell 镜像仓库 |
| image.tag | master | Shell 镜像标签 |
| init.image.repository | initContainer 镜像 | |
| init.image.tag | initContainer 镜像标签 | |
| init.containerSecurityContext | initContainer 特定的 securityContext | |
| init.containerSecurityContext.allowPrivilegeEscalation | false | initContainer 特定:控制进程是否可以获得比其父进程更多的权限 |
| init.containerSecurityContext.runAsNonRoot | true | initContainer 特定:控制容器是否以非 root 用户身份运行 |
| init.containerSecurityContext.capabilities.drop | [ "ALL" ] | initContainer 特定:删除容器的 Linux 功能 |
| keda.enabled | false | 使用 KEDA ScaledObjects 而不是 HorizontalPodAutoscalers |
| keda.pollingInterval | 30 | 检查每个触发器的间隔 |
| keda.cooldownPeriod | 300 | 在最后一个触发器报告活动后等待的时间,以便将资源缩放回 0 |
| keda.minReplicaCount | KEDA 将资源缩放到的最小副本数,默认为 minReplicas | |
| keda.maxReplicaCount | KEDA 将资源缩放到的最大副本数,默认为 maxReplicas | |
| keda.fallback | KEDA 回退配置 | |
| keda.hpaName | KEDA 将创建的 HPA 资源名称,默认为 keda-hpa-{scaled-object-name} | |
| keda.restoreToOriginalReplicaCount | 指定目标资源是否应在 ScaledObject 被删除后缩放回原始副本数 | |
| keda.behavior | 上升和下降行为的规范,默认为 hpa.behavior | |
| keda.triggers | 触发器列表以激活目标资源的缩放,默认为根据 hpa.cpu 和 hpa.memory 计算的触发器 | |
| logging.format | json | 设置为 text 以获取非结构化日志 |
| logging.sshdLogLevel | ERROR | 底层 SSH 守护进程的日志级别 |
| priorityClassName | 分配给 pod 的 优先级类 | |
| replicaCount | 1 | Shell 副本 |
| serviceLabels | {} | 补充服务标签 |
| service.allocateLoadBalancerNodePorts | 未设置,使用 Kubernetes 默认值。 | 允许禁用在 LoadBalancer 服务上的 NodePort 分配,请参阅 文档 |
| service.externalTrafficPolicy | Cluster | Shell 服务外部流量策略(Cluster 或 Local) |
| service.internalPort | 2222 | Shell 内部端口 |
| service.nodePort | 如果设置,则设置 shell nodePort | |
| service.name | gitlab-shell | Shell 服务名称 |
| service.type | ClusterIP | Shell 服务类型 |
| service.loadBalancerIP | 分配给 LoadBalancer 的 IP 地址(如果支持) | |
| service.loadBalancerSourceRanges | 允许访问 LoadBalancer 的 IP CIDR 列表(如果支持) | |
| serviceAccount.annotations | {} | ServiceAccount 注释 |
| serviceAccount.automountServiceAccountToken | false | 指示是否应在 pod 中挂载默认 ServiceAccount 访问令牌 |
| serviceAccount.create | false | 指示是否应创建 ServiceAccount |
| serviceAccount.enabled | false | 指示是否使用 ServiceAccount |
| serviceAccount.name | ServiceAccount 的名称。如果未设置,则使用完整的 chart 名称 | |
| securityContext.fsGroup | 1000 | 应在 pod 启动时使用的组 ID |
| securityContext.runAsUser | 1000 | 应在 pod 启动时使用的用户 ID |
| securityContext.fsGroupChangePolicy | 用于更改卷的所有权和权限的策略(需要 Kubernetes 1.23) | |
| securityContext.seccompProfile.type | RuntimeDefault | 要使用的 seccomp 配置文件 |
| containerSecurityContext | 覆盖容器的 securityContext ,在容器启动时使用 | |
| containerSecurityContext.runAsUser | 1000 | 允许覆盖容器启动时使用的特定安全上下文 |
| containerSecurityContext.allowPrivilegeEscalation | false | 控制容器进程是否可以获得比其父进程更多的权限 |
| containerSecurityContext.runAsNonRoot | true | 控制容器是否以非 root 用户身份运行 |
| containerSecurityContext.capabilities.drop | [ "ALL" ] | 删除 Gitaly 容器的 Linux 功能 |
| sshDaemon | openssh | 选择要运行的 SSH 守护进程,可能的值(openssh,gitlab-sshd) |
| tolerations | [] | 用于 pod 分配的容忍标签 |
| traefik.entrypoint | gitlab-shell | 使用 traefik 时,使用哪个 traefik 入口点用于极狐GitLab Shell。默认值为 gitlab-shell |
| traefik.tcpMiddlewares | [] | 使用 traefik 时,向 IngressRouteTCP 资源添加哪些 TCP 中间件。默认情况下没有中间件 |
| workhorse.serviceName | webservice | Workhorse 服务名称(默认情况下,Workhorse 是 webservice Pods / Service 的一部分) |
| metrics.enabled | false | 如果应为抓取而提供指标端点(需要 sshDaemon=gitlab-sshd)。 |
| metrics.port | 9122 | 指标端口 |
| metrics.path | /metrics | 指标路径 |
| metrics.serviceMonitor.enabled | false | 如果应创建 ServiceMonitor 以启用 Prometheus Operator 管理指标抓取,请注意启用此选项将删除 prometheus.io 抓取注释 |
| metrics.serviceMonitor.additionalLabels | {} | 要添加到 ServiceMonitor 的其他标签 |
| metrics.serviceMonitor.endpointConfig | {} | ServiceMonitor 的其他端点配置 |
| metrics.annotations | 已弃用 设置显式指标注释。被模板内容替代。 |
Chart 配置示例
extraEnv
extraEnv 允许你在 pod 中所有容器中暴露额外的环境变量。
以下是 extraEnv 的示例用法:
yamlextraEnv: SOME_KEY: some_value SOME_OTHER_KEY: some_other_value
启动容器时,你可以确认环境变量已暴露:
shellenv | grep SOME SOME_KEY=some_value SOME_OTHER_KEY=some_other_value
extraEnvFrom
extraEnvFrom 允许你从其他数据源在 pod 中所有容器中暴露额外的环境变量。
以下是 extraEnvFrom 的示例用法:
yaml1extraEnvFrom: 2 MY_NODE_NAME: 3 fieldRef: 4 fieldPath: spec.nodeName 5 MY_CPU_REQUEST: 6 resourceFieldRef: 7 containerName: test-container 8 resource: requests.cpu 9 SECRET_THING: 10 secretKeyRef: 11 name: special-secret 12 key: special_token 13 # optional: boolean 14 CONFIG_STRING: 15 configMapKeyRef: 16 name: useful-config 17 key: some-string 18 # optional: boolean
image.pullSecrets
pullSecrets 允许你通过身份验证从私有注册表拉取 pod 的镜像。
有关私有注册表及其身份验证方法的更多详细信息,请参阅 Kubernetes 文档。
以下是 pullSecrets 的示例用法:
yaml1image: 2 repository: my.shell.repository 3 tag: latest 4 pullPolicy: Always 5 pullSecrets: 6 - name: my-secret-name 7 - name: my-secondary-secret-name
serviceAccount
此部分控制是否应创建 ServiceAccount 以及是否应在 pod 中挂载默认访问令牌。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| annotations | Map | {} | ServiceAccount 注释。 |
| automountServiceAccountToken | Boolean | false | 控制是否应在 pod 中挂载默认 ServiceAccount 访问令牌。除非某些 sidecar 需要它正常工作(例如 Istio),否则不应启用此选项。 |
| create | Boolean | false | 指示是否应创建 ServiceAccount。 |
| enabled | Boolean | false | 指示是否使用 ServiceAccount。 |
| name | String | ServiceAccount 的名称。如果未设置,则使用完整的 chart 名称。 |
livenessProbe/readinessProbe
deployment.livenessProbe 和 deployment.readinessProbe 提供了一种机制来帮助在某些情况下控制 Pod 的终止。
较大的存储库受益于调整活跃性和就绪性探测时间以匹配其典型的长时间连接。将就绪性探测持续时间设置得比活跃性探测持续时间短,以最大程度地减少 clone 和 push 操作期间的潜在中断。增加 terminationGracePeriodSeconds 并在调度器终止 pod 之前为这些操作提供更多时间。考虑以下示例作为调整极狐GitLab Shell pod 的起点,以提高较大存储库工作负载的稳定性和效率。
yaml1deployment: 2 livenessProbe: 3 initialDelaySeconds: 10 4 periodSeconds: 20 5 timeoutSeconds: 3 6 successThreshold: 1 7 failureThreshold: 10 8 readinessProbe: 9 initialDelaySeconds: 10 10 periodSeconds: 5 11 timeoutSeconds: 2 12 successThreshold: 1 13 failureThreshold: 3 14 terminationGracePeriodSeconds: 300
有关此配置的更多详细信息,请参考官方 Kubernetes 文档。
tolerations
tolerations 允许你在有污点的工作节点上调度 pod
以下是 tolerations 的示例用法:
yaml1tolerations: 2- key: "node_label" 3 operator: "Equal" 4 value: "true" 5 effect: "NoSchedule" 6- key: "node_label" 7 operator: "Equal" 8 value: "true" 9 effect: "NoExecute"
affinity
有关更多信息,请参阅 affinity。
annotations
annotations 允许你向极狐GitLab Shell pod 添加注释。
以下是 annotations 的示例用法
yamlannotations: kubernetes.io/example-annotation: annotation-value
外部服务
此 chart 应连接到 Workhorse 服务。
Workhorse
yamlworkhorse: host: workhorse.example.com serviceName: webservice port: 8181
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| host | String | Workhorse 服务器的主机名。这可以省略,改为使用 serviceName。 | |
| port | Integer | 8181 | 连接到 Workhorse 服务器的端口。 |
| serviceName | String | webservice | 操作 Workhorse 服务器的 服务 的名称。默认情况下,Workhorse 是 webservice Pods / Service 的一部分。如果存在此项,而 host 不存在,则 chart 将模板化服务的主机名(和当前 .Release.Name)以替代 host 值。这在使用 Workhorse 作为极狐GitLab chart 的整体一部分时很方便。 |
Chart 设置
以下值用于配置极狐GitLab Shell Pods。
hostKeys.secret
从 Kubernetes secret 获取 SSH 主机密钥的名称。密钥中的密钥必须以 ssh_host_ 开头,才能被极狐GitLab Shell 使用。
authToken
极狐GitLab Shell 在与 Workhorse 通信中使用身份验证令牌。使用共享密钥与极狐GitLab Shell 和 Workhorse 共享令牌。
yamlauthToken: secret: gitlab-shell-secret key: secret
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| authToken.key | String | 上述密钥中包含身份验证令牌的密钥的名称。 | |
| authToken.secret | String | 要从中提取的 Kubernetes Secret 的名称。 |
LoadBalancer 服务
如果 service.type 设置为 LoadBalancer,你可以选择指定 service.loadBalancerIP 来创建具有用户指定 IP 的 LoadBalancer(如果你的云提供商支持)。
你还可以选择指定 service.loadBalancerSourceRanges 列表,以限制可以访问 LoadBalancer 的 CIDR 范围(如果你的云提供商支持)。
有关 LoadBalancer 服务类型的更多信息,请参阅 Kubernetes 文档
yaml1service: 2 type: LoadBalancer 3 loadBalancerIP: 1.2.3.4 4 loadBalancerSourceRanges: 5 - 5.6.7.8/32 6 - 10.0.0.0/8
OpenSSH 补充配置
在使用 OpenSSH 的 sshd(通过 .sshDaemon: openssh)时,可以通过两种方式提供补充配置:.opensshd.supplemental_config 和通过挂载配置片段到 /etc/ssh/sshd_config.d/*.conf。
提供的任何配置 必须 符合 sshd_config 的功能要求。
opensshd.supplemental_config
.opensshd.supplemental_config 的内容将直接放置在容器内的 sshd_config 文件末尾。此值应为多行字符串。
示例,使用 ssh-rsa 密钥交换算法启用较旧的客户端。请注意,启用已弃用的算法,例如 ssh-rsa,会导致 重大安全漏洞。在公开暴露的极狐GitLab 实例上进行这些更改时,利用的可能性会 显著增加。
yamlopensshd: supplemental_config: |- HostKeyAlgorithms +ssh-rsa,ssh-rsa-cert-v01@openssh.com PubkeyAcceptedAlgorithms +ssh-rsa,ssh-rsa-cert-v01@openssh.com CASignatureAlgorithms +ssh-rsa
sshd_config.d
你可以通过将内容挂载到 /etc/ssh/sshd_config.d 来为 sshd 提供完整的配置片段,文件匹配 *.conf。请注意,这些文件在应用程序在容器内和 chart 内运行所需的默认配置之后被包含。这些值 不会 覆盖 sshd_config 的内容,而是扩展它们。
示例,通过 extraVolumes 和 extraVolumeMounts 将 ConfigMap 的单个项目挂载到容器中:
yaml1extraVolumes: | 2 - name: gitlab-sshdconfig-extra 3 configMap: 4 name: gitlab-sshdconfig-extra 5 6extraVolumeMounts: | 7 - name: gitlab-sshdconfig-extra 8 mountPath: /etc/ssh/sshd_config.d/extra.conf 9 subPath: extra.conf
配置 networkpolicy
此部分控制 网络策略。此配置是可选的,用于将 Pod 的出站和入站限制到特定端点。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| enabled | Boolean | false | 此设置启用 NetworkPolicy |
| ingress.enabled | Boolean | false | 设置为 true 时,将激活 Ingress 网络策略。这将阻止所有入站连接,除非指定了规则。 |
| ingress.rules | Array | [] | 入站策略的规则,详情请参阅 https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resource 和以下示例 |
| egress.enabled | Boolean | false | 设置为 true 时,将激活 Egress 网络策略。这将阻止所有出站连接,除非指定了规则。 |
| egress.rules | Array | [] | 出站策略的规则,详情请参阅 https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resource 和以下示例 |
网络策略示例
gitlab-shell 服务需要端口 22 的入站连接和不同端口的出站连接到默认的 workhorse 端口 8181。此示例添加以下网络策略:
-
允许入站请求:
-
从 nginx-ingress pod 到端口 2222
-
从 prometheus pod 到端口 9122
仅在 SSH 守护进程设置为 `gitlab-sshd` 时,才需要从 `prometheus` 到端口 `9122` 的访问
-
-
允许出站请求:
- 到 webservice pod 到端口 8181
- 到 gitaly pod 到端口 8075
请注意,提供的示例仅为示例,可能并不完整
该示例基于以下假设:kube-dns 部署在命名空间 kube-system,prometheus 部署在命名空间 monitoring,nginx-ingress 部署在命名空间 nginx-ingress。
yaml1networkpolicy: 2 enabled: true 3 ingress: 4 enabled: true 5 rules: 6 - from: 7 - namespaceSelector: 8 matchLabels: 9 kubernetes.io/metadata.name: nginx-ingress 10 podSelector: 11 matchLabels: 12 app: nginx-ingress 13 component: controller 14 ports: 15 - port: 2222 16 - from: 17 - namespaceSelector: 18 matchLabels: 19 kubernetes.io/metadata.name: monitoring 20 podSelector: 21 matchLabels: 22 app: prometheus 23 component: server 24 release: gitlab 25 ports: 26 - port: 9122 27 egress: 28 enabled: true 29 rules: 30 - to: 31 - podSelector: 32 matchLabels: 33 app: gitaly 34 ports: 35 - port: 8075 36 - to: 37 - podSelector: 38 matchLabels: 39 app: webservice 40 ports: 41 - port: 8181 42 - to: 43 - namespaceSelector: 44 matchLabels: 45 kubernetes.io/metadata.name: kube-system 46 podSelector: 47 matchLabels: 48 k8s-app: kube-dns 49 ports: 50 - port: 53 51 protocol: UDP
配置 KEDA
此 keda 部分启用安装 KEDA ScaledObjects,而不是常规 HorizontalPodAutoscalers。此配置是可选的,可以在需要根据自定义或外部指标进行自动缩放时使用。
如果以下条件为真,则根据 hpa 部分中设置的 CPU 和内存阈值自动添加 CPU 和内存触发器:
- triggers 未设置。
- 相应的 request.cpu.request 或 request.memory.request 设置也设置为非零值。
如果未设置触发器,则不会创建 ScaledObject。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| enabled | Boolean | false | 使用 KEDA ScaledObjects 而不是 HorizontalPodAutoscalers |
| pollingInterval | Integer | 30 | 检查每个触发器的间隔 |
| cooldownPeriod | Integer | 300 | 在最后一个触发器报告活动后等待的时间,以便将资源缩放回 0 |
| minReplicaCount | Integer | KEDA 将资源缩放到的最小副本数,默认为 minReplicas | |
| maxReplicaCount | Integer | KEDA 将资源缩放到的最大副本数,默认为 maxReplicas | |
| fallback | Map | KEDA 回退配置,请参阅 文档 | |
| hpaName | String | KEDA 将创建的 HPA 资源名称,默认为 keda-hpa-{scaled-object-name} | |
| restoreToOriginalReplicaCount | Boolean | 指定目标资源是否应在 ScaledObject 被删除后缩放回原始副本数 | |
| behavior | Map | 上升和下降行为的规范,默认为 hpa.behavior | |
| triggers | Array | 触发器列表以激活目标资源的缩放,默认为根据 hpa.cpu 和 hpa.memory 计算的触发器 |