Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Canary release com Kubernetes e Istio

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.

drequena

April 11, 2019
Tweet

More Decks by drequena

Other Decks in Technology

Transcript

  1. View Slide

  2. 2
    + Whoami
    + Estratégias de Deploy
    + Estratégias de Deploy no Kubernetes
    + Service Mesh (Istio)
    + Demo
    + Referências

    View Slide

  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é!

    View Slide

  4. View Slide

  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.

    View Slide

  6. View Slide

  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

    View Slide

  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
    ...

    View Slide

  9. 9
    v1 v1 v1 v1 v1
    Service

    View Slide

  10. 10
    v1 v1 v1 v1 v1
    Service
    v2 v2 v2 v2 v2

    View Slide

  11. 11
    v2 v2 v2 v2 v2
    Service
    v1 v1 v1 v1 v1

    View Slide

  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%
    ...

    View Slide

  13. 13
    v1 v1 v1 v1 v1
    Service

    View Slide

  14. 14
    v2 v2 v1 v1 v1
    Service

    View Slide

  15. 15
    v2 v2 v2 v2 v1
    Service

    View Slide

  16. 16
    v2 v2 v2 v2 v2
    Service

    View Slide

  17. 17
    v2 v2 v2 v2 v2
    Service

    View Slide

  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

    View Slide

  19. 19
    v1 v1 v1 v1 v1
    Service
    Prod
    v1

    View Slide

  20. 20
    v1 v1 v1 v2 v2
    Service
    QA
    v2
    Service
    Prod
    Testes

    View Slide

  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

    View Slide

  22. 22

    View Slide

  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.

    View Slide

  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

    View Slide

  25. 25
    v1 v1 v1 v1 v1
    Service
    Prod
    v1 v1 v1 v1 v2
    90% 10%

    View Slide

  26. 26
    v1 v1 v1 v1 v1
    Service
    Prod
    v1 v1 v1 v2 v2
    80% 20%

    View Slide

  27. 27
    Agora 99% e 1%

    View Slide

  28. 28
    Agora 99% e 1%

    View Slide

  29. View Slide

  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.

    View Slide

  31. 31
    Istio
    + v1.1 (stable)
    + Google, Redhat, Lyft
    + Suporta não apenas Kubernetes
    + Complexo.

    View Slide

  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.

    View Slide

  33. 33
    Seus novos amigos da vizinhança! (CRD)
    + Gateway
    + VirtualService
    + DestinationRule
    + Serviceentry

    View Slide

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

    View Slide

  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.

    View Slide

  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!

    View Slide

  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

    View Slide

  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...

    View Slide

  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

    View Slide

  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)

    View Slide

  41. 41
    Pontos de atenção!

    View Slide

  42. View Slide

  43. 43
    https://github.com/drequena/istio-app/tree/dev

    View Slide

  44. 44

    View Slide

  45. 45
    SRV-1
    DB
    Remote
    API
    SRV-2
    SRV-4
    SRV-3
    K8S
    Service

    View Slide

  46. 46
    SRV-1
    DB
    Remote
    API
    SRV-2
    SRV-4
    SRV-3

    View Slide

  47. 47
    SRV-1
    v1
    DB
    Remote
    API
    SRV-2
    SRV-4
    SRV-3
    SRV-1
    v2

    View Slide

  48. 48
    SRV-1
    v1
    DB
    Remote
    API
    SRV-2
    v1
    SRV-4
    SRV-3
    SRV-1
    v2
    90% 10%
    SRV-2
    v2

    View Slide

  49. 49
    SRV-1
    v1
    DB
    Remote
    API
    SRV-2
    v1
    SRV-4
    SRV-3
    SRV-1
    v2
    90% 10%
    SRV-2
    v2
    30%

    View Slide

  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...

    View Slide

  51. 51

    View Slide

  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/

    View Slide

  53. Perguntas?
    Obrigado!

    View Slide

  54. You can find me at @Daniel_Requena
    (twitter)
    www.linkedin.com/in/danielrequena/
    [email protected]
    [email protected]
    Daniel Requena

    View Slide