使用集群证书部署到 Kubernetes 集群 (已弃用)
- 层级:Free, Premium, Ultimate
- 提供方式:GitLab.com, GitLab Self-Managed
此功能已在 GitLab 14.5 中 已弃用。 要将您的集群连接到 GitLab,请使用 GitLab agent for Kubernetes。 要使用代理进行部署,请使用 CI/CD workflow。
Kubernetes 集群可以作为部署作业的目标。如果
- 集群已与 GitLab 集成,您的作业将可使用特殊的 部署变量,无需进行配置。您可以使用
kubectl或helm等工具立即开始从作业中与集群交互。 - 如果您不使用 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_SLUGapp.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权限。 - 缺少
KUBECONFIG或KUBE_TOKEN部署变量。要将其传递给您的作业,它们必须具有匹配的environment:name。如果您的作业没有设置environment:name,则 Kubernetes 凭据不会传递给它。
从 GitLab 12.0 或更早版本升级的项目级集群可能以导致此错误的方式进行配置。如果您想自己管理命名空间和服务账户,请确保清除 GitLab 管理的集群 选项。