如何将 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