如何将 GitLab-Ci 与 Azure Kubernetes + Kubectl + ACR 集成以进行部署?

Posted

技术标签:

【中文标题】如何将 GitLab-Ci 与 Azure Kubernetes + Kubectl + ACR 集成以进行部署?【英文标题】:How to Integrate GitLab-Ci w/ Azure Kubernetes + Kubectl + ACR for Deployments? 【发布时间】:2018-11-17 19:59:52 【问题描述】:

我们之前基于 GitLab 的 CI/CD 使用对特定 REST API 端点的经过身份验证的 curl 请求来触发将更新的容器重新部署到我们的服务,如果您对基于 Kubernetes 的部署使用类似的东西,这个问题适合您。

更多背景

我们在 Azure AKS 群集上运行生产站点/应用程序(基于 Ghost 博客)。现在我们手动将更新后的容器推送到私有 ACR(Azure 容器注册表),然后使用 Kubectl 从命令行进行更新。

话虽如此,我们之前使用 Docker Cloud 进行编排,并使用 GitLab-Ci 完全集成重新部署我们的生产/登台服务。

GitLab-Ci 集成是目标,也是这个问题背后的“原因”。

我的问题

既然我们之前使用过 Docker Cloud(哦,应该从一开始就使用 K8s),我们应该如何处理 GitLab-Ci 能够利用 Secrets 创建 Docker Cloud CLI 然后使用 Docker Cloud API 进行身份验证的事实触发我们节点上的操作(即使用新容器重新部署等)。

虽然我相信我们可以构建一个包含 Kubectl 和 Azure CLI 的容器(供我们的 GitLab-Ci 运行程序使用),但我知道 Kubernetes 也有一个类似的(类似于 docker cloud)可以找到的 Rest API这里 (https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster) — 特别是关于在没有 Kubectl 的情况下进行连接的部分似乎是相关的(关于 HTTP REST API 的部分也是如此)。

我对连接到 Azure(或可能的其他托管 Kubernetes 服务)的任何人的问题:

您的 Ci/CD 服务器如何通过您的 Kubernetes 服务提供商的管理服务器进行身份验证,然后您当前如何触发更新/重新部署已更新的容器/服务?

如果您使用 Kubernetes HTTP Rest API 重新部署服务,您的想法将特别有价值!

我正在审查的 Kubernetes 资源

    How should I manage deployments with kubernetes Kubernetes Deployments

将在我完成整个过程时更新。

【问题讨论】:

【参考方案1】:

我今天登录了我们的 GitLab-Ci 后端,看到了一个“Kubernetes”按钮,以及在 GCP 上节省 500 美元的提议。

GitLab Kubernetes

点击你的 repo 的 Kubernetes GitLab 页面的 URL 是: https://gitlab.com/^your-repo^/clusters

在完成集成过程时,我将更新此答案(但也欢迎!)。

官方 GitLab Kubernetes 集成文档

https://docs.gitlab.com/ee/user/project/clusters/index.html

【讨论】:

感兴趣的:about.gitlab.com/2018/08/22/gitlab-11-2-released/…【参考方案2】:

创建集成

我在如何将 GitLab CI/CD 与我的 Azure AKS Kubernetes 集群集成时遇到了同样的问题。我创建了这个question,因为我在尝试将我的 Kubernetes 线索信息添加到 GitLab 时遇到了一些错误。

如何整合它们:

    在 GitLab 中,转到“操作”>“Kubernetes”菜单。 点击页面顶部的“添加Kubernetes集群”按钮 您必须填写一些表单字段,以获取您必须放入这些字段的内容,使用az login 命令从 CLI(您需要在您的 PC 上安装 Azure CLI)连接到您的 Azure 帐户,然后然后执行此其他命令以获取 Kubernetes 集群凭据:az aks get-credentials --resource-group <resource-group-name> --name <kubernetes-cluster-name> 前面的命令会创建一个~/.kube/config文件,打开这个文件,你要在GitLab“添加Kubernetes集群”表单中填写的字段内容都在这个.kube/config文件里面

这些是字段:

    Kubernetes 集群名称:这是您在 Azure 上的集群的名称,它也在 .kube/config 文件中。 API URL:它是.kube/config 文件的server 字段中的URL。 CA 证书:这是.kube/config 文件的certificate-authority-data 字段,但您必须对其进行base64 解码。

解码后,一定是这样的:

-----BEGIN CERTIFICATE-----
...
some base64 strings here
...
-----END CERTIFICATE-----
    令牌:它是.kube/config 文件的token 字段中的十六进制字符字符串(它可能还需要进行base 64 解码?)。您需要使用属于具有 cluster-admin 权限的帐户的令牌,以便 GitLab 可以使用它在集群上进行身份验证和安装。实现这一点的最简单方法是为 GitLab 创建一个新帐户:使用服务帐户定义创建一个 YAML 文件(可以在 在默认命名空间中创建一个 gitlab 服务帐户下查看here 下的示例) 并通过kubectl apply -f serviceaccount.yml 将其应用于您的集群。 项目命名空间(可选,唯一):我把它留空,还不知道这个命名空间可以用于什么或在哪里。

点击“保存”即可。您的 GitLab 项目现在必须连接到您的 Kubernetes 集群。

部署

在您的部署作业中(在管道中),您需要一些环境变量来使用kubectl 命令访问您的集群,以下是所有可用变量的列表:

https://docs.gitlab.com/ee/user/project/clusters/index.html#deployment-variables

要将这些变量注入到您的部署作业中,需要满足一些条件:

您必须已将 Kubernetes 集群正确添加到您的 GitLab 项目中,菜单“操作”>“Kubernetes”以及我上面描述的这些步骤 您的工作必须是“部署工作”,在 GitLab CI 中,要被视为部署工作,您的工作定义(在您的 .gitlab-ci.yml 中)必须有一个 environment 键(查看第 31 行这个example),并且环境名称必须与您在菜单“操作”>“环境”中使用的名称匹配。

下面是一个.gitlab-ci.yml 的示例,包含三个阶段:

构建:它构建一个 docker 镜像并将其推送到 gitlab 私有注册表 测试:它还没有做任何事情,只需输入exit 0 以便稍后更改它 部署:下载kubectl的稳定版本,复制.kube/config文件以便能够在集群中运行kubectl命令并执行kubectl cluster-info以确保其正常工作。在我的项目中,我没有完成编写部署脚本来真正执行部署。但是这个kubectl cluster-info 命令执行得很好。

提示:要查看所有环境变量及其值(Jenkins 有一个带有此视图的页面,GitLab CI 没有)您可以在脚本中执行命令env您的部署阶段。它对调试作业有很大帮助。

【讨论】:

很好的答案!接受这一点,并在我完成整个过程时添加关于我实施它的经验的任何想法!感谢您花时间发帖! 我更新了这个答案以添加有关此集成过程的部署步骤的一些信息。 @imcarreiro 真是伟大的工作人员!真的很兴奋,因为这是我的最后一个问题。实际上,通过在其中使用 Kubectl 重新构建我的构建容器,然后以这种方式运行命令,我实际上得到了相同的一般概念,但是您在这里拥有的本机 GitLab 设置真的非常酷。一有机会我会尝试一下,我当然对这应该启用的功能分支测试的可访问性感兴趣! 我确实尝试过做所有这些事情,但是当我在 gitlab 站点上按下“安装 Helm”按钮时,我仍然收到错误“安装 Helm Tiller Kubernetes 时出现问题”错误。 .我应该如何检查配置是否正确? @igor,看看我在 .gitlab-ci.yml 中的部署作业:gist.github.com/lmcarreiro/202c61170504239933fe831d382601dd 你可以尝试从 CI 作业运行 kubectl,看看它是否有效...

以上是关于如何将 GitLab-Ci 与 Azure Kubernetes + Kubectl + ACR 集成以进行部署?的主要内容,如果未能解决你的问题,请参考以下文章

如何将存储库中的文件复制到用于作业的 Docker 容器中,在 gitlab-ci.yml

如何使用 AWS CodeDeploy/CodePipeline/S3 将 Gitlab-Ci 部署到 EC2

将脚本附加到一个阶段 .gitlab-ci.yml

gitlab-CI中使用tag作为版本号硬编译进程序中

如何利用Gitlab-ci持续部署到远程机器?

如何将 Azure Policy 与 Azure DevOps 集成?