代码之家  ›  专栏  ›  技术社区  ›  Necevil

如何集成gitlab ci w/azure kubernetes+kubectl+acr进行部署?

  •  13
  • Necevil  · 技术社区  · 6 年前

    我们以前基于gitlab的ci/cd使用了一个经过身份验证的curl请求到一个特定的rest api端点,以触发将一个更新的容器重新部署到我们的服务,如果您对基于kubernetes的部署使用了类似的东西,那么这个问题是针对您的。

    更多背景

    我们在azure aks集群上运行一个生产站点/应用程序(基于ghost blog)。现在,我们手动将更新后的容器推送到私有acr(azure容器注册表),然后使用kubectl从命令行进行更新。

    也就是说,我们以前使用Docker Cloud进行编排,并使用Gitlab CI完全集成地重新部署生产/登台服务。

    Gitlab CI集成是目标,也是这个问题背后的“原因”。

    我的问题

    由于我们以前使用过Docker Cloud(DOH,从一开始就应该是K8S),我们应该如何处理Gitlab CI能够利用Docker Cloud CLI创建的机密,然后使用Docker Cloud API进行身份验证,以触发我们节点上的操作(即使用新容器重新部署等)。

    虽然我相信我们可以构建一个包含kubectl和azure cli的容器(供gitlab ci runner使用),但我知道kubernetes也有一个类似的(与docker cloud类似的)rest api,可以在这里找到( https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster )具体来说,讨论不使用kubectl连接的部分似乎是相关的(关于http rest api的部分也是如此)。

    我向任何正在连接到azure(或潜在的其他托管kubernetes服务)的人提出的问题:

    您的ci/cd服务器如何与kubernetes服务提供商的管理服务器进行身份验证,然后您当前如何触发更新的容器/服务的更新/重新部署?

    如果您使用了kuberneteshttprestapi来重新部署服务,那么您的想法尤其有价值!

    Kubernetes资源我正在回顾

    1. How should I manage deployments with kubernetes
    2. Kubernetes Deployments

    将在我完成此过程时更新。

    2 回复  |  直到 6 年前
        1
  •  33
  •   EugeneRomero    6 年前

    创建集成

    我遇到了同样的问题,如何将gitlab ci/cd与我的azure aks kubernetes集群集成。我创造了这个 question 因为我在尝试将kubernetes cluester信息添加到gitlab时出错了。

    如何整合它们:

    1. 在Gitlab中,转到“操作”>“Kubernetes”菜单。
    2. 点击页面顶部的“添加kubernetes集群”按钮
    3. 您必须填写一些表单域,若要获取必须放入这些域中的内容,请使用 az login 命令,然后执行另一个命令以获取kubernetes群集凭据: az aks get-credentials --resource-group <resource-group-name> --name <kubernetes-cluster-name>
    4. 上一个命令将创建 ~/.kube/config 文件,打开这个文件,gitlab“add kubernetes cluster”表单中必须填写的字段的内容都在下面 .kube/config 文件

    这些是字段:

    1. Kubernetes群集名称: 它是你在azure上的集群的名称,在 Kube/CONFIG 文件也一样。
    2. API URL: 它是字段中的url server Kube/CONFIG 文件。
    3. CA证书: 是场 certificate-authority-data Kube/CONFIG 文件,但必须以base64解码。

    解码后肯定是这样的:

    -----BEGIN CERTIFICATE-----
    ...
    some base64 strings here
    ...
    -----END CERTIFICATE-----
    
    1. 令牌: 它是字段中十六进制字符的字符串 token Kube/CONFIG 文件(可能还需要以64为基数解码?)。您需要使用属于以下帐户的令牌 群集管理 特权,因此gitlab可以使用它在集群上进行身份验证和安装。最简单的方法是为gitlab创建一个新帐户:使用服务帐户定义创建一个yaml文件(可以看到一个示例 here 在下面 在默认命名空间中创建gitlab服务帐户 )并通过 kubectl apply -f serviceaccount.yml
    2. 项目命名空间(可选,唯一): 我把它留空,还不知道这个名称空间可以用在什么地方。

    点击“保存”就完成了。您的gitlab项目现在必须连接到kubernetes集群。

    部署

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

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

    要在部署作业中注入这些变量,需要满足以下条件:

    • 您必须正确地将kubernetes集群添加到gitlab项目的菜单“operations”>“kubernetes”和我上面描述的这些步骤中
    • 您的作业必须是gitlab ci中的“部署作业”,才能被视为部署作业、作业定义(在 .gitlab-ci.yml )必须有一个 environment 键(请看下面的第31行 example ,并且环境名称必须与您在“操作”>“环境”菜单中使用的名称匹配。

    下面是一个 .gitlab-ci.yml 分三个阶段:

    • 建造: 它构建一个docker映像并将其推送到gitlab私有注册表
    • 测试: 它什么也没做,只要放一个 exit 0 以后再改
    • 部署: 下载稳定版本的 库贝特尔 复制 Kube/CONFIG 能够运行的文件 库贝特尔 集群中的命令并执行 kubectl cluster-info 以确保它工作正常。在我的项目中,我没有完成编写部署脚本来真正执行部署。但这 Kubectl群集信息 命令执行正常。

    提示: 要查看所有环境变量及其值(jenkins有一个包含此视图的页面,gitlab ci没有),可以执行以下命令 env 在部署阶段的脚本中。调试作业有很大帮助。

        2
  •  0
  •   Necevil    6 年前

    我今天登录了gitlab的ci后端,看到了一个“kubernetes”按钮以及一个在gcp节省500美元的提议。

    $500 at GCP with GitLab-Ci Kubernetes

    吉特拉布库伯内特斯

    点击回购的kubernetes gitlab页面的url是: https://gitlab.com/^your-repo^/clusters

    当我完成集成过程时,我会更新这个答案(但也欢迎!).

    官方Gitlab Kubernetes集成文档

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