Kubernetes - Как настроить параллельные кластеры (Prod, Dev), совместно использующие одни и те же репозитории / конвейер - PullRequest
0 голосов
/ 18 февраля 2020

В настоящее время я сталкиваюсь с ситуацией, когда мне нужно развернуть небольшой кластер (пока только 4 модуля), который будет содержать 4 различных микросервиса. Этот кластер должен быть продублирован, чтобы у меня был один кластер PRODUCTION и один кластер DEVELOPMENT.

Даже если это не сложно, с моей точки зрения (Создание кластера с последующей загрузкой docker изображений в модули с параметрами в Чтобы использовать правильные строки подключения ресурсов), я застрял в части CD / CI.

Из триггера CloudBuild, как нарисовать sh Docker изображение справа " кластер ", я абсолютно не знаю, как этого добиться ...

Есть мой cloudbuild.yaml

steps:
  #step 1 - Getting the previous (current) image
  - name: 'gcr.io/cloud-builders/docker'
    entrypoint: 'bash'
    args: [
      '-c',
      'docker pull gcr.io/{PROJECT_ID}/{SERVICE_NAME}:latest || exit 0'
    ]
  #step 2 - Build the image and push it to gcr.io
  - name: 'gcr.io/cloud-builders/docker'
    args: [
      'build',
      '-t',
      'gcr.io/{PROJECT_ID}/{SERVICE_NAME}',
      '-t',
      'gcr.io/{PROJECT_ID}/{SERVICE_NAME}:latest',
      '.'
    ]
  #step 3 - Deploy our container to our cluster
  - name: 'gcr.io/cloud-builders/kubectl'
    args: ['apply', '-f', 'service.yaml', '--force']
    env:
      - 'CLOUDSDK_COMPUTE_ZONE={CLUSTER_ZONE}'
      - 'CLOUDSDK_CONTAINER_CLUSTER={CLUSTER_NAME}'
  #step 4 - Set the image
  - name: 'gcr.io/cloud-builders/kubectl'
    args: [
      'set',
      'image',
      'deployment',
      '{SERVICE_NAME}',
      '{SERVICE_NAME}=gcr.io/{PROJECT_ID}/{SERVICE_NAME}'
    ]
    env:
      - 'CLOUDSDK_COMPUTE_ZONE={CLUSTER_ZONE}'
      - 'CLOUDSDK_CONTAINER_CLUSTER={CLUSTER_NAME}'
# push images to Google Container Registry with tags
images: [
  'gcr.io/{PROJECT_ID}/{SERVICE_NAME}',
  'gcr.io/{PROJECT_ID}/{SERVICE_NAME}:latest'
]

Кто-нибудь может мне помочь? Я не знаю, в каком направлении go к ..

Ответы [ 3 ]

1 голос
/ 19 февраля 2020

Итак, мой вопрос:

Как вы запускаете эти сборки? Вручную? GitHub Trigger? HTTP Trigger с использованием REST API?

, так что вы почти готовы к созданию / переносу части, вам нужно будет использовать переменные подстановки https://cloud.google.com/cloud-build/docs/configuring-builds/substitute-variable-values

Если вы будет запускать сборки вручную, вы бы отредактировали триггер сборки и изменили под переменную так, как хотите. GitHub Trigger - это немного сложнее, так как вы можете делать релизы или ветки. HTTP Trigger, так же, как ручной, в вашем запросе вы меняете под переменную.

Итак, вот часть одного из наших файлов сборки репо, как вы увидите, есть разные подпрограммы. переменные, которые мы используем, иногда мы хотим построить образ и развернуть его в кластере, в других случаях мы просто хотим построить или развернуть.

steps:
# pull docker image
- name: 'gcr.io/cloud-builders/docker'
  id: pull-docker-image
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    docker pull $${_TAG_DOCKER_IMAGE} || exit 0

# build docker image
- name: 'gcr.io/cloud-builders/docker'
  id: build-docker-image
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    if [[ "${_BUILD_IMAGE}" == "true" ]]; then
       docker build -t ${_DOCKER_IMAGE_TAG} --cache-from $${_TAG_DOCKER_IMAGE} .;
    else
       echo "skipping ... BUILD_IMAGE=${_BUILD_IMAGE}";
    fi

# push docker image
- name: 'gcr.io/cloud-builders/docker'
  id: push-docker-image
  entrypoint: 'bash'
  args:
  - '-c'
  - |
     if [[ "${_BUILD_IMAGE}" == "true" ]]; then
        docker push ${_DOCKER_IMAGE_TAG};
     else
        echo "skipping ... BUILD_IMAGE=${_BUILD_IMAGE}";
     fi

# tag docker image
- name: 'gcr.io/cloud-builders/gcloud'
  id: tag-docker-image
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    if [[ "${_BUILD_IMAGE}" == "true" ]]; then
       gcloud container images add-tag ${_DOCKER_IMAGE_TAG} $${_TAG_DOCKER_IMAGE} -q;
    else
       echo "skipping ... BUILD_IMAGE=${_BUILD_IMAGE}";
    fi


# update service image on environment
- name: 'gcr.io/cloud-builders/kubectl'
  id: update service deployment image
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    if [[ "${_UPDATE_CLUSTER}" == "true" ]]; then
       /builder/kubectl.bash set image deployment $REPO_NAME master=${_DOCKER_IMAGE_TAG} --namespace=${_DEFAULT_NAMESPACE};
    else
       echo "skipping ... UPDATE_CLUSTER=${_UPDATE_CLUSTER}";
    fi
  env:
  - 'CLOUDSDK_COMPUTE_ZONE=${_CLOUDSDK_COMPUTE_ZONE}'
  - 'CLOUDSDK_CONTAINER_CLUSTER=${_CLOUDSDK_CONTAINER_CLUSTER}'


# subs are needed because of our different ENVs
# _DOCKER_IMAGE_TAG = ['gcr.io/$PROJECT_ID/$REPO_NAME:gcb-${_COMPANY_ENV}-$SHORT_SHA', 'other']
# _COMPANY_ENV = ['dev', 'staging', 'prod']
# _DEFAULT_NAMESPACE = ['default'] or ['custom1', 'custom2']
# _CLOUDSDK_CONTAINER_CLUSTER = ['dev', 'prod']
# _CLOUDSDK_COMPUTE_ZONE = ['us-central1-a']
# _BUILD_IMAGE = ['true', 'false']
# _UPDATE_CLUSTER = ['true', 'false']
substitutions:
    _DOCKER_IMAGE_TAG: $DOCKER_IMAGE_TAG
    _COMPANY_ENV: dev
    _DEFAULT_NAMESPACE: default
    _CLOUDSDK_CONTAINER_CLUSTER: dev
    _CLOUDSDK_COMPUTE_ZONE: us-central1-a
    _BUILD_IMAGE: 'true'
    _UPDATE_CLUSTER: 'true'
options:
    substitution_option: 'ALLOW_LOOSE'
    env:
    - _TAG_DOCKER_IMAGE=gcr.io/$PROJECT_ID/$REPO_NAME:${_COMPANY_ENV}-latest
    - DOCKER_IMAGE_TAG=gcr.io/$PROJECT_ID/$REPO_NAME:gcb-${_COMPANY_ENV}-$SHORT_SHA
tags:
- '${_COMPANY_ENV}'
- 'build-${_BUILD_IMAGE}'
- 'update-${_UPDATE_CLUSTER}'

у нас есть два рабочих процесса -

  1. Триггер github собирается и развертывается в среде 'dev'.
  2. мы запускаем через REST API https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.builds/create (мы заменяем переменные через запрос. json) - этот метод также работает с использованием gcloud builds --substitutions CLI.

Надеюсь, что ответит на ваш вопрос!

1 голос
/ 23 февраля 2020

Краткий ответ для этого - применить методы развертывания GitOps в вашем рабочем процессе.

  1. Все ваши YAML или Helmcharts Kubernetes находятся в одном репозитории git, который используется оператором GitOps.
  2. В вашем конвейере CI вам нужно только создавать и извлекать sh docker изображений.
  3. Оператор GitOps интеллектуально выбирает версии изображений и вносит изменения и фиксирует целевой YAML Kubernetes в хранилище.
  4. Каждое изменение в хранилище GitOps применяется к кластеру.

См. https://fluxcd.io/

1 голос
/ 18 февраля 2020

Знаете ли вы диаграмма руля ? Он предназначен для развертывания другой среды.

С другим файлом values.yaml вы можете быстро выполнить развертывание в другой среде с одинаковой базой исходного кода.

Например, вы можете назвать файл values.yaml в среде.

values-dev.yaml
values-sit.yaml
values-prod.yaml

единственными различиями являются некоторые varialbes, такие как окружение (dev / sit / prod) и пространства имен.

поэтому при запуске развертывания это будет:

env=${ENVIRONMENT}
helm install -f values-${env}.yaml myredis ./redis
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...