Canary release com Kubernetes e Istio

Dd500b30db98bd254ffc5a7982a70803?s=47 drequena
April 11, 2019

Canary release com Kubernetes e Istio

O Kubernetes suporta algumas técnicas de Deploy nativas,mas nenhuma delas dá o poder e abre tantas possibilidades como o Istio faz. Nessa talk falarei como fazer Canary Release utilizando Istio, entenderemos sua arquitetura e entraremos em tópicos como gerenciamento de tráfego, fault injection e mais.

Com o estabelecimento do Kubernetes como padrão de fato para orquestração de containers e a adoção da arquitetura de micro-serviços ganhando cada dia mais adeptos, tópicos como: Estratégias de Deploy, Gerenciamento de tráfego, Observabilidade, Segurança, Fault Injection, e ainda outros, entraram no radar de indivíduos e empresa que estão enfrentando os desafios de gerenciar uma grande quantidade de micro-serviços em produção. A solução atual para esses desafios está nas plataformas de Service Mesh. Uma camada de infraestrutura configurável que ajuda no gerenciamento e comunicação entre os micro-serviços, sem a necessidade de qualquer alteração no código da aplicação. Isso é feito, na maioria das vezes, injetando um proxy transparente junto de cada micro-serviço que intercepta, gerencia, metrifica e até altera o tráfego de entrada e saída dessas aplicações.

Dd500b30db98bd254ffc5a7982a70803?s=128

drequena

April 11, 2019
Tweet

Transcript

  1. 1.
  2. 2.

    2 + Whoami + Estratégias de Deploy + Estratégias de

    Deploy no Kubernetes + Service Mesh (Istio) + Demo + Referências
  3. 3.

    3 Sysadmin há 13 anos (3 anos de DevOPS) Bacharel

    em CCP / Mestre em Eng. Comp. TechLead na Mandic Apaixonado por OpenSource, IAC, Agile, Lean, DevOps. Movido a café!
  4. 4.
  5. 5.

    5 + HighLander + Rollout + Blue/Green + Canary +

    A/B + Shadow + Feature Toggle + Objetivo comum: Reduzir o downtime e os riscos de uma alteração de versão para uma nova aplicação ou sistema em produção.
  6. 6.
  7. 7.

    7 Service --- apiVersion: v1 kind: Service metadata: name: myservice

    spec: ... selector: app: myapp ... type:LoadBalancer Pod --- apiVersion: v1 kind: pod metadata: name: myapp labels: app: myapp spec: ... image: nginx ... containerport:80 Pod --- apiVersion: v1 kind: pod metadata: name: myapp labels: app: myapp spec: ... image: nginx ... containerport:80 Pod --- apiVersion: v1 kind: pod metadata: name: myapp labels: app: myapp spec: ... image: nginx ... containerport:80
  8. 8.

    8 + Virada de chave + Pods da nova versão

    são criados. + Pods da versão antiga são removidos + Virada do Service ocorre de uma vez. Deployment --- ... kind: Deployment metadata: name: myapp spec: ... replicas: 5 strategy: type: recreate ...
  9. 12.

    12 + Opção padrão em Deployments no Kubernetes + Atualiza

    gradativamente os Pods na proporção definida para nova versão + Conforme Pods são validados, tráfego é direcionado para Pods da nova versão. + Health-Check + LivenessProbe + ReadinessProbe Deployment --- ... kind: Deployment metadata: name: myapp spec: ... replicas: 5 strategy: type: RollingUpdate rollingUpdate: maxSurge: 45% maxUnavailable: 15% ...
  10. 18.

    18 + Uma nova estrutura completa (Services + Deploy) é

    criada. + Testes são realizados na nova estrutura + Caso passe nos testes, selector do Service de Prod (blue) é alterado para o label do Deployment da nova estrutura (green) Service --- apiVersion: v1 kind: Service metadata: name: green spec: ... selector: app: myapp-v2 ... type:LoadBalancer Deployment --- ... kind: Deployment metadata: name: myapp labels: app: myapp-v2 spec: ... replicas: 3 image: myapp:v2 Service --- apiVersion: v1 kind: Service metadata: name: blue spec: ... selector: app: myapp-v1 ... type:LoadBalancer Deployment --- ... kind: Deployment metadata: name: myapp labels: app: myapp-v1 spec: ... replicas: 3 image: myapp:v1
  11. 21.

    21 v1 v1 v1 v2 v2 Service QA v2 Service

    Prod Service --- apiVersion: v1 kind: Service metadata: name: blue spec: ... selector: app: myapp-v2 ... type:LoadBalancer
  12. 22.

    22

  13. 23.

    23 + Novo Deploy com nova versão é criado, com

    mesmo label do “selector” do Service de produção + Novo Deploy se vale do algoritmo de roteamento padrão do Service (round-robin) para receber tráfego. + Caso análise dos testes seja positiva, novos PODs (replicas) são iniciados gradativamente.
  14. 24.

    24 Service --- apiVersion: v1 kind: Service metadata: name: myservice

    spec: ... selector: app: myapp ... type:LoadBalancer Pod --- apiVersion: v1 kind: pod metadata: name: myapp labels: app: myapp spec: ... image: nginx ... containerport:80 Pod --- apiVersion: v1 kind: pod metadata: name: myapp labels: app: myapp spec: ... image: nginx ... containerport:80 Pod --- apiVersion: v1 kind: pod metadata: name: myapp labels: app: myapp spec: ... image: nginx:1.8 ... containerport:80
  15. 29.
  16. 30.

    30 + “A service mesh is a configurable infrastructure layer

    for a microservices application. It makes communication between service instances flexible, reliable, and fast. The mesh provides service discovery, load balancing, encryption, authentication and authorization, support for the circuit breaker pattern, and other capabilities.“ * * Retirado do site oficial Nginx Blog.
  17. 31.

    31 Istio + v1.1 (stable) + Google, Redhat, Lyft +

    Suporta não apenas Kubernetes + Complexo.
  18. 32.

    32 Serviços importantes + Pilot: Responsável pelas configurações de todos

    os Envoys na Mesh. Configura, entre várias outras coisas, a políticas de roteamento para dentro e fora das aplicações. + Mixer: Responsável pela telemetria de toda a Mesh. Tem backend configurável para vários outputs.
  19. 33.

    33 Seus novos amigos da vizinhança! (CRD) + Gateway +

    VirtualService + DestinationRule + Serviceentry
  20. 34.

    34 Pod K8S Service (srv-1) LoadBalancer Container Istio Ingress POD

    K8S Service K8S Service (srv-1) LoadBalancer ClusterIP Pod Envoy Container
  21. 35.

    35 Seus novos amigos da vizinhança! (CRD) + Gateway: Configura

    o Ingress Controller para aceitar comunicação de um certo domínio e porta. + VirtualService: Faz o roteamento e conexão entre o domínio configurado no Gateway e um Service do Kubernetes (pode usar um DestinationRule para isso ou não) + DestinationRule: Cria grupos (subsets) de versões de uma aplicação e define a política de tráfego para elas. + Serviceentry: Expande a Mesh para um serviço externo ao ControlPlane. Mais utilizado para liberar acesso a aplicações externas a Mesh.
  22. 36.

    36 Istio Ingress POD K8S Service K8S Service (srv-1) Gateway

    VirtualService DestinationRule LoadBalancer ClusterIP Pod Envoy Container + LB que vai expor as aplicações, agora aponta para o Istio-Ingress primeiro. + Oh! Ingress! Psiu! Aceita conexão desse domínio srv-1.istio-demo.intra.net agora ok? + O Gateway! Conexão para srv-1-istio-demo.intra.net vai para o serviço Kubernetes srv-1 + Oh VirtualService! Se quiser opções mais avançadas de roteamento, COLA EM MIM!
  23. 37.

    37 Cenário: -> Kubernetes + AWS cluster + Provisionado com

    Kops 1.11 + Versão 1.11.9 + 1 master (m5.xlarge) + 3 nodes (m5.xlarge) - Multi AZ + AdmissionControl + Route53 interno (istio-demo.intra.net) + Istio 1.0.7
  24. 38.

    38 Istio install: (helm) curl -LO https://github.com/istio/istio/releases/download/1.0.7/istio-1.0.7-linux.tar.gz tar zxvf istio-1.0.7-linux.tar.gz

    cd istio-1.0.7/install/kubernetes/helm/ helm template ./istio --name istio --namespace istio-system --set grafana.enabled=true --set kiali.enabled=true > /root/istio-install-v1.yaml kubectl create ns istio-system kubectl apply -f /root/istio-install-v1.yaml prepare-se para muitas linhas...
  25. 39.

    39 Istio install: (helm) kubectl -n istio-system get pods (snipped...)

    NAME READY STATUS RESTARTS AGE grafana-7f6cd4bf56-4phwp 1/1 Running 0 1d istio-citadel-7dd558dcf-mb8qz 1/1 Running 0 1d istio-egressgateway-88887488d-wc28w 1/1 Running 0 1d istio-galley-787758f7b8-5267v 1/1 Running 0 1d istio-ingressgateway-58c77897cc-gnj2s 1/1 Running 0 1d istio-pilot-868cdfb5f7-r7qdk 2/2 Running 0 1d istio-policy-56c4579578-tvsrs 2/2 Running 0 1d istio-sidecar-injector-d7f98d9cb-q8fpj 1/1 Running 0 1d istio-telemetry-7fb48dc68b-hg87q 2/2 Running 0 1d istio-telemetry-7fb48dc68b-qvtk2 2/2 Running 0 23m kiali-58bf795c96-bbhxm 1/1 Running 0 1d prometheus-76db5fddd5-jcb69 1/1 Running 0 1d
  26. 40.

    40 Pontos de atenção! kubectl label namespace default istio-injection=enabled labels:

    app: version: Service: Vira ClusterIP Nome das portas dos Services das aplicações! protocol[-sufix] ex: http (OK) ex: http-myport (OK) ex: lalaland (NOT OK)
  27. 42.
  28. 44.

    44

  29. 48.
  30. 49.

    49 SRV-1 v1 DB Remote API SRV-2 v1 SRV-4 SRV-3

    SRV-1 v2 90% 10% SRV-2 v2 30%
  31. 50.

    50 Features + Dynamic service discovery + Load balancing +

    TLS termination + HTTP/2 and gRPC proxies + Circuit breakers + Health checks + Staged rollouts with %-based traffic split + Fault injection + Rich metrics + mutual-TLS + E muitas, muitas mais...
  32. 51.

    51

  33. 52.

    52 ❖ https://istio.io/ ❖ https://istio.io/docs/ ❖ https://istio.io/docs/setup/kubernetes/platform-setup/aws/ (ADMISSIONCONTROL) ❖ https://istio.io/docs/reference/config/

    ❖ https://istio.io/docs/concepts/traffic-management/ ❖ https://youtu.be/JdqFy7ykPuQ ❖ http://github.com/drequena/istio-app/ ❖ https://github.com/kubernetes/kops/ ❖ t.me/istiobr (Grupo de Telegram) ❖ https://www.nginx.com/blog/what-is-a-service-mesh/