Maison  >  Article  >  développement back-end  >  Application nginx : publication Canary à l'aide de nginx

Application nginx : publication Canary à l'aide de nginx

不言
不言original
2018-06-05 09:36:261983parcourir

Cet article présente principalement l'application de nginx : l'utilisation de nginx pour la publication Canary a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Cet article le présente Déploiement bleu-vert. et comment utiliser nginx pour simuler la version Canary de la manière la plus simple

Version Canary/version en niveaux de gris

L'objectif de la version Canary est : les essais et les erreurs. L'origine du canari lui-même est une histoire tragique des belles créatures de la nature dans le développement de l'industrie humaine. Le canari utilise sa vie pour tenter de commettre des erreurs pour la sécurité des mineurs. Un petit coût est utilisé pour échanger contre une sécurité globale. Dans la pratique du déploiement continu, le canari est le contrôle du trafic, comme un pour cent ou un dixième, est utilisé pour vérifier si une certaine version est normale. S'il est anormal, sa fonction sera réalisée au moindre coût et le risque sera réduit. Si cela est normal, vous pouvez augmenter progressivement le poids jusqu'à ce qu'il atteigne 100 % et basculer tout le trafic vers la nouvelle version en douceur. La publication en niveaux de gris est généralement un concept similaire. Le gris est une transition entre le noir et le blanc. Il est différent du déploiement bleu et vert, qui est soit bleu, soit vert. La version en niveaux de gris/version Canary a une période pendant laquelle les deux existent en même temps, mais le trafic correspondant des deux est. Si la version Canary est différente de la version en niveaux de gris, la différence devrait résider dans le but. Le but de la version Canary est d'effectuer des essais et des erreurs, tandis que la version en niveaux de gris concerne une version stable, mais il n'y a aucun problème dans la version Canary. transition dans les circonstances de la libération en niveaux de gris.

Simulation de la version Canary

Ensuite, nous utilisons l'amont de nginx pour simuler simplement le scénario de version Canary. Le scénario spécifique est le suivant. La version principale est actuellement active. En ajustant les paramètres de nginx et en ajustant constamment le poids de la version Canary, une version fluide est enfin obtenue.

版本 说明
router 用户通过http://localhost:8090来访此种部署下的微服务
主版本 当前活跃的主版本,在7001端口提供服务,提示信息为“Hello main service: v1 in 7001”
金丝雀版本 试错的金丝雀版本,在7002端口提供服务,提示信息为“Hello canary deploy service: v2 in 7002”

Préparation à l'avance

Démarrez deux services sur les deux ports 7001/7002 à l'avance pour afficher différentes informations Pour faciliter la démonstration, j'ai utilisé tornado pour fabriquer un miroir et j'ai utilisé. docker Différents paramètres passés au démarrage du conteneur sont utilisés pour afficher les différences de services.

docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello main service: v1 in 7001"docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello canary deploy service: v2 in 7002"

Journal d'exécution

[root@kong ~]# docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello main service: v1 in 7001"28f42bbd21146c520b05ff2226514e62445b4cdd5d82f372b3791fdd47cd602a
[root@kong ~]# docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello canary deploy service: v2 in 7002"b86c4b83048d782fadc3edbacc19b73af20dc87f5f4cf37cf348d17c45f0215d
[root@kong ~]# curl http://192.168.163.117:7001Hello, Service :Hello main service: v1 in 7001[root@kong ~]# curl http://192.168.163.117:7002Hello, Service :Hello canary deploy service: v2 in 7002[root@kong ~]#

Démarrez nginx

[root@kong ~]# docker run -p 9080:80 --name nginx-canary -d nginx659f15c4d006df6fcd1fab1efe39e25a85c31f3cab1cda67838ddd282669195c
[root@kong ~]# docker ps |grep nginx-canary659f15c4d006        nginx                      "nginx -g 'daemon ..."   7 seconds ago        Up 7 seconds        0.0.0.0:9080->80/tcp     nginx-canary
[root@kong ~]#

Extrait de code nginx

Préparez l'extrait de code nginx suivant et ajoutez-le à nginx Dans /etc/nginx/conf.d/default.conf, la méthode de simulation est très simple. Utilisez down pour indiquer que le trafic est nul (le poids ne peut pas être mis à zéro dans nginx au début, 100 % du). le trafic est envoyé vers la version principale.

http {
upstream nginx_canary {    server 192.168.163.117:7001 weight=100;    server 192.168.163.117:7002 down;
}server {
    listen       80;
    server_name  www.liumiao.cn 192.168.163.117;
    location / {
        proxy_pass http://nginx_canary;
    }

}

Comment modifier default.conf

Vous pouvez obtenir l'effet en installant vim dans le conteneur, vous pouvez également le modifier localement puis le transmettre via docker cp, ou le modifier directement avec sed. Si vous installez vim dans un conteneur, utilisez la méthode suivante :

[root@kong ~]# docker exec -it nginx-lb sh# apt-get update...省略# apt-get install vim...省略

Avant modification

# cat default.confserver {
    listen       80;
    server_name  localhost;    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;        index  index.html index.htm;
    }    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}}#

Après modification

# cat default.confupstream nginx_canary {    server 192.168.163.117:7001 weight=100;    server 192.168.163.117:7002 down;
}server {
    listen       80;
    server_name  www.liumiao.cn 192.168.163.117;    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {        #root   /usr/share/nginx/html;
        #index  index.html index.htm;
        proxy_pass http://nginx_canary;
    }    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}}#

Recharger les paramètres nginx

# nginx -s reload2018/05/28 05:16:20 [notice] 319#319: signal process started#

Résultats de confirmation

Toutes les sorties de 10 appels sont v1 en 7001

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; doneHello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001[root@kong ~]#

Version Canary : poids du trafic de la version Canary 10 %

En ajustant le poids de default.conf puis en exécutant nginx -s reload, ajustez le poids de la version Canary à 10 %, et 10 % du trafic exécutera de nouveaux services

Modifier par défaut

il suffit d'ajuster le poids du serveur en amont comme suit :

upstream nginx_canary {    server 192.168.163.117:7001 weight=10;    server 192.168.163.117:7002 weight=90;
}

Recharger les paramètres nginx

# nginx -s reload2018/05/28 05:20:14 [notice] 330#330: signal process started#

Confirmer le résultat

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; doneHello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002[root@kong ~]#

Canary release : Le poids du trafic de la version Canary est de 50 %

En ajustant le poids de default.conf puis en exécutant nginx -s reload, ajustez le poids de la version Canary à 50 %, 50 % du trafic exécutera de nouveaux services

Pour modifier default.conf

Il vous suffit d'ajuster le poids du serveur en amont comme suit :

upstream nginx_canary {    server 192.168.163.117:7001 weight=50;    server 192.168.163.117:7002 weight=50;
}

Recharger les paramètres nginx

# nginx -s reload2018/05/28 05:22:26 [notice] 339#339: signal process started#

Confirmez le résultat

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; doneHello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002[root@kong ~]#

Version Canary : poids du trafic de la version Canary 90 %

En ajustant la configuration par défaut, puis exécutez nginx -s reload pour ajuster le. poids de la version canary à 90%, et 90% du trafic exécutera le nouveau service

Modifier la méthode default.conf

Il vous suffit d'ajuster le poids du serveur en amont comme suit :

upstream nginx_canary {    server 192.168.163.117:7001 weight=10;    server 192.168.163.117:7002 weight=90;
}

Recharger les paramètres nginx

# nginx -s reload2018/05/28 05:24:29 [notice] 346#346: signal process started#

Confirmer le résultat

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; doneHello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002[root@kong ~]#

Version Golden Thread Bird : Le poids du trafic de la version Canary est de 100 %

En ajustant le poids de default.conf puis en exécutant nginx -s reload, ajustez le poids de la version Canary à 100%, et 100% du trafic sera Pour exécuter un nouveau service

Pour modifier default.conf

Il vous suffit d'ajuster le poids du serveur en amont comme suit :

<p style="margin-bottom: 7px; margin-top: 14px;">upstream nginx_canary {    server 192.168.163.117:7001 down;    server 192.168.163.117:7002 weight=100;<br/>}<br/></p>

Recharger les paramètres nginx

# nginx -s reload2018/05/28 05:26:37 [notice] 353#353: signal process started#

Confirmer le résultat

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; doneHello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002[root@kong ~]#

Recommandations associées :

Application nginx : utilisez nginx pour l'équilibrage de charge

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn