블루/그린 배포하 portainer 를 사용하여 gitlab CI/CD

0

질문

나는 웹 서비스를 사용하여 websocket,그리고 필요한 구현 가동 중지 시간이 없는 배포합니다. 기 때문에 나는 원하지 않을 드롭 기존의 연결에 배포하고,내가 결정을 구현하는 파랑/녹색을 배포할 수 있습니다. 나의 실제적인 솔루션 내용:

  1. 내가 만든 두 개의 동일한 서비스에 portainer 듣고,서로 다른 포트에서. 모든 서비스는 설정 노드에 있는 환경부 식별 예를 들어, alfabeta
  2. 두 서비스는 뒤에 숨겨진 로드 밸런서와 밸런서는 정기적으로 확인 상태의 각 서비스입니다. 는 경우에는 서비스 응답에서 특정한 경로(/분산-keepalive 확인)문자열"확인",이 서비스는 활성과 분산할 수 있는 라우팅을 이 서비스를 제공합니다. 는 경우 서비스의 응답으로 문자열"STOP",밸런서 이 서비스에 액세스 할 수없는,하지만 활성 연결이 유지됩
  3. 는 서비스가 활성화하고 있는 중입니다 동기화 redis. Redis 있는 열쇠 lb.service.alfalb.service.beta 할 수 있는 값을 포함 1active0 을 위한 비활성화됩니다. 예 구현의 /분산-keepalive 인 경로에 nestjs:
    import {Controller, Get} from '@nestjs/common';
    import {RedisClient} from "redis";
    const { promisify } = require("util");
    
    
    @Controller()
    export class AppController {
    
        private redisClient = new RedisClient({host: process.env.REDIS_HOST});
        private serviceId:string = process.env.ID;  //alfa, beta
    
        @Get('balancer-keepalive-check')
        async balancerCheckAlive(): Promise<string> {
            const getAsync = promisify(this.redisClient.get).bind(this.redisClient);
            return getAsync(`lb-status-${this.serviceId}`).then(status => {
                const reply: string = status == 1 ? 'OK' : 'STOP';
                return `<response>${reply}</response>`;
            })
        }
    }
  1. 에 gitlab CI 만들커 태그 이미지 태그에 투입하고,서비스 다시 시작 전화 portainer webhook 에 대한 특정한 서비스입니다. 이 잘 작동을 위한 1 서비스,그러나지 않을 사용하는 방법을 알고 2 다른 DEPLOY_WEBHOOK CI 변수들 사이를 전환합니다.
image: registry.rassk.work/pokec/pokec-nodejs-build-image:p1.0.1
services:
  - name: docker:dind

variables:
  DOCKER_TAG: platform-websocket:$CI_COMMIT_TAG

deploy:
  tags:
    - dtm-builder
  environment:
    name: $CI_COMMIT_TAG
  script:
    - npm set registry http://some-private-npm-registry-url.sk
    - if [ "$ENV_CONFIG" ]; then cp $ENV_CONFIG $PWD/.env; fi
    - if [ "$PRIVATE_KEY" ]; then cp $PRIVATE_KEY $PWD/privateKey.pem; fi
    - if [ "$PUBLIC_KEY" ]; then cp $PUBLIC_KEY $PWD/publicKey.pem; fi
    - docker build -t $DOCKER_TAG .
    - docker tag $DOCKER_TAG registry.rassk.work/community/$DOCKER_TAG
    - docker push registry.rassk.work/community/$DOCKER_TAG
    - curl --request POST $DEPLOY_WEBHOOK
  only:
    - tags

나의 질문을 내가 알지 못하는 방법을 해결하고 있:

  • 있을 때 2 는 서비스,나는 2 개의 서로 다른 배포 webhook 에서는 내가 필요로 중 하나를 호출한 후에 배포하기 때문에,나는 원하지 않는 다시 시작이 모두 서비스입니다. 을 확인하는 방법 중 하나? 구현 방법은 어떤 종류의 카운터,는 경우에는 이를 배포해"알파"또는"베타 서비스"? 를 사용해야 하 gitlab api 업데이트 DEPLOY_WEBHOOK 후 각 배포하시겠습니까? 또는 당신의 제거 나 이 gitlab CI/CD 변수 API 를 사용하는 서비스에는 것입니다.webhook url?
  • 어떻게 업데이트 값에 redis? 어야 나는 사용자 정의를 구현을 위한 API 를 이?
  • 는 존재가 있는 더 좋은 방법이 이것을 달성하는 방법?

추가 정보:이용할 수 없 gitlab api 에서 serviceses 기 때문에,우리의 gitlab 은 자체에서 호스팅하는 도메인에서만 액세스할 수 있습니다 우리의 개인 네트워크입니다.

1

최고의 응답

0

나는 수정된 내 AppController. 거기에는 2 개의 새로운 끝점 이제,한해를 식별하는 서비스가 실행되고,두 번째 스위치 값을 redis:

private serviceId:string = process.env.ID || 'alfa';

    @Get('running-service-id')
    info(){
        return this.serviceId
    }

    @Get('switch')
    switch(){
        const play = this.serviceId == 'alfa' ? `lb-status-beta` : `lb-status-alfa`;
        const stop = `lb-status-${this.serviceId}`;
        this.redisClient.set(play, '1', (err) => {
            if(!err){
                this.redisClient.set(stop, '0');
            }
        })
    }

그 후,나는 수정된 내 gitlab-ci.yml 다음과 같다:

image: registry.rassk.work/pokec/pokec-nodejs-build-image:p1.0.1
services:
  - name: docker:dind

stages:
  - build
  - deploy
  - switch

variables:
  DOCKER_TAG: platform-websocket:$CI_COMMIT_TAG

test:
  stage: build
  allow_failure: true
  tags:
    - dtm-builder
  script:
    - npm set registry http://some-private-npm-registry-url.sk
    - npm install
    - npm run test

build:
  stage: build
  tags:
    - dtm-builder
  environment:
    name: $CI_COMMIT_TAG
  script:
    - if [ "$ENV_CONFIG" ]; then cp $ENV_CONFIG $PWD/.env; fi
    - if [ "$PRIVATE_KEY" ]; then cp $PRIVATE_KEY $PWD/privateKey.pem; fi
    - if [ "$PUBLIC_KEY" ]; then cp $PUBLIC_KEY $PWD/publicKey.pem; fi
    - docker build -t $DOCKER_TAG .
    - docker tag $DOCKER_TAG registry.rassk.work/community/$DOCKER_TAG
    - docker push registry.rassk.work/community/$DOCKER_TAG
  only:
    - tags

deploy:
  stage: deploy
  needs: [build, test]
  environment:
    name: $CI_COMMIT_TAG
  script:
    - 'SERVICE_RUNNING=$(curl --request GET http://172.17.101.125/running-service-id)'
    - echo $SERVICE_RUNNING
    - if [ "$SERVICE_RUNNING" == "1" ]; then curl --request POST $DEPLOY_WEBHOOK_2; fi
    - if [ "$SERVICE_RUNNING" == "2" ]; then curl --request POST $DEPLOY_WEBHOOK_1; fi
  only:
    - tags

switch:
  stage: switch
  needs: [deploy]
  environment:
    name: $CI_COMMIT_TAG
  script:
    - sleep 10
    - curl --request GET http://172.17.101.125/switch
  only:
    - tags

에서 직업 을 구축 도커 이미지를 구축. 후 실행하는 작업이 배포하는 요청을 실행-서비스 id 및를 식별하는 서비스를 실행. 배포 이미지를 중지한 서비스입니다. 마지막 하나입니다 작업 스위치만들 것을 요청하는 스위치,경로는 스위치 값을 redis.

이 잘 작동합니다. 마지막 것은 내가 필요로 구현하는 것은 어떤 종류의 비밀을 위한 이 두 개의 노선(jwt 예를 들어)

2021-12-02 07:39:41

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................