Google Cloud/Kubernetes/Zabbix

O Kubernetes é um sistema de código aberto que foi desenvolvido pelo Google para gerenciamento da suas aplicações em containers através de múltiplos hosts em um cluster. Ele tem como principal objetivo facilitar a implantação dos aplicativos baseados em microserviços. Foi pela experiência do Google e de muitos anos de trabalho com containers que hoje o projeto Kubernetes se tornou o segundo maior projeto open-source do mundo (Atrás somente do Kernel), e certamente dominara a orquestração de contêineres. Com a chegada da API do Kubernetes nos principais providers de Cloud no mercado resolvi fazer este lab e brincar um pouco com esta ferramenta afim de me aprofundar e conhecer mais sobre seus conceitos, sua arquitetura e seus comandos de gerenciamento utilizando o “kubectl”.

Para este tutorial vamos utilizar o Google Cloud como provider e imagens de container do Zabbix 3.4.

HAND’s ON!

Primeiro vamos autenticar no GCP:

tadeu@lwayslearning ~ $ gcloud init
tadeu@lwayslearning ~ $ gcloud auth login 

Para gerenciarmos o cluster Kubernetes utizaremos o utilitário “kubectl”.

tadeu@lwayslearning ~ $ sudo dnf install kubectl.x86_64 -y 

Vamos criar um projeto para o kubernetes:

tadeu@lwayslearning ~ $ gcloud projects create kubernetes
tadeu@lwayslearning ~ $ gcloud projects list 
PROJECT_ID            NAME              PROJECT_NUMBER
eminent-cache-186621  My First Project  1094254645677
kubernetes-198603     kubernetes        786667763061

Setamos o projeto:

tadeu@lwayslearning ~ $ gcloud config set project kubernetes-786667763061 
Updated property [core/project].

Vamos adicionar uma política para o meu usuário:

tadeu@lwayslearning ~ $ gcloud projects add-iam-policy-binding kubernetes-198603 --member=user:xxxxxxxxxx@gmail.com --role='roles/compute.instanceAdmin.v1'
bindings:
- members:
  - user:xxxxxxxxx@gmail.com
  role: roles/compute.instanceAdmin.v1
- members:
  - user:xxxxxxxxx@gmail.com
  role: roles/owner
etag: BwVn2Be6YuU=
version: 1

Setamos a Região e a Zona para as nossas instâncias:

tadeu@lwayslearning ~ $ gcloud config set compute/region southamerica-east1
Updated property [compute/region].
tadeu@lwayslearning ~ $ gcloud config set compute/zone southamerica-east1-a
Updated property [compute/zone].

Para essa nova versão do Kubernetes no GCP é necessário setar a seguinte diretiva:

tadeu@lwayslearning ~ $ gcloud config set container/new_scopes_behavior true 
Updated property [container/new_scopes_behavior].

Nossa conf ficou assim:

tadeu@lwayslearning ~ $ gcloud config list
[compute]
region = southamerica-east1
zone = southamerica-east1-a
[container]
new_scopes_behavior = true
[core]
account = xxxxxxxxxx@gmail.com
disable_usage_reporting = True
project = kubernetes-198603

Your active configuration is: [kube-teste]

Criamos um cluster:

tadeu@lwayslearning ~ $ gcloud container clusters create zbxcluster  
ERROR: (gcloud.container.clusters.create) ResponseError: code=403, message=The Kubernetes Engine API is not enabled for project kubernetes-198603. Please ensure it is enabled in the Google Cloud Console at https://console.cloud.google.com/apis/api/container.googleapis.com/overview?project=kubernetes-198603 and try again.

Opaaa – Faammm, Precisamos habilitar no console do GCP que iremos utilizar a API dos containers seguimos o link e ativamos.

Agora sim!!!

tadeu@lwayslearning ~ $ gcloud container clusters create zbxcluster  
Creating cluster zbxcluster...done.                                                                                                                  
Created [https://container.googleapis.com/v1/projects/kubernetes-198603/zones/southamerica-east1-a/clusters/zbxcluster].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/southamerica-east1-a/zbxcluster?project=kubernetes-198603
kubeconfig entry generated for zbxcluster.
NAME        LOCATION              MASTER_VERSION  MASTER_IP     MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
zbxcluster  southamerica-east1-a  1.8.8-gke.0     35.199.95.91  n1-standard-1  1.8.8-gke.0   3          RUNNING

Obs: Ao ativar no console do Google Cloud para utilizar a API do Kubernetes é criado uma conta de serviço:

tadeu@lwayslearning ~ $ gcloud iam service-accounts list 
NAME                                    EMAIL
Compute Engine default service account  786667763061-compute@developer.gserviceaccount.com

Já podemos utilizar o kubectl para verificar nossos workers:

tadeu@lwayslearning ~ $ kubectl get no 
NAME                                        STATUS    ROLES     AGE       VERSION
gke-zbxcluster-default-pool-213015ab-lggc   Ready         1m        v1.8.8-gke.0
gke-zbxcluster-default-pool-213015ab-xj9b   Ready         1m        v1.8.8-gke.0
gke-zbxcluster-default-pool-213015ab-xznx   Ready         1m        v1.8.8-gke.0

Para informações sobre o cluster:

tadeu@lwayslearning ~ $ kubectl cluster-info 

Agora vamos fazer o deploy dos nossos containers utilizando o seguinte arquivo: https://gist.github.com/tbernacchi/626a4ded652e2dca4666bc3f2a8b216c

tadeu@lwayslearning Kubernetes $ kubectl create -f zabbix-all-in-one-bare-metal.yaml 
service "zabbix-web" created
service "zabbix-db" created
service "zabbix-server" created
replicationcontroller "zabbix-web" created
replicationcontroller "zabbix-db" created
replicationcontroller "zabbix-server" created

Podemos verificar nossos serviços:

tadeu@lwayslearning Kubernetes $ kubectl get svc 
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)               AGE
kubernetes      ClusterIP      10.63.240.1                     443/TCP               2d
zabbix-db       ClusterIP      10.63.241.119                   3306/TCP              30s
zabbix-server   ClusterIP      10.63.240.118                   10051/TCP,10052/TCP   30s
zabbix-web      ClusterIP      10.63.244.232                   80/TCP                30s

E nossos POD’s:

tadeu@lwayslearning Kubernetes $ kubectl get po -a 
NAME                  READY     STATUS    RESTARTS   AGE
zabbix-db-562m4       1/1       Running   0          52s
zabbix-server-hkbzb   1/1       Running   0          52s
zabbix-web-57vrq      1/1       Running   0          52s
zabbix-web-8rlb7      1/1       Running   0          52s
zabbix-web-vtmpc      1/1       Running   0          52s

E os RC (Replication Controller):

tadeu@lwayslearning Kubernetes $ kubectl get rc -a 
NAME            DESIRED   CURRENT   READY     AGE
zabbix-db       1         1         1         2m
zabbix-server   1         1         1         2m
zabbix-web      3         3         3         2m

One last step – Vamos criar um Balanceador de Carga para esse cluster:

tadeu@lwayslearning Kubernetes $ kubectl expose service zabbix-web --type=LoadBalancer --name=zabbix

Esperamos alguns segundos até se propagar e Voilá:

tadeu@lwayslearning Kubernetes $ kubectl get svc 
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)               AGE
kubernetes      ClusterIP      10.63.240.1                     443/TCP               2d
zabbix          LoadBalancer   10.63.248.146   35.199.92.199   80:30646/TCP          6m
zabbix-db       ClusterIP      10.63.241.119                   3306/TCP              10m
zabbix-server   ClusterIP      10.63.240.118                   10051/TCP,10052/TCP   10m
zabbix-web      ClusterIP      10.63.244.232                   80/TCP                10m

Agora no nosso Browser acessamos nossa App com o seguinte endereço: 35.199.92.199 – Usuário: admin e senha: zabbix

And we’re done!

CONCLUSÃO
Como ainda estou me aventurando neste mundo novo dos containers achei a ferramenta Kubernetes mais complexa de se configurar e de entender os seus componentes em relação ao Docker Swarm, porém após este lab o Kubernetes (Primeira vez que me aventuro com ele) me pareceu ser bem robusto e confiável, e sua gerência não parece ser tão difícil assim como se imagina. Para um primeiro contato achei bem produtivo e me gerou algumas dúvidas e etc, mas ao longo dos meus estudos vou tentar colocar mais serviços no ar com Kubernetes para me familiarizar com esta tecnologia.

Referências:
https://www.mundodocker.com.br/kubernetes-parte-i/
https://kubernetes.io/docs/reference/kubectl/docker-cli-to-kubectl/
https://www.youtube.com/watch?v=1ENtPSKjD2I&t=220s
https://kubernetes.io/
https://github.com/monitoringartist/kubernetes-zabbix

Google Cloud/Kubernetes/Zabbix