AWS EKS - Parte IV - Configurando Add-ons gerenciados
Tags: kubernetes, aws, terraform, cloud
Published: 2023-01-12 00:51:20


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jlp0r11m5bth5884x86n.png)


**Objetivo geral:**

Setup completo de um cluster Kubernetes utilizando AWS EKS e Terraform seguindo as melhores práticas e documentações oficias. Demonstração de atualizações de aplicações e demais recursos


**Objetivo da parte IV:**
Configurar os Add-ons gerenciados.


**Avisos importantes**
Leitura das partes 1,2 e 3. 
A parte 1 é responsável pelo setup inicial do cluster, clique aqui.
A parte 2 é responsável por habilitar todos os logs do Control Plane.
A parte 3 é responsável restringir o acesso público ao cluster.

A configuração do cluster é exclusiva para laboratório e testes.

**Pré requisitos**
Todos da parte 1,2 e 3.
Versão do cluster a partir da 1.24.


**Entendendo mais sobre os Add-ons**
Um Add-on é um software que fornece recursos operacionais de suporte a aplicações do Kubernetes, mas que não é específico da aplicação. 
O Amazon EKS instala automaticamente complementos autogerenciados, como o Amazon VPC CNI plugin for Kubernetes, o kube-proxy e o CoreDNS, para cada cluster. 
Para ter uma flexibilidade maior na gerencia dos Add-ons, vamos  alterar a configuração padrão e gerencia-los. 

Para maiores informações sobre os Add-ons, acesse a documentação oficial [clicando aqui](https://docs.aws.amazon.com/pt_br/eks/latest/userguide/eks-add-ons.html).


Agora que "_os trem_" estão mais claros, **Let's go to work**!


**Configurações inicias**
No arquivo `terraform.tfvars` vamos inserir as o valor para as variáveis abaixo:

```
## Add-ons
version_kube_proxy = "v1.24.10-eksbuild.2"
version_coredns = "v1.9.3-eksbuild.2"
version_vpc-cni =  "v1.12.6-eksbuild.1"
version_ebs-csi = "v1.17.0-eksbuild.1"
```

Esses valores são as versões de cada add-ons compatíveis com a versão do cluster instalada. As versões de cada um pode ser consultada nos links abaixo:

- [kube_proxy](https://docs.aws.amazon.com/eks/latest/userguide/managing-kube-proxy.html)
- [coredns](https://docs.aws.amazon.com/eks/latest/userguide/managing-coredns.html)
- [vpc-cni](https://docs.aws.amazon.com/eks/latest/userguide/managing-vpc-cni.html)
- [ebs-csi](https://aws.amazon.com/blogs/containers/amazon-ebs-csi-driver-is-now-generally-available-in-amazon-eks-add-ons/)


Vamos criar um novo arquivo na raiz do repositório chamado `addons.tf`, nesse arquivo vamos configurar todos os add-ons.

Vamos configurar 3 add-ons: **kube-proxy, coredns, vpc-cni e ebs-csi**.

Para configurar o **kube-proxy** vamos inserir o trecho do código abaixo:

```
resource "aws_eks_addon" "kube_proxy" {
  addon_name        = "kube-proxy"
  cluster_name      = var.cluster_name
  addon_version     = var.version_kube_proxy
  resolve_conflicts = "OVERWRITE"  
  tags = merge(
   # var.tags,
    {
      "eks_addon" = "kube-proxy"
    }
  )
}
```

Para configurar o **core-dns** vamos inserir o trecho do código abaixo:

```
resource "aws_eks_addon" "core_dns" {
  addon_name        = "coredns"
  cluster_name      = var.cluster_name
  addon_version     = var.version_coredns 
  resolve_conflicts = "OVERWRITE"
  tags = merge(
   # var.tags,
    {
      "eks_addon" = "coredns"
    }
  )
}
```
Para configurar o **vpc-cni** vamos inserir o trecho do código abaixo:

```
resource "aws_eks_addon" "vpc-cni" {
  addon_name        = "vpc-cni"
  cluster_name      = var.cluster_name
  addon_version     = var.version_vpc-cni
  resolve_conflicts = "OVERWRITE"
  tags = merge(
   # var.tags,
    {
      "eks_addon" = "vpc-cni"
    }
  )
}
```

Para configurar o **ebs-csi** vamos inserir o trecho do código abaixo:

```
# https://aws.amazon.com/blogs/containers/amazon-ebs-csi-driver-is-now-generally-available-in-amazon-eks-add-ons/ 
data "aws_iam_policy" "ebs_csi_policy" {
  arn = "arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy"
}

module "irsa-ebs-csi" {
  source  = "terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc"
  version = "4.7.0"

  create_role                   = true
  role_name                     = "AmazonEKSTFEBSCSIRole-${module.eks.cluster_name}"
  provider_url                  = module.eks.oidc_provider
  role_policy_arns              = [data.aws_iam_policy.ebs_csi_policy.arn]
  oidc_fully_qualified_subjects = ["system:serviceaccount:kube-system:ebs-csi-controller-sa"]
}

resource "aws_eks_addon" "ebs-csi" {
  cluster_name             = var.cluster_name
  addon_name               = "aws-ebs-csi-driver"
  addon_version            = var.version_ebs-csi
  service_account_role_arn = module.irsa-ebs-csi.iam_role_arn
  tags = {
    "eks_addon" = "ebs-csi"
    "terraform" = "true"
  }
}

Para o EBS-CSI temos que criar alguns recursos a mais como uma Policy e uma Service Account. Para maiores informações acesse a documentação oficial [clicando aqui](https://aws.amazon.com/blogs/containers/amazon-ebs-csi-driver-is-now-generally-available-in-amazon-eks-add-ons/).
```

Por ultimo vamos adicionar as novas variáveis no arquivo `variables.tf`. 

```
### Add-ons
variable "version_kube_proxy" {
  description = "Versão do Kube-Proxy"
  type        = string
  default     = ""
}

variable "version_coredns" {
  description = "Versão do Coredns"
  type        = string
  default     = ""
}

variable "version_vpc-cni" {
  description = "Versão do VPC-CNI"
  type        = string
  default     = ""
}

variable "version_ebs-csi" {
  description = "Versão do EBS-CSI"
  type        = string
  default     = ""
}
```


**Aplicando as atualizações**
Vamos executar o Plan e o Apply para atualizar nosso template com as alterações.

`terraform plan && terraform apply -auto-approve`

**Validações**
Através da console de gerenciamento da AWS, procure pelo serviço AWS EKS, localize o cluster e clique no menu Add-ons.
No menu terá os 4 add-ons instalados 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dqnkdfgk9lhwcqnamx6j.png)


Com isso finalizamos a instalação dos add-ons gerenciados. 

**Próximas partes**
- AWS EKS - Parte V - Deploy e atualização de uma app (_em construção_)

**Partes Anteriores**
- [AWS EKS - Parte I - Setup inicial](https://medium.com/@rodrigofrs13/aws-eks-parte-i-setup-inicial-495e612b0c3d)
- [AWS EKS - Parte II - Habilitando logs do Control Plane](https://medium.com/@rodrigofrs13/aws-eks-parte-ii-habilitando-logs-do-control-plane-12224a4a6a1f)
- [AWS EKS - Parte III - Restringindo acesso ao cluster](https://dev.to/rodrigofrs13/aws-eks-parte-iii-restringindo-acesso-ao-cluster-2hd3)



**Referências**

- [Amazon EBS CSI driver is now generally available in Amazon EKS add-ons](https://aws.amazon.com/blogs/containers/amazon-ebs-csi-driver-is-now-generally-available-in-amazon-eks-add-ons/)
- [Amazon EKS add-ons](https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html)