рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ #1 рдореЗрдВ рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди: рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо Gitlab CI рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ GitOps рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ #1 рдореЗрдВ рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди: рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ

рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓реЗрдЦ:

рд╣рдо GitOps рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдореБрдЦреНрдп Kubernetes рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдирд╛рдПрдВрдЧреЗ/рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЖрд▓реЗрдЦ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрдп рдХреЗ рд▓рд┐рдП рд╣реИ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреИрдирд░реА рдореЗрдВ рддреИрдирд╛рддреА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рди рдХреЗ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХреЗ рд╣реИрдВ, рдЬрд┐рди рдкрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред


рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ #1 рдореЗрдВ рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди: рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ

https://www.norberteder.com/canary-deployment/

рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди

рдХреИрдирд░реА рд░рдгрдиреАрддрд┐ рдХреЗ рд╕рд╛рде, рдЕрдкрдбреЗрдЯ рдкрд╣рд▓реЗ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдПрдХ рд╕рдмрд╕реЗрдЯ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдирд┐рдЧрд░рд╛рдиреА, тАЛтАЛрд▓реЙрдЧ рдбреЗрдЯрд╛, рдореИрдиреНрдпреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдпрд╛ рдЕрдиреНрдп рдлреАрдбрдмреИрдХ рдЪреИрдирд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд░рд┐рд▓реАрдЬрд╝ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░рд┐рдирд┐рдпреЛрдЬрди (рд░реЛрд▓рд┐рдВрдЧ рдЕрджреНрдпрддрди)

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рдгрдиреАрддрд┐ рд░реЛрд▓рд┐рдВрдЧ-рдЕрдкрдбреЗрдЯ рд╣реИ, рдЬрд╣рд╛рдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреЙрдбреНрд╕ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рд╡реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрдирд╛рдП рдЧрдП рдереЗ, рддреЛ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╡рд╛рд▓реЗ рдкреЙрдб рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирдП рдкреЙрдб рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

GitOps

рд╣рдо рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ GitOps рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо:

  • рд╕рддреНрдп рдХреЗ рдПрдХрд▓ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ Git рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  • рд╣рдо рдирд┐рд░реНрдорд╛рдг рдФрд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП Git рдСрдкрд░реЗрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (git рдЯреИрдЧ/рдорд░реНрдЬ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрдорд╛рдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)

рдЙрджрд╛рд╣рд░рдг

рдЖрдЗрдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд░рдЦреЗрдВред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рднрдВрдбрд╛рд░

рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ Python+Flask API рд╣реИ рдЬреЛ JSON рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛ рд╣реИред рд╣рдо GitlabCI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ Gitlab рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкрд░ рднреЗрдЬреЗрдВрдЧреЗред рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ:

  • wuestkamp/k8s-deployment-example-app:v1
  • wuestkamp/k8s-deployment-example-app:v2

рдЙрдирдХреЗ рдмреАрдЪ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рд▓реМрдЯрд╛рдИ рдЧрдИ JSON рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рд╣рдо рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрдерд╛рд╕рдВрднрд╡ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЕрд╡рд╕рдВрд░рдЪрдирд╛ рднрдВрдбрд╛рд░

рдЗрд╕ рд╢рд▓рдЬрдо рдореЗрдВ рд╣рдо GitlabCI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Kubernetes рдкрд░ рддреИрдирд╛рдд рдХрд░реЗрдВрдЧреЗ, .gitlab-ci.yml рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

image: traherom/kustomize-docker

before_script:
   - printenv
   - kubectl version

stages:
 - deploy

deploy test:
   stage: deploy
   before_script:
     - echo $KUBECONFIG
   script:
     - kubectl get all
     - kubectl apply -f i/k8s

   only:
     - master

рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЖрдк Gcloud рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b

gcloud compute firewall-rules create incoming-80 --allow tcp:80

рдЖрдкрдХреЛ рдХрд╛рдВрдЯрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure рдФрд░ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдмрдирд╛рдПрдВ KUBECONFIG GitlabCI рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ kubectl рдЖрдкрдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП.

рдЖрдк рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдЬреАрдХреНрд▓рд╛рдЙрдб) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣рд╛рдВ.

рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдпрдорд▓

рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реЗрд╡рд╛ рд╣реИ:

apiVersion: v1
kind: Service
metadata:
 labels:
   id: app
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

рдФрд░ рдореЗрдВ рддреИрдирд╛рддреА deploy.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: app
spec:
 replicas: 10
 selector:
   matchLabels:
     id: app
     type: main
 template:
   metadata:
     labels:
       id: app
       type: main
   spec:
     containers:
     - image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
       name: app
       resources:
         limits:
           cpu: 100m
           memory: 100Mi

рдФрд░ рдореЗрдВ рдПрдХ рдФрд░ рддреИрдирд╛рддреА deploy-canary.yaml:

kind: Deployment
metadata:
 name: app-canary
spec:
 replicas: 0
 selector:
   matchLabels:
     id: app
     type: canary
 template:
   metadata:
     labels:
       id: app
       type: canary
   spec:
     containers:
     - image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
       name: app
       resources:
         limits:
           cpu: 100m
           memory: 100Mi

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдРрдк-рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдореЗрдВ рдЕрднреА рддрдХ рдХреЛрдИ рдкреНрд░рддрд┐рдХреГрддрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддреИрдирд╛рддреА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдкрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ GitlabCI рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж kubectl рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ #1 рдореЗрдВ рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди: рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ app 10 рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдФрд░ 0 рдХреЗ рд╕рд╛рде рдРрдк-рдХреИрдирд░реАред рдПрдХ рд▓реЛрдбрдмреИрд▓реЗрдВрд╕рд░ рднреА рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ curl рдмрд╛рд╣рд░реА рдЖрдИрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ:

while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ #1 рдореЗрдВ рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди: рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗрд╡рд▓ "v1" рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛

рдЪрд░рдг 1: рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░реЗрдВ

рд╣рдордиреЗ рдкрд░рд┐рдирд┐рдпреЛрдЬрди-canary.yaml рдлрд╝рд╛рдЗрд▓ рдФрд░ рдирдИ рд╕рдВрд╕реНрдХрд░рдг рдЫрд╡рд┐ рдореЗрдВ рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 1 рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИ:

kind: Deployment
metadata:
 name: app-canary
spec:
 replicas: 1
 selector:
   matchLabels:
     id: app
     type: canary
 template:
   metadata:
     labels:
       id: app
       type: canary
   spec:
     containers:
     - image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
       name: app
       resources:
         limits:
           cpu: 100m
           memory: 100Mi

рдлрд╛рдЗрд▓ рдореИрдВ deploy.yaml рд╣рдордиреЗ рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓рдХрд░ 9 рдХрд░ рджреА рд╣реИ:

kind: Deployment
metadata:
 name: app
spec:
 replicas: 9
 selector:
   matchLabels:
     id: app
...

рд╣рдо рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдзрдХреЗрд▓рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╕реЗ рддреИрдирд╛рддреА рд╢реБрд░реВ рд╣реЛрдЧреА (GitlabCI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ:

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ #1 рдореЗрдВ рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди: рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ

рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рджреЛрдиреЛрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдореЗрдВ рдРрдк рдЪрдпрдирдХрд░реНрддрд╛ рд╣реИред рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реИрдВрдбрдорд╛рдЗрдЬреЗрд╢рди рдХреЗ рдХрд╛рд░рдг, рд╣рдореЗрдВ ~10% рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рджреЗрдЦрдиреА рдЪрд╛рд╣рд┐рдП:

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ #1 рдореЗрдВ рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди: рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ

рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ (GitOps, Git рд╕реЗ рд╕рддреНрдп рдХреЗ рдПрдХрд▓ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рд▓реА рдЧрдИ) рд╕рдХреНрд░рд┐рдп рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рддреИрдирд╛рддреА рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХред

~10% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирдП рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдЙрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рд▓реЙрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред

рдЪрд░рдг 2: рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░реЗрдВ

рд╣рдордиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣рд╛ рдФрд░ рдЕрдм рд╣рдореЗрдВ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдмрд╕ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ deploy.yaml рдЫрд╡рд┐ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░ рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 10 рдХреЗ рдмрд░рд╛рдмрд░ deploy-canary.yaml рд╣рдордиреЗ рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ 0 рдкрд░ рд╕реЗрдЯ рдХреА рд╣реИред рддреИрдирд╛рддреА рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ #1 рдореЗрдВ рдХреИрдирд░реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди: рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ

рдЙрдкрд╕рдВрд╣рд╛рд░

рдореЗрд░реЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ рдХрд┐ k8s рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХрд┐рддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЖрдкрдХреЛ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдм рдХреБрдЫ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди рдЪрд░рдгреЛрдВ рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдФрд░ рдЪреАрдЬ рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ (рд▓реЛрдбрдмреИрд▓реЗрдВрд╕рд░ рдпрд╛ рдЗрдирдЧреНрд░реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЗрд╡рд▓ рдирдП рд╕рдВрд╕реНрдХрд░рдг рддрдХ рдкрд╣реБрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдиреНрдпреБрдЕрд▓ рдмреНрд░рд╛рдЙрдЬрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рд╣рдо рдЕрдиреНрдп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рдЕрдиреНрдп рд▓реЗрдЦ рднреА рдкрдврд╝реЗрдВ:

рд╕реНрд░реЛрдд: www.habr.com

DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрд╡рд░ рд╡рд╛рд▓реА рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реАрджреЗрдВ ЁЯФе рдбреАрдбреАрдУрдПрд╕ рд╕реБрд░рдХреНрд╖рд╛, рд╡реАрдкреАрдПрд╕ рдФрд░ рд╡реАрдбреАрдПрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реАрджреЗрдВ | ProHoster