สีน้ำเงิน/เขียว deployment จะ portainer ใช้ gitlab ล่งข่าว/แผ่นซีดี

0

คำถาม

ฉันต้อง webservice ใช้ websockets และต้องเตรียมกำเป็นศูนย์-downtime ประจำการ เพราะฉันไม่อยากทิ้งที่มีอยู่การเชื่อมต่ออยู่จะยกขึ้ฉันตัดสินใจที่จะดำเนินสีฟ้า/สีเขียวเอาล่ะไปได้..ประจำที่! ของฉันแท้จริงทานดูเหมือนว่า:

  1. ฉันสร้างสองคนเหมือนกันบริการอยู่ใน portainer ฟังอยู่ต่างออกท่าเรือ. ทุกบริการมีการโหนดสภาพแวดล้อมบางอย่าแสดงตัวตัวอย่างเช่น alfa แล้ว beta
  2. ทั้งสองบริการซ่อนไว้ข้างหลังโหลด balancer และ balancer นี่เป็นบางครั้งต่อเมื่อต้อตรวจสอบสถานะของแต่ละบริการ. ถ้าบริการตอบสนองอยู่เฉพาะเส้นทาง(/balancer-keepalive รดตรวจสอบ)กับข้อความ"โอเค",บริการนี้คือที่ทำงานอยู่และ balancer สามารถลองให้บริการนี้. ถ้าบริการตอบสนองกับข้อความ"หยุด",balancer มาร์บริการนี้ใช้ในการเข้าใช้งานไม่ได้เป็นแต่ที่ทำงานอยู่การเชื่อมต่อจะมีการรักษา
  3. ซึ่งบริการที่ทำงานอยู่และนั่นคือเลิกเป็นซิงค์มา redis. ใน redis มีกุญแจ lb.service.alfa แล้ว lb.service.beta ซึ่งสามารถมีค่า 1 สำหรับที่ทำงานอยู่และ 0 สำหรับที่ไม่ได้ทำงานอยู่. ตัวอย่างของ implementation /balancer-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 ล่งข่าวสร้าง docker รูปภาพที่ติดป้ายไว้โดยกแท็บก่อนและเริ่มบริการใหม่อีกครั้งเรียก portainer webhook สำหรับเฉพาะเจาะจงบริการ. มันจะได้ผลดีสำหรับ 1 บริการแต่ไม่รู้ว่าต้องใช้ 2 ต่างออก DEPLOY_WEBHOOK ล่งข่าวและตัวแปรสลับไปมาระหว่างพวกเขา
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 ต่างกันเตรียมที่จะออกจะแท๊ webhooks จากที่ฉันต้องโทรหาหนึ่งหลังจะยกขึ้เพราะฉันไม่ต้องการที่จะเริ่มใหม่อีกครั้งทั้งสองบริการ. ยังไงเพื่อกำหนดงานอดิเรกอันไหน? วิธีที่จะรับคำสั่งเข้าใจบางอย่างเคาน์เตอร์,ถ้านี้จะยกขึ้นคือที่"alfa"หรือ"เบต้า"บริการ? ฉันควรจะใช้ gitlab รูปแบบ api และปรับปรุง DEPLOY_WEBHOOK หลังจากแต่ละคนจะยกขึ้? หรือ shoud ฉันกำจัดของ gitlab ล่งข่าว/แผ่นซีดีและตัวแปรใช้รูปแบบ api บการบริการซึ่งจะบอกฉัน webhook ที่อยู่ url?
  • วิธีที่จะปรับปรุงค่าต่างๆใน redis? ฉันควรจะเตรียมกำหนดเองรูปแบบ api สำหรับเรื่องนี้?
  • อยู่ที่นั่นดีกว่าทางวิธีที่จะประสบความสำเร็จในส่วนนี้?

กจากข้อมูล:ไม่สามารถใช้ gitlab รูปแบบ api จาก serviceses เพราะของเรา gitlab เป็นตัวเองเป็นเจ้าภาพในโดเมนด้านบมารถใช้งานได้เพียงจากของเราเป็นส่วนตัวเครือข่าย

1

คำตอบที่ดีที่สุด

0

ฉันมีการแก้ไขของฉัน AppController. ที่นั้นมีอยู่ 2 คนใหม่ endpoints ตอนนี้หนึ่งเพื่อระบุตัวซึ่งการคือวิ่งที่สองสำหรับเปลี่ยนค่าใน 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-ซิ.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

ในงาน ก่อสร้าง ค docker ภาพคือสร้างขึ้น หลังจากนั้นวิ่งงาน จะยกขึ้นซึ่งทำให้ร้องขอที่จะ/วิ่ง-บริการ-สวัสดีค่ะ-ขอบัตรด้วยกันชี้ตัวซึ่งการคือ runing. งั้นเตรียมที่จะออกจะแท๊กภาพไปที่หยุดบริการ. สุดท้ายคืองาน เปลี่ยนซึ่งจะทำให้การร้องขอให้เปลี่ยนเส้นทางที่จะเปลี่ยนค่าใน redis.

มันทำงานได้ดี สิ่งสุดท้ายที่ผมต้องการเพื่อดำเนินเป็นความลับเรื่องนี้สองเส้นทาง(jwt สำหรับตัวอย่าง)

2021-12-02 07:39:41

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่