{"id":90272,"date":"2020-07-30T13:42:02","date_gmt":"2020-07-30T11:42:02","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci"},"modified":"2020-07-30T13:42:02","modified_gmt":"2020-07-30T11:42:02","slug":"canary-deployment-v-kubernetes-1-gitlab-ci","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","title":{"rendered":"Canary Deployment \u00een Kubernetes #1: Gitlab CI","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h4 id=\"my-budem-ispolzovat-gitlab-ci-i-ruchnoy-gitops-dlya-vnedreniya-i-ispolzovaniya-canary-deploya-v-kubernetes\">Vom folosi Gitlab CI \u0219i GitOps manual pentru implementarea \u0219i utilizarea Canary deployment-ului \u00een Kubernetes<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment \u00een Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/03a53dec150529deb3438efaeaa8a1bd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4 id=\"stati-iz-etogo-cikla\">Articole din acest ciclu:<\/h4>\n<p><\/p>\n<ul>\n<li>(acest articol)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/513118\/\">Canary Deployment cu ArgoCI<\/a><\/noindex><\/li>\n<li>Canary Deployment cu Istio<\/li>\n<li>Canary Deployment cu Jenkins-X Istio Flagger<\/li>\n<\/ul>\n<p><\/p>\n<p>Vom realiza Canary deployment manual prin GitOps \u0219i crearea\/modificarea resurselor esen\u021biale Kubernetes. <strong>Acest articol este destinat \u00een special pentru a familiariza cititorii<\/strong> cu modul \u00een care func\u021bioneaz\u0103 Canary deployment \u00een Kubernetes, deoarece exist\u0103 metode mai eficiente de automatizare pe care le vom explora \u00een articolele urm\u0103toare.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Canary Deployment \u00een Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/d5127cf7dcec695bd8872b1704eb7e90.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.norberteder.com\/canary-deployment\/\">https:\/\/www.norberteder.com\/canary-deployment\/<\/a><\/noindex><\/p>\n<p><\/p>\n<h3 id=\"canary-deployment\">Canary Deployment<\/h3>\n<p><\/p>\n<p>\u00cen strategia Canary de actualizare, modific\u0103rile sunt aplicate ini\u021bial doar pentru o parte a utilizatorilor. Prin monitorizare, date din jurnale, teste manuale sau alte canale de feedback, versiunea este testat\u0103 \u00eenainte de a fi aplicat\u0103 tuturor utilizatorilor.<\/p>\n<p><\/p>\n<h3 id=\"kubernetes-deployment-rolling-update\">Kubernetes Deployment (actualizare continu\u0103)<\/h3>\n<p><\/p>\n<p>Strategia implicit\u0103 pentru Kubernetes Deployment este actualizarea continu\u0103, unde un anumit num\u0103r de poduri cu noi versiuni de imagini sunt lansate. Dac\u0103 acestea sunt create f\u0103r\u0103 probleme, podurile cu versiunile vechi ale imaginilor sunt terminate, iar noile poduri sunt create \u00een paralel.<\/p>\n<p><\/p>\n<h3 id=\"gitops\">GitOps<\/h3>\n<p><\/p>\n<p>Folosim GitOps \u00een acest exemplu, deoarece:<\/p>\n<p><\/p>\n<ul>\n<li>folosim Git ca surs\u0103 unic\u0103 de adev\u0103r<\/li>\n<li>folosim Git Operations pentru construire \u0219i implementare (nu sunt necesare comenzi, cu excep\u021bia git tag\/merge)<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"primer\">Exemplu<\/h3>\n<p><\/p>\n<p>S\u0103 adopt\u0103m o bun\u0103 practic\u0103 \u2014 s\u0103 avem un singur repo pentru codul aplica\u021biilor \u0219i unul pentru infrastructur\u0103.<\/p>\n<p><\/p>\n<h4 id=\"repozitoriy-dlya-prilozheniy\">Repozitoriu pentru aplica\u021bii<\/h4>\n<p><\/p>\n<p>Aceasta este o API foarte simpl\u0103 pe Python+Flask, care returneaz\u0103 un r\u0103spuns \u00een format JSON. Vom construi pachetul prin GitlabCI \u0219i vom trimite rezultatul \u00een Gitlab Registry. \u00cen registru avem dou\u0103 versiuni diferite de release-uri:<\/p>\n<p><\/p>\n<ul>\n<li><code>wuestkamp\/k8s-deployment-example-app:v1<\/code><\/li>\n<li><code>wuestkamp\/k8s-deployment-example-app:v2<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Singura diferen\u021b\u0103 dintre ele este modificarea fi\u0219ierului JSON returnat. Folosim aceast\u0103 aplica\u021bie pentru a vizualiza c\u00e2t se poate de simplu cu ce versiune comunic\u0103m.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-repozitoriy\">Repozitoriu de infrastructur\u0103<\/h4>\n<p><\/p>\n<p>\u00cen acest repo vom implementa prin GitlabCI \u00een Kubernetes, <code>.gitlab-ci.yml<\/code> arat\u0103 \u00een urm\u0103torul mod:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">image: traherom\/kustomize-docker\n\nbefore_script:\n   - printenv\n   - kubectl version\n\nstages:\n - deploy\n\ndeploy test:\n   stage: deploy\n   before_script:\n     - echo $KUBECONFIG\n   script:\n     - kubectl get all\n     - kubectl apply -f i\/k8s\n\n   only:\n     - master\n<\/code><\/pre>\n<p><\/p>\n<p>Pentru a-l rula local, ave\u021bi nevoie de un cluster, pute\u021bi folosi Gcloud:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b\n\ngcloud compute firewall-rules create incoming-80 --allow tcp:80<\/code><\/pre>\n<p><\/p>\n<p>Trebuie s\u0103 face\u021bi un fork <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/wuestkamp\/k8s-deployment-example-canary-infrastructure\">https:\/\/gitlab.com\/wuestkamp\/k8s-deployment-example-canary-infrastructure<\/a><\/noindex> \u0219i s\u0103 crea\u021bi o variabil\u0103 <code>KUBECONFIG<\/code> \u00een GitlabCI, care va con\u021bine configura\u021bia de acces <code>kubectl<\/code> la clusterul dvs.<\/p>\n<p><\/p>\n<p>Despre cum s\u0103 ob\u021bine\u021bi acreditivele pentru cluster (Gcloud) se poate citi <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/faun\/manually-connect-to-your-kubernetes-cluster-from-the-outside-d852346a7f0a\">aici<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-yaml\">Yaml de infrastructur\u0103<\/h4>\n<p><\/p>\n<p>\u00cen repository-ul de infrastructur\u0103 avem service:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: v1\nkind: Service\nmetadata:\n labels:\n   id: app\n name: app\nspec:\n ports:\n - port: 80\n   protocol: TCP\n   targetPort: 5000\n selector:\n   id: app\n type: LoadBalancer<\/code><\/pre>\n<p><\/p>\n<p>\u0218i deployment \u00een <code>deploy.yaml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n name: app\nspec:\n replicas: 10\n selector:\n   matchLabels:\n     id: app\n     type: main\n template:\n   metadata:\n     labels:\n       id: app\n       type: main\n   spec:\n     containers:\n     - image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v1\n       name: app\n       resources:\n         limits:\n           cpu: 100m\n           memory: 100Mi<\/code><\/pre>\n<p><\/p>\n<p>\u0218i un alt deployment \u00een <code>deploy-canary.yaml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Deployment\nmetadata:\n name: app-canary\nspec:\n replicas: 0\n selector:\n   matchLabels:\n     id: app\n     type: canary\n template:\n   metadata:\n     labels:\n       id: app\n       type: canary\n   spec:\n     containers:\n     - image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v2\n       name: app\n       resources:\n         limits:\n           cpu: 100m\n           memory: 100Mi<\/code><\/pre>\n<p><\/p>\n<p>Observa\u021bi c\u0103 app-deploy nu are \u00eenc\u0103 replici definite.<\/p>\n<p><\/p>\n<h4 id=\"vypolnenie-nachalnogo-deploya\">Executarea deployment-ului ini\u021bial<\/h4>\n<p><\/p>\n<p>Pentru a ini\u021bia deployment-ul ini\u021bial, pute\u021bi rula manual pipeline-ul GitlabCI pe ramura master. Dup\u0103 aceasta <code>kubectl<\/code> ar trebui s\u0103 afi\u0219eze urm\u0103toarele:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment \u00een Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/e8ea95fe6c3925f46f6430ce2293063c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Vedem <code>app<\/code> deployment cu 10 replici \u0219i app-canary cu 0. De asemenea, exist\u0103 un LoadBalancer de pe care putem accesa prin <code>curl<\/code> prin IP-ul extern:<\/p>\n<p><\/p>\n<p><code>while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done<\/code><\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment \u00een Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/06e6928002532dbe03b65356964110c7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Observ\u0103m c\u0103 aplica\u021bia noastr\u0103 de testare returneaz\u0103 doar \"v1\".<\/p>\n<p><\/p>\n<h3 id=\"vypolnenie-canary-deploya\">Executarea deployment-ului Canary<\/h3>\n<p><\/p>\n<h4 id=\"shag-1-vypustit-novuyu-versiyu-dlya-chasti-polzovateley\">Pasul 1: lansa\u021bi o nou\u0103 versiune pentru o parte dintre utilizatori<\/h4>\n<p><\/p>\n<p>Am setat num\u0103rul de replici la 1 \u00een fi\u0219ierul deploy-canary.yaml \u0219i imaginea noii versiuni:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Deployment\nmetadata:\n name: app-canary\nspec:\n replicas: 1\n selector:\n   matchLabels:\n     id: app\n     type: canary\n template:\n   metadata:\n     labels:\n       id: app\n       type: canary\n   spec:\n     containers:\n     - image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v2\n       name: app\n       resources:\n         limits:\n           cpu: 100m\n           memory: 100Mi<\/code><\/pre>\n<p><\/p>\n<p>\u00cen fi\u0219ierul <code>deploy.yaml<\/code> am schimbat num\u0103rul de replici la 9:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Deployment\nmetadata:\n name: app\nspec:\n replicas: 9\n selector:\n   matchLabels:\n     id: app\n...<\/code><\/pre>\n<p><\/p>\n<p>Facem push aceste modific\u0103ri \u00een repository-ul din care va fi lansat deployment-ul (prin GitlabCI) \u0219i observ\u0103m \u00een final:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment \u00een Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/b639716b31e41e8eac573fd365ad6780.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Serviciul nostru va indica ambele deployment-uri, deoarece ambele au selectorul app. Datorit\u0103 distribu\u021biei aleatoare implicite \u00een Kubernetes, ar trebui s\u0103 vedem r\u0103spunsuri diferite la aproximativ 10% dintre cereri:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment \u00een Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/d1177207ebd8952fd1994ed0ebdda6a3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Starea actual\u0103 a aplica\u021biei noastre (GitOps, luat\u0103 din Git ca surs\u0103 unic\u0103 de adev\u0103r) este c\u0103 exist\u0103 dou\u0103 deployment-uri cu replici active, c\u00e2te unul pentru fiecare versiune.<\/p>\n<p><\/p>\n<p>~10% dintre utilizatori se familiarizeaz\u0103 cu noua versiune \u0219i o testeaz\u0103 f\u0103r\u0103 s\u0103 vrea. Acum este timpul s\u0103 verific\u0103m erorile din jurnale \u0219i datele de monitorizare pentru a c\u0103uta probleme.<\/p>\n<p><\/p>\n<h4 id=\"shag-2-vypustit-novuyu-versiyu-dlya-vseh-polzovateley\">Pasul 2: lansa\u021bi o nou\u0103 versiune pentru to\u021bi utilizatorii<\/h4>\n<p><\/p>\n<p>Am decis c\u0103 totul a decurs bine \u0219i acum trebuie s\u0103 implement\u0103m o nou\u0103 versiune pentru to\u021bi utilizatorii. Pentru aceasta, pur \u0219i simplu actualiz\u0103m <code>deploy.yaml<\/code> instal\u00e2nd o nou\u0103 versiune a imaginii \u0219i un num\u0103r de replici egal cu 10. \u00cen <code>deploy-canary.yaml<\/code> stabilim num\u0103rul de replici \u00eenapoi la 0. Dup\u0103 desf\u0103\u0219urare, rezultatul va fi urm\u0103torul:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment \u00een Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/a31aafe96a09c6d2651b2bf7add4dd29.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3 id=\"podvodya-itog\">\u00cen concluzie<\/h3>\n<p><\/p>\n<p>Pentru mine, lansarea desf\u0103\u0219ur\u0103rii manual \u00een acest mod ajut\u0103 s\u0103 \u00een\u021beleg c\u00e2t de u\u0219or poate fi configurat\u0103 prin k8s. Deoarece Kubernetes permite actualizarea totul prin API, ace\u0219ti pa\u0219i pot fi automatiza\u021bi prin scripturi.<\/p>\n<p><\/p>\n<p>\u00cenc\u0103 un lucru care trebuie implementat este punctul de intrare al testerului (LoadBalancer sau prin Ingress), prin care se poate accesa doar noua versiune. Aceasta poate fi folosit\u0103 pentru vizualizare manual\u0103.<\/p>\n<p><\/p>\n<p>\u00cen urm\u0103toarele articole vom verifica alte solu\u021bii automatizate care implementeaz\u0103 majoritatea a ceea ce am realizat.<\/p>\n<p><\/p>\n<h2 id=\"takzhe-chitayte-drugie-stati-v-nashem-bloge\">Citi\u021bi \u0219i alte articole de pe blogul nostru:<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/468779\/\">Ce a rezultat din migrarea de la ClickHouse f\u0103r\u0103 autorizare la ClickHouse cu autorizare<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473578\/\">Compilarea modulelor dinamice pentru Nginx<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/news\/t\/502658\/\">Actualizarea nxs-build-tools \u2014 asistentul pentru construirea pachetelor deb \u0219i rpm<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473014\/\">Introducerea \u00een Autorizarea Kubernetes a Hashicorp Consul<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/504762\/\">Cu ce ne-am confruntat atunci c\u00e2nd am folosit utilitarul Csync2<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/347526\/\">Bot Telegram pentru Redmine. Cum s\u0103 \u00ee\u021bi simplifici via\u021ba \u021bie \u0219i celorlal\u021bi<\/a><\/noindex><\/li>\n<\/ul>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/512766\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gitlab CI \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 GitOps \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Canary-\u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes \u0421\u0442\u0430\u0442\u044c\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430: (\u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f) Canary Deployment \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 ArgoCI Canary Deployment \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Istio Canary Deployment \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Jenkins-X Istio Flagger \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c Canary-\u0434\u0435\u043f\u043b\u043e\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0443\u043a\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 GitOps \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\/\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 Kubernetes. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":90273,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-90272","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gitlab CI \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 GitOps \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Canary-\u0434\u0435\u043f\u043b\u043e\u044f \u0432.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Canary Deployment \u0432 Kubernetes #1: Gitlab CI | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gitlab CI \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 GitOps \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Canary-\u0434\u0435\u043f\u043b\u043e\u044f \u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-30T11:42:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-30T11:42:02+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Canary Deployment \u00een Kubernetes #1: Gitlab CI | ProHoster","description":"Vom folosi Gitlab CI \u0219i GitOps manual pentru a implementa \u0219i utiliza Canary deployment \u00een.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Canary Deployment \u0432 Kubernetes #1: Gitlab CI | ProHoster","og:description":"\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gitlab CI \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 GitOps \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Canary-\u0434\u0435\u043f\u043b\u043e\u044f \u0432.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-30T11:42:02+00:00","article:modified_time":"2020-07-30T11:42:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"90272","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:55:28","updated":"2022-09-27 23:09:11","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/90272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=90272"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/90272\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/90273"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=90272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=90272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=90272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}