Gitlab CI/CD: 部署 Docker 镜像到现有的 Kubernetes 集群

85次阅读
没有评论

问题描述

有一个 Node.js 应用程序,需要部署到现有的 Kubernetes 集群中。该集群是在 AWS 上使用 kops 进行设置的。用户已经创建了一个用于构建 Docker 镜像的 .gitlab-ci.yml 文件。因此,每当对 masterdevelop 分支进行更改时,都会构建 Docker 镜像。现在,用户需要将其部署到现有的 Kubernetes 集群中。用户已经按照这里提到的步骤添加了现有的集群。目前,用户正在使用共享的 Runner。用户想知道如何在构建完成后,将 Kubernetes 部署与 GitLab CI/CD 集成,以在 AWS 上部署(使用 kops 创建的集群)。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

步骤1:配置 GitLab CI/CD

首先,需要在 GitLab CI/CD 中配置相关的作业和环境变量。以下是一个示例的 .gitlab-ci.yml 文件:

stages:
  - docker-build
  - deploy

docker-build-master:
  image: docker:latest
  stage: docker-build
  services:
    - docker:dind
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - docker build --pull -t "$CI_REGISTRY_IMAGE:prod" .
    - docker push "$CI_REGISTRY_IMAGE:prod"
  only:
    - master

deploy-prod:
  stage: deploy
  image: roffe/kubectl
  script:
    - kubectl apply -f $CI_PROJECT_DIR/scheduler-deployment.yaml
  only:
    - master

docker-build-dev:
  image: docker:latest
  stage: docker-build
  services:
    - docker:dind
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - docker build --pull -t "$CI_REGISTRY_IMAGE:dev" .
    - docker push "$CI_REGISTRY_IMAGE:dev"
  only:
    - develop

在上面的示例中,我们定义了三个阶段:docker-builddeploydocker-build-devdocker-build-master 阶段用于构建生产环境的 Docker 镜像,并将其推送到 GitLab 的容器注册表。deploy-prod 阶段用于将构建好的镜像部署到 Kubernetes 集群中。docker-build-dev 阶段用于构建开发环境的 Docker 镜像,并将其推送到 GitLab 的容器注册表。根据需要,可以根据不同的分支和环境进行调整。

步骤2:解决路径问题

根据你提供的错误信息,你遇到了一个路径问题。当 GitLab 在容器中执行作业时,它会将项目目录挂载到容器中的 /builds 目录。你可以通过指定 /builds/scheduler-deployment.yaml 或使用预定义的环境变量 $CI_PROJECT_DIR 结合 $CI_PROJECT_DIR/scheduler-deployment.yaml 来引用该路径。请确保在 kubectl apply 命令中使用正确的路径。

步骤3:部署文件

确保 scheduler-deployment.yaml 文件是一个有效的 YAML 文件,并且在手动部署时能够正常工作。你可以使用以下示例作为参考:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: scheduler-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: scheduler
  template:
    metadata:
      labels:
        app: scheduler
    spec:
      containers:
        - name: scheduler
          image: registry.gitlab.com/user/schedulingapis:dev
          env:
            - name: REDIS_HOST
              value: "redis://redis-master"
            - name: RABBITMQ_HOST
              value: "amqp://rabbitmq"
      imagePullSecrets:
        - name: registry-credentials

请确保在部署文件中使用正确的镜像和环境变量。

步骤4:自动化部署

完成上述步骤后,当你将代码推送到 master 分支时,GitLab CI/CD 将自动构建 Docker 镜像,并将其部署到 Kubernetes 集群中。你可以根据需要调整 .gitlab-ci.yml 文件中的阶段和触发条件。

希望这些信息对你有所帮助。如果你有任何进一步的问题,请随时提问。

正文完