top of page
Foto do escritorRafael Natali

Implantar Aplicações no Kubernetes com Ansible

Infraestrutura como Código com Ansible para automatizar implantação do Nginx no Kubernetes do Google (GKE) na platform Google Cloud (GCP).


Automatize implantações de aplicativos no Kubernetes usando Ansible - Imagem do autor
Automatize implantações de aplicativos no Kubernetes usando Ansible - Imagem do autor

Pré-requisitos


Este tutorial é uma continuação do meu artigo anterior chamado "Como automatizar a configuraçāo de um cluster Kubernetes usando Ansible". Este artigo tem o objetivo de ajudá-lo a usar o Ansible¹ para criar um Cluster Kubernetes na plataforma Google Cloud (GCP)². Portanto, se você ainda não fez isso, revise o artigo mencionado antes de prosseguir.


O código usado para criar este tutorial está disponível neste repositório.


A partir deste ponto, presumo que você já tenha um cluster GKE em execução.


Usando o cluster Kubernetes


Usaremos o plugin kubernetes.core.k8s³ para gerenciar objetos dentro do nosso cluster GKE. Quanto ao nosso exemplo do Nginx, trabalharemos com dois objetos Kubernetes: Namespace⁴ e Pod⁵.

Estrutura de Diretórios do Ansible


A seguir está a estrutura de diretórios com a qual estaremos trabalhando ao longo deste tutorial.

.
├── LICENSE                        # license file
├── README.md                      # main documentation file
└── ansible                        # top-level folder
    ├── ansible.cfg                # config file
    ├── create-k8s.yml             # playbook to provision env
    ├── deploy-app-k8s.yml         # playbook to deploy Nginx 
    ├── destroy-k8s.yml            # playbook to destroy env
    ├── undeploy-app-k8s.yml       # playbook to remove Nginx
    ├── inventory             
    │   └── gcp.yml                # inventory file
    └── roles
        ├── destroy_k8s            # role to remove k8s cluster        
        │   └── tasks
        │       └── main.yml
        ├── destroy_k8s_deployment # role to remove Nginx 
        │       └── tasks
        │           └── main.yml
        ├── destroy_network        # role to remove VPC
        │   └── tasks
        │       └── main.yml
        ├── k8s                    # role to create k8s cluster
        │   └── tasks
        │       └── main.yml
        ├── k8s-deployment         # role to deploy Nginx
        │   ├── tasks
        │   │   └── main.yml
        │   └── vars
        │       └── main.yml
        └── network                # role to create VPC
            └── tasks
                └── main.yml

Inventário do Ansible

No arquivo de inventário⁶ do Ansible adicione a variável namespace.

...
# use the section below to enter k8s namespaces to manage
# this namespace is used in the Deploying an Application section
namespace: nginx

Ansible Roles


Crie uma nova função Ansible role⁷ em ansible/roles/k8s-deployment com o seguinte arquivo main.yml sob tasks. Esta função será responsável por criar o namespace e implantar o Pod com o Nginx.

---
- name: Create a k8s namespace  
  kubernetes.core.k8s:    
    state: present    
    definition:      
      apiVersion: v1      
      kind: Namespace      
      metadata:        
        name: "{{ namespace }}"
        
- name: Create k8s pod for nginx  
  kubernetes.core.k8s:    
    state: present    
    definition:      
      apiVersion: v1      
      kind: Pod      
      metadata:        
        name: "{{ app }}"        
        namespace: "{{ namespace }}"        
        labels:          
          app: "{{ app }}"      
      spec:        
        containers:          
          - name: "{{ app }}"            
            image: "{{ image }}"            
            imagePullPolicy: Always    

Você pode agrupar várias ações na mesma task. No arquivo de tarefas acima, ele primeiro criará o namespace e, em seguida, criará o Pod.


Observe que o plugin kubernetes.core.k8s usa a configuração yaml padrão de objeto Kubernetes para criar os recursos.


Ao investigar a estrutura do diretório de funções, notamos que existe uma pasta vars. Definimos variáveis nas roles para garantir que um valor seja usado nessa role e não seja substituído por variáveis de inventário.


Consulte a documentação do Ansible sobre o uso de variáveis para obter mais detalhes.


Crie um arquivo main.yml na pasta vars para definir as variáveis do Nginx. Estamos usando esses valores para substituir as variáveis {{ app }} e {{ image }}.

---
app: nginx
image: nginx:1.19.9-alpine

Ansible Playbook


O último passo é criar um Ansible playbook⁸ para executar a role k8s-deployment. Na pasta ansible, criei um arquivo chamado deploy-app-k8s.yml:

---
- name: deploy application
  hosts: localhost  
  gather_facts: false  
  environment:    
    GOOGLE_CREDENTIALS: "{{ credentials_file }}"
  
  roles:    
    - k8s-deployment    

Lançando uma aplicaçāo


Execute o seguinte comando para lançar o Nginx:

ansible-playbook ansible/deploy-app-k8s.yml -i ansible/inventory/<your-inventory-filename>

Saída:

PLAY [deploy application] *****************************************************************

TASK [k8s-deployment : Create a k8s namespace] ******************
changed: [localhost]

TASK [k8s-deployment : Create a k8s service to expose nginx] ****
changed: [localhost]

PLAY RECAP *******************************************************
localhost: ok=2  changed=2  unreachable=0  failed=0  skipped=0  rescued=0  ignored=0

Acessando o Nginx

Execute os seguintes comandos e acesse o Nginx using estar URL.

export POD_NAME=$(kubectl get pods --namespace nginx -l "app=nginx" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace nginx port-forward $POD_NAME 8080:80

Removendo as configurações


Para remover todos os recursos criados neste tutorial, tudo o que precisamos é uma role que remove o namespace criado inicialmente.


A role ansible/roles/destroy_k8s_deployment possui essa configuração.

---
- name: Destroy a k8s namespace
  kubernetes.core.k8s:
    name: "{{ namespace }}"
    api_version: v1
    kind: Namespace
    state: absent

Execute o seguinte comando para remover os recursos do Nginx, mantendo o cluster Kubernetes:

ansible-playbook ansible/undeploy-app-k8s.yml -i ansible/inventory/<your-inventory-filename>

Saída:

PLAY [undeploy application] **************************************

TASK [destroy_k8s_deployment : Destroy a k8s namespace] *********
changed: [localhost]

PLAY RECAP *****************************************************************
localhost: ok=1  changed=1  unreachable=0  failed=0  skipped=0  rescued=0  ignored=0

Conclusāo

Este tutorial demonstrou como usar a Infraestrutura como Código para implantar um servidor web Nginx em um cluster Kubernetes na plataforma Google Cloud. Com o plugin kubernetes.core.k8s fornecido pelo Ansible, é possível gerenciar objetos do Kubernetes, como namespaces e Pods, usando a configuração yaml padrão de objetos do Kubernetes.


Muito mais é possível com o Ansible. Use este tutorial como o primeiro passo para gerenciar seus objetos do Kubernetes como código. Acesse a página de documentação do Ansible para obter mais informações e expandir seu conhecimento e uso do Ansible.

Referências


2 visualizações0 comentário

Comments


bottom of page