问题描述
有一个 Node.js 应用程序,需要部署到现有的 Kubernetes 集群中。该集群是在 AWS 上使用 kops
进行设置的。用户已经创建了一个用于构建 Docker 镜像的 .gitlab-ci.yml
文件。因此,每当对 master
或 develop
分支进行更改时,都会构建 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-build
、deploy
和 docker-build-dev
。docker-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
文件中的阶段和触发条件。
希望这些信息对你有所帮助。如果你有任何进一步的问题,请随时提问。