Ho webservice utilizzando websockets, e la necessità di implementare tempi di inattività di distribuzione. Perché non voglio cadere le connessioni esistenti sul distribuire, ho deciso di implementare blu/verde distribuire. La mia soluzione attuale si presenta come:
- Ho creato due identici servizi in portainer, in ascolto su porte diverse. Ogni servizio ha messo in nodo ambienti di un identificatore, ad esempio
alfa
ebeta
- Entrambi i servizi sono nascosti dietro di bilanciamento del carico e bilanciamento del controllo periodico dello stato di ogni servizio. Se il servizio risponde su percorso specifico (/balancer-keepalive-check) con la stringa "OK", questo servizio è attivo e bilanciamento del grado di routing per questo servizio. Se il servizio risponde con la stringa "STOP", sistema di bilanciamento del marchio di questo servizio come inaccessibile, ma le connessioni attive saranno conservati
- che è attivo il servizio e che è stato arrestato è sincronizzato su redis. In redis ci sono i tasti
lb.service.alfa
elb.service.beta
che contiene i valori 1 e 0 sono inattivi. Esempio di implementazione /balancer-keepalive-check percorso in 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>`;
})
}
}
- in gitlab CI crea mobile immagine contrassegnati da tag di commit, e riavviare il servizio di chiamata portainer webhook per il servizio specifico. Questo funziona bene per 1 servizio, ma non so come utilizzare 2 diversi DEPLOY_WEBHOOK CI variabili e passare tra di loro.
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
Le mie domande, che non so come risolvere sono:
- Quando ho 2 servizi, ho 2 diversi distribuire webhooks da cui ho bisogno di chiamare uno dopo la distribuzione, perché non ho voglia di riavviare entrambi i servizi. Come determinare quale? Come implementare un qualche tipo di contatore, se questa distribuzione è a "alfa", "beta" del servizio? Devo usare gitlab api e aggiornamento DEPLOY_WEBHOOK dopo ogni distribuire? O shoud I sbarazzarsi di questo gitlab CI/CD variabile e l'utilizzo di alcune API servizi che mi dirà webhook url?
- Come aggiornare i valori in redis? Dovrei implementare le API personalizzate per questo?
- Esiste un modo migliore per realizzare questo?
aggiunta info: non è Possibile utilizzare gitlab api da serviceses, perché il nostro gitlab è self-hosted di dominio accessibile solo dalla nostra rete privata.