Infraestrutura como Código com Ansible para automatizar implantação do Nginx no Kubernetes do Google (GKE) na platform Google Cloud (GCP).
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.
Comentarios