Azul/verde de implementación para portainer el uso de gitlab CI/CD

0

Pregunta

He webservice mediante websockets, y la necesidad de implementar cero tiempo de inactividad de la implementación. Porque no quiero soltar las conexiones existentes en implementar, he decidido implementar azul/verde implementar. Mi solución real parece:

  1. He creado dos idénticos servicios en portainer, escuchar en puertos diferentes. Cada servicio se ha establecido en el nodo entornos de algún identificador, por ejemplo alfa y beta
  2. Ambos servicios se esconden detrás de un equilibrador de carga, y equilibrador es comprobar periódicamente el estado de cada servicio. Si responde el servicio en una ruta específica (/equilibrador de keepalive-check) con la cadena "OK", este servicio está activo y equilibrador puede enrutamiento para este servicio. Si el servicio está respondiendo con cadena de "STOP", equilibrador de la marca de este servicio como inaccesible, pero las conexiones activas serán preservados
  3. que el servicio está activo y que se detiene se sincroniza más de redis. En redis hay llaves lb.service.alfa y lb.service.beta que contiene los valores de 1 para los activos y 0 para los inactivos. Ejemplo de aplicación /equilibrador de keepalive-verificación de la ruta en 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. en gitlab CI crear ventana acoplable imagen marcada por la etiqueta de cometer, y reiniciar el servicio de llamadas portainer webhook para servicio específico. Esto funciona bien para el 1 de servicio, pero que no saben cómo usar 2 diferentes DEPLOY_WEBHOOK CI variables y cambiar entre ellas.
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

Mi pregunta, que no sé cómo resolver son:

  • Cuando tengo 2 servicios, tengo 2 diferentes implementar webhooks de la que tengo que llamar a uno después de la implementación, ya que no quiero reiniciar los servicios. Cómo determinar cuál? Cómo implementar algún tipo de contador, si este despliegue es "alfa" o "beta" servicio? Debo usar gitlab api y actualización de DEPLOY_WEBHOOK después de cada implementar? O si acaso puedo deshacerme de este gitlab CI/CD variable y el uso de algunas API de servicios que me va a decir webhook url?
  • Cómo actualizar los valores en redis? Debería de implementar la API personalizado para esto?
  • Existe mejor manera de cómo lograr esto?

además de la información: no se Puede utilizar gitlab api de serviceses, porque nuestro gitlab es auto-alojado en el dominio accesible sólo desde nuestra red privada.

1

Mejor respuesta

0

He modificado mi AppController. Hay 2 nuevos endpoints ahora, uno para identificar que se está ejecutando el servicio, segundo, para cambiar el valor en 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');
            }
        })
    }

después de eso, he modificado mi gitlab-ci.yml de la siguiente manera:

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

En el trabajo de construir la ventana acoplable imagen es construir. Después de que se ejecuta el trabajo de implementar, que hacer una petición a /ejecutan-servicio-identificación y la identifica, qué servicio se está ejecutando. Luego de implementar la imagen para el servicio detenido. Último trabajo es el interruptorque hará a solicitud de a /interruptor de la ruta, que va a cambiar los valores en redis.

Esto funciona bien. La última cosa que necesito para implementar algún tipo de secreto de los dos rutas (jwt por ejemplo)

2021-12-02 07:39:41

En otros idiomas

Esta página está en otros idiomas

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