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:
- 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
ybeta
- 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
- que el servicio está activo y que se detiene se sincroniza más de redis. En redis hay llaves
lb.service.alfa
ylb.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>`;
})
}
}
- 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.