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

Henrique Dalssaso: Criando sua própria distribu...

DevOpsDays Floripa
November 13, 2023
38

Henrique Dalssaso: Criando sua própria distribuição de Kubernetes

Palestra realizada no DevOps Days Florianópolis 2023

DevOpsDays Floripa

November 13, 2023
Tweet

More Decks by DevOpsDays Floripa

Transcript

  1. Agenda $ whoami Um pouco sobre iFood Agradecimentos Acertando o

    vocabulário O problema A proposta A implementação Links de tudo o que foi falado 2
  2. Ideia final No final dessa apresentação vocês saberão uma nova

    forma padrão, reproduzível e escalável de gerenciar kubernetes addons e serviços core 3
  3. $ whoami Henrique Dalssaso (Dalssa, Dalssasin, Dalssin) Humano da Zelda,

    do Vax’ildan e da Keyleth Staff Site Reliability Engineer @ iFood com foco em K8s 13+ anos na área de TI (Suporte/SysAdmin/DevOps/SRE/Platform..) DM de D&D nas horas vagas (ou seja, quase nunca 🫠) Usuário de Emacs com keybindings do VIM 4
  4. Um pouco sobre o iFood Funcionários: ~5500 Time técnico: ~2200

    Requisições: 250k rps Serviços: 3000+ Deploys: 300+ por dia Kubernetes: ~98% de todos os serviços 50+ clusters 5
  5. Agradecimentos Todo o time de K8s do iFood, desde os

    primórdios fazendo tudo isso que vai ser mostrado aqui acontecer Em especial ao @daniel.requena que fez essa apresentação antes de mim e eu to usando a mesma ideia, mesmos slides (quase…) 6
  6. Acertando o vocabulário Distribuição kubernetes: Ferramentas/Soluções para criação e gerenciamento

    de Kubernetes de forma geral, como EKS, GKE, AKS , KubeADM, Cluster-API, Kops, etc… 7.1
  7. Acertando o vocabulário Distribuição kubernetes: Ferramentas/Soluções para criação e gerenciamento

    de Kubernetes de forma geral, como EKS, GKE, AKS , KubeADM, Cluster-API, Kops, etc… Distribuição iFood: Padronização de instalação e customização de pacotes. Um conjunto testado e homologado de pacotes de softwares que quando instalados proveem todas (ou quase todas) as funcionalidades para a sua necessidade. 7.2
  8. O problema Projeto Kubernetes iFood - 2018 4 clusters (1

    dev, 3 BUs) Poucas aplicações, poucas ferramentas/addons Projeto Kubernetes iFood - 2019 11 clusters (1 dev, 10 BUs) ~30% das apps do iFood, várias ferramentas/addons 8
  9. O problema Scaling (horizontal e vertical) Monitoring + Grafana +

    Alerting Ingress CNI Security Policies Caos Consul agent External DNS Kiam Secrets Manager Backup Auth Cost management CertManager External Controller Service Mesh Open Telemetry Custom controllers/Operators 9
  10. Como a nós faziamos o setup do ferramental/addons no começo

    O problema Problemas Atualização de valores demorada 10.2
  11. Como a nós faziamos o setup do ferramental/addons no começo

    O problema Problemas Atualização de valores demorada Reconciliação 10.3
  12. Como a nós faziamos o setup do ferramental/addons no começo

    O problema Problemas Atualização de valores demorada Reconciliação Multiplas instalações da mesma aplicação 10.4
  13. Como a nós faziamos o setup do ferramental/addons no começo

    O problema Problemas Atualização de valores demorada Reconciliação Multiplas instalações da mesma aplicação Falta de customização 10.5
  14. Como a nós faziamos o setup do ferramental/addons no começo

    O problema Problemas Atualização de valores demorada Reconciliação Multiplas instalações da mesma aplicação Falta de customização Zero testes (A nível de aplicação e a nivel de cluster) 10.6
  15. Como a nós faziamos o setup do ferramental/addons no começo

    O problema Problemas Atualização de valores demorada Reconciliação Multiplas instalações da mesma aplicação Falta de customização Zero testes (A nível de aplicação e a nivel de cluster) Demorado 10.7
  16. Como a nós faziamos o setup do ferramental/addons no começo

    O problema Problemas Atualização de valores demorada Reconciliação Multiplas instalações da mesma aplicação Falta de customização Zero testes (A nível de aplicação e a nivel de cluster) Demorado Super centralizado 10.8
  17. Como a nós faziamos o setup do ferramental/addons no começo

    O problema Problemas Atualização de valores demorada Reconciliação Multiplas instalações da mesma aplicação Falta de customização Zero testes (A nível de aplicação e a nivel de cluster) Demorado Super centralizado Escalabilidade 10.9
  18. A solução Requisitos: 100% baseado em Helm Padronizado Simples (de

    preferencia uma cli só pra gerenciar tudo) Flexível Extensível Testavel Escalável 13
  19. Nossa inspiração Pontos fortes de uma distro Linux Gerenciador de

    Pacotes Estável Padronizada Ciclo de Vida/Releases Extensível Community Driven Gira em torno de um "ponto fixo": Linux Kernel 15
  20. Montando a distribuição Helmfile: A salvação de tudo O que

    exatamente é o Helmfile TL;DR: Um wrapper em cima do Helm que usa anabolisantes, ou simplesmente um Chart que cuida de outros Charts As principais características são: Templates usando Sprig incluindo o values.yaml 19
  21. Separação de lógica e valores Muitas outras formas de referenciar

    arquivos de valor (S3, Git, OCI, Local…) Transforma tudo em Helm Release (mesmo se passar manifestos de Kustomize) Tem separação de dependencias por Release Conceito de ambientes (dev/prod) Integração com Backend de Secrets (Vault, AWS SSM) 20
  22. Algumas funcionalidades problemáticas, se usadas sem cautela jsonpatch em manifestos

    após o template Hooks (rodar qualquer tipo de comando) 21
  23. Montando a distro $ cat helmfile.yaml repositories: - name: bitnami

    url: https://charts.bitnami.com/bitnami 1 2 3 - name: custom 4 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master 5 releases: 6 - name: external-dns 7 namespace: machinery 8 chart: bitnami/external-dns 9 version: 3.2.6 10 values: 11 - values/default.yaml 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 image: 16 22
  24. Montando a distro $ cat helmfile.yaml repositories: - name: bitnami

    url: https://charts.bitnami.com/bitnami 1 2 3 - name: custom 4 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master 5 releases: 6 - name: external-dns 7 namespace: machinery 8 chart: bitnami/external-dns 9 version: 3.2.6 10 values: 11 - values/default.yaml 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 image: 16 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master repositories: 1 - name: bitnami 2 url: https://charts.bitnami.com/bitnami 3 - name: custom 4 5 releases: 6 - name: external-dns 7 namespace: machinery 8 chart: bitnami/external-dns 9 version: 3.2.6 10 values: 11 - values/default.yaml 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 image: 16 22.1
  25. Montando a distro $ cat helmfile.yaml repositories: - name: bitnami

    url: https://charts.bitnami.com/bitnami 1 2 3 - name: custom 4 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master 5 releases: 6 - name: external-dns 7 namespace: machinery 8 chart: bitnami/external-dns 9 version: 3.2.6 10 values: 11 - values/default.yaml 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 image: 16 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master repositories: 1 - name: bitnami 2 url: https://charts.bitnami.com/bitnami 3 - name: custom 4 5 releases: 6 - name: external-dns 7 namespace: machinery 8 chart: bitnami/external-dns 9 version: 3.2.6 10 values: 11 - values/default.yaml 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 image: 16 releases: - name: external-dns namespace: machinery chart: bitnami/external-dns version: 3.2.6 values: - values/default.yaml repositories: 1 - name: bitnami 2 url: https://charts.bitnami.com/bitnami 3 - name: custom 4 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master 5 6 7 8 9 10 11 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 - image: 16 t 1 4 17 22.2
  26. Montando a distro $ cat helmfile.yaml repositories: - name: bitnami

    url: https://charts.bitnami.com/bitnami 1 2 3 - name: custom 4 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master 5 releases: 6 - name: external-dns 7 namespace: machinery 8 chart: bitnami/external-dns 9 version: 3.2.6 10 values: 11 - values/default.yaml 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 image: 16 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master repositories: 1 - name: bitnami 2 url: https://charts.bitnami.com/bitnami 3 - name: custom 4 5 releases: 6 - name: external-dns 7 namespace: machinery 8 chart: bitnami/external-dns 9 version: 3.2.6 10 values: 11 - values/default.yaml 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 image: 16 releases: - name: external-dns namespace: machinery chart: bitnami/external-dns version: 3.2.6 values: - values/default.yaml repositories: 1 - name: bitnami 2 url: https://charts.bitnami.com/bitnami 3 - name: custom 4 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master 5 6 7 8 9 10 11 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 image: 16 - name: reactiveops chart: custom/reactiveops values: - image: tag: 1.4 url: https://charts.bitnami.com/bitnami 3 - name: custom 4 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master 5 releases: 6 - name: external-dns 7 namespace: machinery 8 chart: bitnami/external-dns 9 version: 3.2.6 10 values: 11 - values/default.yaml 12 13 14 15 16 17 - scheme: {{ env "SCHEME" | default "https" }} 18 22.3
  27. Montando a distro $ cat helmfile.yaml repositories: - name: bitnami

    url: https://charts.bitnami.com/bitnami 1 2 3 - name: custom 4 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master 5 releases: 6 - name: external-dns 7 namespace: machinery 8 chart: bitnami/external-dns 9 version: 3.2.6 10 values: 11 - values/default.yaml 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 image: 16 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master repositories: 1 - name: bitnami 2 url: https://charts.bitnami.com/bitnami 3 - name: custom 4 5 releases: 6 - name: external-dns 7 namespace: machinery 8 chart: bitnami/external-dns 9 version: 3.2.6 10 values: 11 - values/default.yaml 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 image: 16 releases: - name: external-dns namespace: machinery chart: bitnami/external-dns version: 3.2.6 values: - values/default.yaml repositories: 1 - name: bitnami 2 url: https://charts.bitnami.com/bitnami 3 - name: custom 4 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master 5 6 7 8 9 10 11 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 image: 16 - name: reactiveops chart: custom/reactiveops values: image: repositories: 1 - name: bitnami 2 url: https://charts.bitnami.com/bitnami 3 - name: custom 4 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master 5 releases: 6 - name: external-dns 7 namespace: machinery 8 chart: bitnami/external-dns 9 version: 3.2.6 10 values: 11 - values/default.yaml 12 13 14 15 16 - scheme: {{ env "SCHEME" | default "https" }} url: https://charts.bitnami.com/bitnami 3 - name: custom 4 url: git+https://github.com/reactiveops/polaris@deploy/helm?ref=master 5 releases: 6 - name: external-dns 7 namespace: machinery 8 chart: bitnami/external-dns 9 version: 3.2.6 10 values: 11 - values/default.yaml 12 - name: reactiveops 13 chart: custom/reactiveops 14 values: 15 - image: 16 tag: 1.4 17 18 22.4
  28. Montando a distro $ cat meta-helmfile.yaml helmfiles: 1 - path:

    git::https://github.com/drequena/grafana-package.git@/helmfile.yaml? 2 values: 3 - grafana: 4 enabled: true 5 resources: 6 request: 7 cpu: “100m” 8 - path: git::https://github.com/drequna/prometheus-package.git@/helmfile.yam 9 values: 10 - prometheus: 11 enabled: true 12 labels: 13 - owner: “secteam” 14 23
  29. Montando a distro $ cat meta-helmfile.yaml helmfiles: 1 - path:

    git::https://github.com/drequena/grafana-package.git@/helmfile.yaml? 2 values: 3 - grafana: 4 enabled: true 5 resources: 6 request: 7 cpu: “100m” 8 - path: git::https://github.com/drequna/prometheus-package.git@/helmfile.yam 9 values: 10 - prometheus: 11 enabled: true 12 labels: 13 - owner: “secteam” 14 - path: git::https://github.com/drequena/grafana-package.git@/helmfile.yaml? values: - grafana: enabled: true resources: request: cpu: “100m” helmfiles: 1 2 3 4 5 6 7 8 - path: git::https://github.com/drequna/prometheus-package.git@/helmfile.yam 9 values: 10 - prometheus: 11 enabled: true 12 labels: 13 - owner: “secteam” 14 23.1
  30. Montando a distro $ cat meta-helmfile.yaml helmfiles: 1 - path:

    git::https://github.com/drequena/grafana-package.git@/helmfile.yaml? 2 values: 3 - grafana: 4 enabled: true 5 resources: 6 request: 7 cpu: “100m” 8 - path: git::https://github.com/drequna/prometheus-package.git@/helmfile.yam 9 values: 10 - prometheus: 11 enabled: true 12 labels: 13 - owner: “secteam” 14 - path: git::https://github.com/drequena/grafana-package.git@/helmfile.yaml? values: - grafana: enabled: true resources: request: cpu: “100m” helmfiles: 1 2 3 4 5 6 7 8 - path: git::https://github.com/drequna/prometheus-package.git@/helmfile.yam 9 values: 10 - prometheus: 11 enabled: true 12 labels: 13 - owner: “secteam” 14 - path: git::https://github.com/drequna/prometheus-package.git@/helmfile.yam helmfiles: 1 - path: git::https://github.com/drequena/grafana-package.git@/helmfile.yaml? 2 values: 3 - grafana: 4 enabled: true 5 resources: 6 request: 7 cpu: “100m” 8 9 values: 10 - prometheus: 11 enabled: true 12 labels: 13 - owner: “secteam” 14 23.2
  31. Montando a distro $ cat meta-helmfile.yaml helmfiles: 1 - path:

    git::https://github.com/drequena/grafana-package.git@/helmfile.yaml? 2 values: 3 - grafana: 4 enabled: true 5 resources: 6 request: 7 cpu: “100m” 8 - path: git::https://github.com/drequna/prometheus-package.git@/helmfile.yam 9 values: 10 - prometheus: 11 enabled: true 12 labels: 13 - owner: “secteam” 14 - path: git::https://github.com/drequena/grafana-package.git@/helmfile.yaml? values: - grafana: enabled: true resources: request: cpu: “100m” helmfiles: 1 2 3 4 5 6 7 8 - path: git::https://github.com/drequna/prometheus-package.git@/helmfile.yam 9 values: 10 - prometheus: 11 enabled: true 12 labels: 13 - owner: “secteam” 14 - path: git::https://github.com/drequna/prometheus-package.git@/helmfile.yam helmfiles: 1 - path: git::https://github.com/drequena/grafana-package.git@/helmfile.yaml? 2 values: 3 - grafana: 4 enabled: true 5 resources: 6 request: 7 cpu: “100m” 8 9 values: 10 - prometheus: 11 enabled: true 12 labels: 13 - owner: “secteam” 14 values: - prometheus: enabled: true labels: - owner: “secteam” helmfiles: 1 - path: git::https://github.com/drequena/grafana-package.git@/helmfile.yaml? 2 values: 3 - grafana: 4 enabled: true 5 resources: 6 request: 7 cpu: “100m” 8 - path: git::https://github.com/drequna/prometheus-package.git@/helmfile.yam 9 10 11 12 13 14 23.3
  32. 24

  33. Montando a distro $ cat myclusters/sales.yaml - path: git::https://github.com/drequena/distribution.git@/helmfile.yaml?ref helmfiles:

    1 2 values: 3 - prometheus: 4 enabled: false 5 - grafana: 6 url: “graphs.company.net” 7 8 - path: git::https://github.com/drequena/cert-manager-package.git@/helmfile. 9 values: 10 - cert-manager: 11 resources: 12 request: 13 cpu: 250m 14 25
  34. Montando a distro $ cat myclusters/sales.yaml - path: git::https://github.com/drequena/distribution.git@/helmfile.yaml?ref helmfiles:

    1 2 values: 3 - prometheus: 4 enabled: false 5 - grafana: 6 url: “graphs.company.net” 7 8 - path: git::https://github.com/drequena/cert-manager-package.git@/helmfile. 9 values: 10 - cert-manager: 11 resources: 12 request: 13 cpu: 250m 14 values: - prometheus: enabled: false - grafana: url: “graphs.company.net” helmfiles: 1 - path: git::https://github.com/drequena/distribution.git@/helmfile.yaml?ref 2 3 4 5 6 7 8 - path: git::https://github.com/drequena/cert-manager-package.git@/helmfile. 9 values: 10 - cert-manager: 11 resources: 12 request: 13 cpu: 250m 14 25.1
  35. Montando a distro $ cat myclusters/sales.yaml - path: git::https://github.com/drequena/distribution.git@/helmfile.yaml?ref helmfiles:

    1 2 values: 3 - prometheus: 4 enabled: false 5 - grafana: 6 url: “graphs.company.net” 7 8 - path: git::https://github.com/drequena/cert-manager-package.git@/helmfile. 9 values: 10 - cert-manager: 11 resources: 12 request: 13 cpu: 250m 14 values: - prometheus: enabled: false - grafana: url: “graphs.company.net” helmfiles: 1 - path: git::https://github.com/drequena/distribution.git@/helmfile.yaml?ref 2 3 4 5 6 7 8 - path: git::https://github.com/drequena/cert-manager-package.git@/helmfile. 9 values: 10 - cert-manager: 11 resources: 12 request: 13 cpu: 250m 14 - path: git::https://github.com/drequena/cert-manager-package.git@/helmfile. helmfiles: 1 - path: git::https://github.com/drequena/distribution.git@/helmfile.yaml?ref 2 values: 3 - prometheus: 4 enabled: false 5 - grafana: 6 url: “graphs.company.net” 7 8 9 values: 10 - cert-manager: 11 resources: 12 request: 13 cpu: 250m 14 25.2
  36. Montando a distro $ cat myclusters/sales.yaml - path: git::https://github.com/drequena/distribution.git@/helmfile.yaml?ref helmfiles:

    1 2 values: 3 - prometheus: 4 enabled: false 5 - grafana: 6 url: “graphs.company.net” 7 8 - path: git::https://github.com/drequena/cert-manager-package.git@/helmfile. 9 values: 10 - cert-manager: 11 resources: 12 request: 13 cpu: 250m 14 values: - prometheus: enabled: false - grafana: url: “graphs.company.net” helmfiles: 1 - path: git::https://github.com/drequena/distribution.git@/helmfile.yaml?ref 2 3 4 5 6 7 8 - path: git::https://github.com/drequena/cert-manager-package.git@/helmfile. 9 values: 10 - cert-manager: 11 resources: 12 request: 13 cpu: 250m 14 - path: git::https://github.com/drequena/cert-manager-package.git@/helmfile. helmfiles: 1 - path: git::https://github.com/drequena/distribution.git@/helmfile.yaml?ref 2 values: 3 - prometheus: 4 enabled: false 5 - grafana: 6 url: “graphs.company.net” 7 8 9 values: 10 - cert-manager: 11 resources: 12 request: 13 cpu: 250m 14 values: - cert-manager: resources: request: cpu: 250m helmfiles: 1 - path: git::https://github.com/drequena/distribution.git@/helmfile.yaml?ref 2 values: 3 - prometheus: 4 enabled: false 5 - grafana: 6 url: “graphs.company.net” 7 8 - path: git::https://github.com/drequena/cert-manager-package.git@/helmfile. 9 10 11 12 13 14 25.3
  37. Montando a distro $ cat distribution/helmfile.yaml - <optional-distribution-default-values> helmfiles: 1

    - path: git::https://github.com/drequena/grafana-package.git@/helmfile.yaml?r 2 values: 3 4 - {{ .Values | get "grafana" dict | toYaml | indent 6 | trim}} 5 6 - path: git::https://github.com/drequena/prometheus-package.git@/helmfile.yam 7 values: 8 - {{ .Values | get "prometheus" dict | toYaml | indent 6 | trim}} 9 26
  38. Montando a distro $ cat distribution/helmfile.yaml - <optional-distribution-default-values> helmfiles: 1

    - path: git::https://github.com/drequena/grafana-package.git@/helmfile.yaml?r 2 values: 3 4 - {{ .Values | get "grafana" dict | toYaml | indent 6 | trim}} 5 6 - path: git::https://github.com/drequena/prometheus-package.git@/helmfile.yam 7 values: 8 - {{ .Values | get "prometheus" dict | toYaml | indent 6 | trim}} 9 - {{ .Values | get "prometheus" dict | toYaml | indent 6 | trim}} helmfiles: 1 - path: git::https://github.com/drequena/grafana-package.git@/helmfile.yaml?r 2 values: 3 - <optional-distribution-default-values> 4 - {{ .Values | get "grafana" dict | toYaml | indent 6 | trim}} 5 6 - path: git::https://github.com/drequena/prometheus-package.git@/helmfile.yam 7 values: 8 9 26.1
  39. Montando a distro $ cat packages/prometheus/helmfile.yaml condition: prometheus.enabled repositories: 1

    - name: prometheus 2 url: https://charts.prometheus.org/prometheus 3 releases: 4 - name: prometheus 5 6 needs: 7 - prometheus-operator 8 namespace: monitoring 9 chart: prometheus/prometheus 10 version: 2.49.1 11 values: 12 - values/default.yaml 13 - {{ .Values | get "prometheus" dict | toYaml | indent 6 | trim}} 14 27
  40. Montando a distro $ cat packages/prometheus/helmfile.yaml condition: prometheus.enabled repositories: 1

    - name: prometheus 2 url: https://charts.prometheus.org/prometheus 3 releases: 4 - name: prometheus 5 6 needs: 7 - prometheus-operator 8 namespace: monitoring 9 chart: prometheus/prometheus 10 version: 2.49.1 11 values: 12 - values/default.yaml 13 - {{ .Values | get "prometheus" dict | toYaml | indent 6 | trim}} 14 needs: - prometheus-operator repositories: 1 - name: prometheus 2 url: https://charts.prometheus.org/prometheus 3 releases: 4 - name: prometheus 5 condition: prometheus.enabled 6 7 8 namespace: monitoring 9 chart: prometheus/prometheus 10 version: 2.49.1 11 values: 12 - values/default.yaml 13 - {{ .Values | get "prometheus" dict | toYaml | indent 6 | trim}} 14 27.1
  41. Montando a distro $ cat packages/prometheus/helmfile.yaml condition: prometheus.enabled repositories: 1

    - name: prometheus 2 url: https://charts.prometheus.org/prometheus 3 releases: 4 - name: prometheus 5 6 needs: 7 - prometheus-operator 8 namespace: monitoring 9 chart: prometheus/prometheus 10 version: 2.49.1 11 values: 12 - values/default.yaml 13 - {{ .Values | get "prometheus" dict | toYaml | indent 6 | trim}} 14 needs: - prometheus-operator repositories: 1 - name: prometheus 2 url: https://charts.prometheus.org/prometheus 3 releases: 4 - name: prometheus 5 condition: prometheus.enabled 6 7 8 namespace: monitoring 9 chart: prometheus/prometheus 10 version: 2.49.1 11 values: 12 - values/default.yaml 13 - {{ .Values | get "prometheus" dict | toYaml | indent 6 | trim}} 14 - values/default.yaml repositories: 1 - name: prometheus 2 url: https://charts.prometheus.org/prometheus 3 releases: 4 - name: prometheus 5 condition: prometheus.enabled 6 needs: 7 - prometheus-operator 8 namespace: monitoring 9 chart: prometheus/prometheus 10 version: 2.49.1 11 values: 12 13 - {{ .Values | get "prometheus" dict | toYaml | indent 6 | trim}} 14 27.2
  42. 33

  43. A implementação (testes, automações e validações) Usamos um set de

    ferarmentas pra automatizar, validar e testar os nossos pacotes antes de eles instalados em ambientes produtivos 34
  44. A implementação (testes, automações e validações) Usamos um set de

    ferarmentas pra automatizar, validar e testar os nossos pacotes antes de eles instalados em ambientes produtivos vCluster - Clusters efêmeros isolados 34.1
  45. A implementação (testes, automações e validações) Usamos um set de

    ferarmentas pra automatizar, validar e testar os nossos pacotes antes de eles instalados em ambientes produtivos vCluster - Clusters efêmeros isolados Pluto - Verificação de depreciação de versões de API do K8s 34.2
  46. A implementação (testes, automações e validações) Usamos um set de

    ferarmentas pra automatizar, validar e testar os nossos pacotes antes de eles instalados em ambientes produtivos vCluster - Clusters efêmeros isolados Pluto - Verificação de depreciação de versões de API do K8s Terratest - Testes unitários e de integração para cada pacote 34.3
  47. Terratest-helmfile - Lib interna que serve como um wrapper do

    terratest GitLab CI - Todo o fluxo é automatizado pelo CI 35.1
  48. Terratest-helmfile - Lib interna que serve como um wrapper do

    terratest GitLab CI - Todo o fluxo é automatizado pelo CI RenovateBot - MRs automáticos com novas versões dos charts públicos e privados 35.2
  49. Terratest-helmfile - Lib interna que serve como um wrapper do

    terratest GitLab CI - Todo o fluxo é automatizado pelo CI RenovateBot - MRs automáticos com novas versões dos charts públicos e privados Semantic Release - Gerador de Releases (GitLab CI Release, Git Tags e CHANGELOG) automáticos baseados em commit message 35.3
  50. A implementação (testes, automações e validações) Pluto helmfile -f helmfile.yaml

    template --args "--kube-version=<version>" \ | pluto detect --target-versions=k8s="<version>" 36
  51. Testes Unitários output := helmfile.RenderTemplate(t, options) var service v1.Service helm.UnmarshalK8SYaml(t,

    output, &service) assert.Equal(t, "external-dns", service.Name, "service name should be external-d assert.Equal(t, v1.ServiceType("ClusterIP"), service.Spec.Type, "service type sh assert.Equal(t, "http", service.Spec.Ports[0].Name, "service port name should be assert.Equal(t, intstr.IntOrString(intstr.IntOrString{Type: 1, IntVal: 0, StrVa assert.Equal(t, int32(7979), service.Spec.Ports[0].Port, "service port should be 37
  52. Testes de integração Pra cada pacote é necessário subir um

    cluster usando vCluster com a versão de Kubernetes suportada pelo time Após o vCluster no ar, os testes são rodados da mesma forma que os unit test go test -timeout 4h -v ./integration/ 39
  53. RenovateBot Existe um agendamento dentro do nosso Gitlab que roda

    um runner customizado do RenovateBot todo o domingo O runner verifica quais repositórios dos pacotes tem o arquivo renovate.json Os repositórios que tiverem, vão ser verificados pela ferramenta e caso exista alguma versão nova de chart/imagem docker o bot irá abrir um novo MR 40
  54. Conclusões O que ficou bom Helm Flexibilidade Escalável Extensível Padronizado

    Conceito modular e reusável Testes automátizados, validações pré-produção e pré-upgrade 41.7
  55. O que ainda pode melhorar A interdependecia entre os helmfiles

    Não é tão simples achar os valores utilizados para determinado cluster (cluster -> distribuição -> pacote -> chart) 42.2
  56. O que ainda pode melhorar A interdependecia entre os helmfiles

    Não é tão simples achar os valores utilizados para determinado cluster (cluster -> distribuição -> pacote -> chart) Atualizações automatizadas de versão em clusters após todos os testes passarem 42.3
  57. Links de tudo o que foi falado Helm - Helmfile

    - Terratest - vCluster - Pluto - RenovateBot - Semantic Release - Exemplos de código helmfile (Valeu @requena ): https://helm.sh https://helmfile.readthedocs.io/en/latest https://terratest.gruntwork.io https://vcluster.com https://pluto.docs.fairwinds.com https://docs.renovatebot.com https://github.com/semantic- release/semantic-release https://github.com/drequena/clusters 43
  58. 44

  59. (x.com 🥴) (tá mais off do que on ultimamente) Onde

    me encontrar https://www.linkedin.com/in/dalssaso https://twitter.com/hdalssaso https://github.com/dalssaso https://sillyops.dev 45