Help us learn about your current experience with the documentation. Take the survey.

使用集群证书部署到 Kubernetes 集群 (已弃用)

  • 层级:Free, Premium, Ultimate
  • 提供方式:GitLab.com, GitLab Self-Managed

此功能已在 GitLab 14.5 中 已弃用。 要将您的集群连接到 GitLab,请使用 GitLab agent for Kubernetes。 要使用代理进行部署,请使用 CI/CD workflow

Kubernetes 集群可以作为部署作业的目标。如果

  • 集群已与 GitLab 集成,您的作业将可使用特殊的 部署变量,无需进行配置。您可以使用 kubectlhelm 等工具立即开始从作业中与集群交互。
  • 如果您不使用 GitLab 集群集成,您仍然可以部署到您的集群。但是,您必须在使用作业与集群交互之前,使用 CI/CD 变量 自己配置 Kubernetes 工具。

部署变量

部署变量需要一个名为 gitlab-deploy-token 的有效 部署令牌,并在您的部署作业脚本中包含以下命令,以便 Kubernetes 能够访问镜像仓库:

  • 使用 Kubernetes 1.18+:

    kubectl create secret docker-registry gitlab-registry --docker-server="$CI_REGISTRY" --docker-username="$CI_DEPLOY_USER" --docker-password="$CI_DEPLOY_PASSWORD" --docker-email="$GITLAB_USER_EMAIL" -o yaml --dry-run=client | kubectl apply -f -
  • 使用 Kubernetes <1.18:

    kubectl create secret docker-registry gitlab-registry --docker-server="$CI_REGISTRY" --docker-username="$CI_DEPLOY_USER" --docker-password="$CI_DEPLOY_PASSWORD" --docker-email="$GITLAB_USER_EMAIL" -o yaml --dry-run | kubectl apply -f -

Kubernetes 集群集成将这些 部署变量 暴露在 GitLab CI/CD 构建环境中,供部署作业使用。部署作业已 定义了目标环境

部署变量 描述
KUBE_URL 等于 API URL。
KUBE_TOKEN 环境服务账户 的 Kubernetes 令牌。
KUBE_NAMESPACE 与项目部署服务账户关联的命名空间。格式为 <project_name>-<project_id>-<environment>。对于 GitLab 管理的集群,GitLab 会在集群中自动创建一个匹配的命名空间。如果您的集群是在 GitLab 12.2 之前创建的,则默认的 KUBE_NAMESPACE 设置为 <project_name>-<project_id>
KUBE_CA_PEM_FILE 包含 PEM 数据的文件的路径。仅在指定了自定义 CA 包时才存在。
KUBE_CA_PEM (已弃用) 原始 PEM 数据。仅在指定了自定义 CA 包时才存在。
KUBECONFIG 包含此部署的 kubeconfig 的文件的路径。如果指定了 CA 包,则会嵌入该包。此配置还嵌入了在 KUBE_TOKEN 中定义的同一令牌,因此您可能只需要此变量。如果使用 kubectl,此变量名也会被自动识别,因此您无需显式引用它。
KUBE_INGRESS_BASE_DOMAIN 此变量可用于为每个集群设置域名。有关更多信息,请参阅 集群域名

自定义命名空间

Kubernetes 集成为部署作业提供了一个带有自动生成命名空间的 KUBECONFIG。默认情况下,它使用项目-环境特定的命名空间,格式为 <prefix>-<environment>,其中 <prefix> 的格式为 <project_name>-<project_id>。有关更多信息,请参阅 部署变量

您可以通过几种方式自定义部署命名空间:

  • 您可以选择 每个 环境 一个命名空间每个项目一个命名空间。每个环境一个命名空间是默认和推荐的设置,因为它可以防止生产和非生产环境之间的资源混合。
  • 当使用项目级集群时,您还可以自定义命名空间前缀。当使用每个环境一个命名空间时,部署命名空间是 <prefix>-<environment>,否则只是 <prefix>
  • 对于 非托管 集群,自动生成的命名空间在 KUBECONFIG 中设置,但用户负责确保其存在。您可以使用 .gitlab-ci.yml 中的 environment:kubernetes:namespace 完全自定义此值。

当您自定义命名空间时,现有环境将继续链接到其当前命名空间,直到您 清除集群缓存

保护凭据

默认情况下,任何可以创建部署作业的人都可以访问环境部署作业中的任何 CI/CD 变量。这包括 KUBECONFIG,它授予访问集群中关联服务账户可用的任何秘密的权限。为了保护您的生产凭据安全,请考虑使用 受保护的环境,并结合以下一种方法:

  • GitLab 管理的集群和每个环境一个命名空间。
  • 每个受保护环境一个作用域的集群。同一个集群可以多次添加,并使用多个受限的服务账户。

Kubernetes 集群的 Web 终端

Kubernetes 集成为您的 环境 添加了 Web 终端 支持。这基于 Docker 和 Kubernetes 中找到的 exec 功能,因此您可以在现有容器中获得一个新的 shell 会话。要使用此集成,您应使用本页的部署变量部署到 Kubernetes,并确保任何部署、副本集和 Pod 都使用以下注释进行标注:

  • app.gitlab.com/env: $CI_ENVIRONMENT_SLUG
  • app.gitlab.com/app: $CI_PROJECT_PATH_SLUG

$CI_ENVIRONMENT_SLUG$CI_PROJECT_PATH_SLUG 是 CI/CD 变量的值。

您必须是项目所有者或拥有 maintainer 权限才能使用终端。支持仅限于您环境中第一个 Pod 的第一个容器。

故障排除

在部署作业开始之前,GitLab 会为部署作业专门创建以下内容:

  • 一个命名空间。
  • 一个服务账户。

但是,有时 GitLab 无法创建它们。在这种情况下,您的作业可能会失败并显示以下消息:

This job failed because the necessary resources were not successfully created.

要查找创建命名空间和服务账户时此错误的原因,请检查 日志

失败的原因包括:

  • 您提供给 GitLab 的令牌没有 GitLab 所需的 cluster-admin 权限。
  • 缺少 KUBECONFIGKUBE_TOKEN 部署变量。要将其传递给您的作业,它们必须具有匹配的 environment:name。如果您的作业没有设置 environment:name,则 Kubernetes 凭据不会传递给它。

从 GitLab 12.0 或更早版本升级的项目级集群可能以导致此错误的方式进行配置。如果您想自己管理命名空间和服务账户,请确保清除 GitLab 管理的集群 选项。