使用极狐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 分配的 亲和性规则
annotationsPod 注释
podLabels补充 Pod 标签,不用于选择器。
common.labels应用于此 chart 创建的所有对象的补充标签。
config.clientAliveInterval0在其他情况下空闲的连接上保持活跃 pings 的间隔;默认值 0 禁用此 ping
config.loginGraceTime60指定服务器将在用户未成功登录时断开连接的时间
config.maxStartups.full100SSHd 拒绝概率将线性增加,当未经身份验证的连接数量达到指定数量时,所有未经身份验证的连接尝试将被拒绝
config.maxStartups.rate30SSHd 将根据指定概率拒绝连接,当未经身份验证的连接数量过多时(可选)
config.maxStartups.start10如果当前未经身份验证的连接数超过指定数量,SSHd 将以某种概率拒绝连接尝试(可选)
config.proxyProtocolfalsegitlab-sshd 守护进程启用 PROXY 协议支持
config.proxyPolicy"use"指定处理 PROXY 协议的策略。值必须是 use、require、ignore、reject 中之一
config.proxyHeaderTimeout"500ms"gitlab-sshd 在放弃读取 PROXY 协议头之前等待的最长时间。必须包括单位:mssm
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.enabledfalsegitlab-sshd 守护进程启用 GSS-API 支持
config.gssapi.keytab.secret持有 gssapi-with-mic 认证方法的 keytab 的 Kubernetes 密钥名称
config.gssapi.keytab.keykeytabKubernetes 密钥中的 keytab 密钥
config.gssapi.krb5Config极狐GitLab Shell 容器中的 /etc/krb5.conf 文件内容
config.gssapi.servicePrincipalNamegitlab-sshd 守护进程使用的 Kerberos 服务名称
config.lfs.pureSSHProtocolfalse启用 LFS 纯 SSH 协议支持
config.pat.enabledtrue启用通过 SSH 的 PAT
config.pat.allowedScopes[]通过 SSH 生成的 PAT 允许的范围数组
opensshd.supplemental_config补充配置,附加到 sshd_config。严格符合 手册页
deployment.livenessProbe.initialDelaySeconds10活跃性探测启动前的延迟
deployment.livenessProbe.periodSeconds10进行活跃性探测的频率
deployment.livenessProbe.timeoutSeconds3活跃性探测的超时时间
deployment.livenessProbe.successThreshold1活跃性探测失败后被认为成功的最小连续成功次数
deployment.livenessProbe.failureThreshold3活跃性探测成功后被认为失败的最小连续失败次数
deployment.readinessProbe.initialDelaySeconds10就绪性探测启动前的延迟
deployment.readinessProbe.periodSeconds5进行就绪性探测的频率
deployment.readinessProbe.timeoutSeconds3就绪性探测的超时时间
deployment.readinessProbe.successThreshold1就绪性探测失败后被认为成功的最小连续成功次数
deployment.readinessProbe.failureThreshold2就绪性探测成功后被认为失败的最小连续失败次数
deployment.strategy{}允许配置部署使用的更新策略
deployment.terminationGracePeriodSeconds30Kubernetes 在强制退出 pod 前等待的秒数
enabledtrueShell 启用标志
extraContainers包含要包含的容器列表的多行字符串
extraInitContainers要包含的额外初始化容器列表
extraVolumeMounts要执行的额外卷挂载列表
extraVolumes要创建的额外卷列表
extraEnv要公开的额外环境变量列表
extraEnvFrom要从其他数据源公开的额外环境变量列表
hpa.behavior{scaleDown: {stabilizationWindowSeconds: 300 }}行为包含上升和下降行为的规范(需要 autoscaling/v2beta2 或更高版本)
hpa.customMetrics[]自定义指标包含用于计算所需副本数的规范(覆盖默认使用的平均 CPU 利用率配置在 targetAverageUtilization 中)
hpa.cpu.targetTypeAverageValue设置自动缩放 CPU 目标类型,必须是 UtilizationAverageValue
hpa.cpu.targetAverageValue100m设置自动缩放 CPU 目标值
hpa.cpu.targetAverageUtilization设置自动缩放 CPU 目标利用率
hpa.memory.targetType设置自动缩放内存目标类型,必须是 UtilizationAverageValue
hpa.memory.targetAverageValue设置自动缩放内存目标值
hpa.memory.targetAverageUtilization设置自动缩放内存目标利用率
hpa.targetAverageValue已弃用 设置自动缩放 CPU 目标值
image.pullPolicyIfNotPresentShell 镜像拉取策略
image.pullSecrets镜像仓库的密钥
image.repositoryregistry.gitlab.com/gitlab-org/build/cng/gitlab-shellShell 镜像仓库
image.tagmasterShell 镜像标签
init.image.repositoryinitContainer 镜像
init.image.taginitContainer 镜像标签
init.containerSecurityContextinitContainer 特定的 securityContext
init.containerSecurityContext.allowPrivilegeEscalationfalseinitContainer 特定:控制进程是否可以获得比其父进程更多的权限
init.containerSecurityContext.runAsNonRoottrueinitContainer 特定:控制容器是否以非 root 用户身份运行
init.containerSecurityContext.capabilities.drop[ "ALL" ]initContainer 特定:删除容器的 Linux 功能
keda.enabledfalse使用 KEDA ScaledObjects 而不是 HorizontalPodAutoscalers
keda.pollingInterval30检查每个触发器的间隔
keda.cooldownPeriod300在最后一个触发器报告活动后等待的时间,以便将资源缩放回 0
keda.minReplicaCountKEDA 将资源缩放到的最小副本数,默认为 minReplicas
keda.maxReplicaCountKEDA 将资源缩放到的最大副本数,默认为 maxReplicas
keda.fallbackKEDA 回退配置
keda.hpaNameKEDA 将创建的 HPA 资源名称,默认为 keda-hpa-{scaled-object-name}
keda.restoreToOriginalReplicaCount指定目标资源是否应在 ScaledObject 被删除后缩放回原始副本数
keda.behavior上升和下降行为的规范,默认为 hpa.behavior
keda.triggers触发器列表以激活目标资源的缩放,默认为根据 hpa.cpuhpa.memory 计算的触发器
logging.formatjson设置为 text 以获取非结构化日志
logging.sshdLogLevelERROR底层 SSH 守护进程的日志级别
priorityClassName分配给 pod 的 优先级类
replicaCount1Shell 副本
serviceLabels{}补充服务标签
service.allocateLoadBalancerNodePorts未设置,使用 Kubernetes 默认值。允许禁用在 LoadBalancer 服务上的 NodePort 分配,请参阅 文档
service.externalTrafficPolicyClusterShell 服务外部流量策略(Cluster 或 Local)
service.internalPort2222Shell 内部端口
service.nodePort如果设置,则设置 shell nodePort
service.namegitlab-shellShell 服务名称
service.typeClusterIPShell 服务类型
service.loadBalancerIP分配给 LoadBalancer 的 IP 地址(如果支持)
service.loadBalancerSourceRanges允许访问 LoadBalancer 的 IP CIDR 列表(如果支持)
serviceAccount.annotations{}ServiceAccount 注释
serviceAccount.automountServiceAccountTokenfalse指示是否应在 pod 中挂载默认 ServiceAccount 访问令牌
serviceAccount.createfalse指示是否应创建 ServiceAccount
serviceAccount.enabledfalse指示是否使用 ServiceAccount
serviceAccount.nameServiceAccount 的名称。如果未设置,则使用完整的 chart 名称
securityContext.fsGroup1000应在 pod 启动时使用的组 ID
securityContext.runAsUser1000应在 pod 启动时使用的用户 ID
securityContext.fsGroupChangePolicy用于更改卷的所有权和权限的策略(需要 Kubernetes 1.23)
securityContext.seccompProfile.typeRuntimeDefault要使用的 seccomp 配置文件
containerSecurityContext覆盖容器的 securityContext ,在容器启动时使用
containerSecurityContext.runAsUser1000允许覆盖容器启动时使用的特定安全上下文
containerSecurityContext.allowPrivilegeEscalationfalse控制容器进程是否可以获得比其父进程更多的权限
containerSecurityContext.runAsNonRoottrue控制容器是否以非 root 用户身份运行
containerSecurityContext.capabilities.drop[ "ALL" ]删除 Gitaly 容器的 Linux 功能
sshDaemonopenssh选择要运行的 SSH 守护进程,可能的值(opensshgitlab-sshd
tolerations[]用于 pod 分配的容忍标签
traefik.entrypointgitlab-shell使用 traefik 时,使用哪个 traefik 入口点用于极狐GitLab Shell。默认值为 gitlab-shell
traefik.tcpMiddlewares[]使用 traefik 时,向 IngressRouteTCP 资源添加哪些 TCP 中间件。默认情况下没有中间件
workhorse.serviceNamewebserviceWorkhorse 服务名称(默认情况下,Workhorse 是 webservice Pods / Service 的一部分)
metrics.enabledfalse如果应为抓取而提供指标端点(需要 sshDaemon=gitlab-sshd)。
metrics.port9122指标端口
metrics.path/metrics指标路径
metrics.serviceMonitor.enabledfalse如果应创建 ServiceMonitor 以启用 Prometheus Operator 管理指标抓取,请注意启用此选项将删除 prometheus.io 抓取注释
metrics.serviceMonitor.additionalLabels{}要添加到 ServiceMonitor 的其他标签
metrics.serviceMonitor.endpointConfig{}ServiceMonitor 的其他端点配置
metrics.annotations已弃用 设置显式指标注释。被模板内容替代。

Chart 配置示例#

extraEnv#

extraEnv 允许你在 pod 中所有容器中暴露额外的环境变量。

以下是 extraEnv 的示例用法:

yaml
extraEnv: SOME_KEY: some_value SOME_OTHER_KEY: some_other_value

启动容器时,你可以确认环境变量已暴露:

shell
env | grep SOME SOME_KEY=some_value SOME_OTHER_KEY=some_other_value

extraEnvFrom#

extraEnvFrom 允许你从其他数据源在 pod 中所有容器中暴露额外的环境变量。

以下是 extraEnvFrom 的示例用法:

yaml
1extraEnvFrom: 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 的示例用法:

yaml
1image: 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 中挂载默认访问令牌。

名称类型默认值描述
annotationsMap{}ServiceAccount 注释。
automountServiceAccountTokenBooleanfalse控制是否应在 pod 中挂载默认 ServiceAccount 访问令牌。除非某些 sidecar 需要它正常工作(例如 Istio),否则不应启用此选项。
createBooleanfalse指示是否应创建 ServiceAccount。
enabledBooleanfalse指示是否使用 ServiceAccount。
nameStringServiceAccount 的名称。如果未设置,则使用完整的 chart 名称。

livenessProbe/readinessProbe#

deployment.livenessProbedeployment.readinessProbe 提供了一种机制来帮助在某些情况下控制 Pod 的终止。

较大的存储库受益于调整活跃性和就绪性探测时间以匹配其典型的长时间连接。将就绪性探测持续时间设置得比活跃性探测持续时间短,以最大程度地减少 clonepush 操作期间的潜在中断。增加 terminationGracePeriodSeconds 并在调度器终止 pod 之前为这些操作提供更多时间。考虑以下示例作为调整极狐GitLab Shell pod 的起点,以提高较大存储库工作负载的稳定性和效率。

yaml
1deployment: 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 的示例用法:

yaml
1tolerations: 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 的示例用法

yaml
annotations: kubernetes.io/example-annotation: annotation-value

外部服务#

此 chart 应连接到 Workhorse 服务。

Workhorse#

yaml
workhorse: host: workhorse.example.com serviceName: webservice port: 8181
名称类型默认值描述
hostStringWorkhorse 服务器的主机名。这可以省略,改为使用 serviceName
portInteger8181连接到 Workhorse 服务器的端口。
serviceNameStringwebservice操作 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 共享令牌。

yaml
authToken: secret: gitlab-shell-secret key: secret
名称类型默认值描述
authToken.keyString上述密钥中包含身份验证令牌的密钥的名称。
authToken.secretString要从中提取的 Kubernetes Secret 的名称。

LoadBalancer 服务#

如果 service.type 设置为 LoadBalancer,你可以选择指定 service.loadBalancerIP 来创建具有用户指定 IP 的 LoadBalancer(如果你的云提供商支持)。

你还可以选择指定 service.loadBalancerSourceRanges 列表,以限制可以访问 LoadBalancer 的 CIDR 范围(如果你的云提供商支持)。

有关 LoadBalancer 服务类型的更多信息,请参阅 Kubernetes 文档

yaml
1service: 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 实例上进行这些更改时,利用的可能性会 显著增加

yaml
opensshd: 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 的内容,而是扩展它们。

示例,通过 extraVolumesextraVolumeMounts 将 ConfigMap 的单个项目挂载到容器中:

yaml
1extraVolumes: | 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 的出站和入站限制到特定端点。

名称类型默认值描述
enabledBooleanfalse此设置启用 NetworkPolicy
ingress.enabledBooleanfalse设置为 true 时,将激活 Ingress 网络策略。这将阻止所有入站连接,除非指定了规则。
ingress.rulesArray[]入站策略的规则,详情请参阅 https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resource 和以下示例
egress.enabledBooleanfalse设置为 true 时,将激活 Egress 网络策略。这将阻止所有出站连接,除非指定了规则。
egress.rulesArray[]出站策略的规则,详情请参阅 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-systemprometheus 部署在命名空间 monitoringnginx-ingress 部署在命名空间 nginx-ingress

yaml
1networkpolicy: 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.requestrequest.memory.request 设置也设置为非零值。

如果未设置触发器,则不会创建 ScaledObject

名称类型默认值描述
enabledBooleanfalse使用 KEDA ScaledObjects 而不是 HorizontalPodAutoscalers
pollingIntervalInteger30检查每个触发器的间隔
cooldownPeriodInteger300在最后一个触发器报告活动后等待的时间,以便将资源缩放回 0
minReplicaCountIntegerKEDA 将资源缩放到的最小副本数,默认为 minReplicas
maxReplicaCountIntegerKEDA 将资源缩放到的最大副本数,默认为 maxReplicas
fallbackMapKEDA 回退配置,请参阅 文档
hpaNameStringKEDA 将创建的 HPA 资源名称,默认为 keda-hpa-{scaled-object-name}
restoreToOriginalReplicaCountBoolean指定目标资源是否应在 ScaledObject 被删除后缩放回原始副本数
behaviorMap上升和下降行为的规范,默认为 hpa.behavior
triggersArray触发器列表以激活目标资源的缩放,默认为根据 hpa.cpuhpa.memory 计算的触发器