Deploy de aplicação hello world no Kubernetes GKE

Esse tutorial é para deploy de uma aplicação simple no Google Kubernetes Engine.

Mas para começar, você precisa de:

  • gcloud linha de comando instalada e configurada
  • kubectl linha de comando instalada

É melhor se você já souber os básico de Docker. Eu criei uma imagem rafaelhdr/server-hello para isso. Essa imagem apenas responde Hello, World! para GET /.

Crie o cluster

gcloud container clusters create hello-cluster

Esse comando irá criar seu cluster kubernetes. Depois de um tempo irá aparecer:

...
NAME           LOCATION       MASTER_VERSION  MASTER_IP       MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
hello-cluster  us-central1-a  1.8.10-gke.0    35.226.200.163  n1-standard-1  1.8.10-gke.0  3          RUNNING

Deploy da aplicação

Nós temos nosso cluster mas nenhuma aplicação rodando. Veja com os comandos abaixo.

$ kubectl get deployment
No resources found.

$ kubectl get pods
No resources found.

Então vamos colocar nossa aplicação. Crie o arquivo de configuração sh-service-lb.yaml:

Se quiser usar sua própria aplicação, mude image e cointanerPort.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: sh-deployment
  labels:
    app: sh-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: sh-deployment
    spec:
      containers:
        - name: sh-deployment
          image: rafaelhdr/server-hello
          ports:
            - containerPort: 5000

Para deploy em nosso cluster, rode:

$ kubectl apply -f sh-deployment.yaml 
deployment.extensions "sh-deployment" created

Fizémos o deploy de nossa aplicação. Você pode checar rodando:

$ kubectl get deployment
NAME            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
sh-deployment   2         2         2            2           39s

$ kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
sh-deployment-6db6b8856d-q9j95   1/1       Running   0          53s
sh-deployment-6db6b8856d-tgmmh   1/1       Running   0          53s

O que fizémos? - Criamos duas replicas de nossa aplicação em nosso cluster (replicas: 2). É por isso que temos 2 pods e um deployment.

O que é um Pod? É a menos unidade que colocamos no Kubernetes. Nós poderíamos ter dois containers rodando juntos, de forma que compartilhariam o mesmo volume.

O problema é que ele ainda não está exposto. Vamos criar o Load Balancer.

Serviço Load Balancer

Nós vamos seguir os mesmos passos (criar arquivo de configuração e apply usando kubectl). Crie o arquivo sh-service-lb.yaml.

apiVersion: v1
kind: Service
metadata:
  name: sh-service
  labels:
    app: sh-service
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 5000
  selector:
    app: sh-deployment

Agora nós rodamos o mesmo comando para esse arquivo:

$ kubectl apply -f sh-service-lb.yaml
service "sh-service" created

O que fizémos? Criamos nosso Load Balancer redirecionando requests de acesso externo (porta 80) para nosso container (porta 5000).

Certo. Nosso serviço foi criado, mas precisa de um tempo para iniciar. Espere o EXTERNAL-IP mudar de PENDING para um valor real:

$ kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.15.240.1     <none>        443/TCP        25m
sh-service   LoadBalancer   10.15.241.155   <pending>     80:30138/TCP   1s

# Wait some time

$ kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.15.240.1     <none>          443/TCP        27m
sh-service   LoadBalancer   10.15.241.155   35.192.86.102   80:30138/TCP   1m

Meu IP externo é 35.192.86.102. Pegue o seu IP externo e acesse de seu navegador (http://YOUR_EXTERNAL_IP/).

Acessando a interface web

Pegue o token de acesso rodando kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | awk '/^deployment-controller-token-/{print $1}') | awk '$1=="token:"{print $2}'.

Acesse a interface localmente por um proxy rodando kubectl config view e abrindo http://127.0.0.1:8001/ui/. Para Sign In, use o token obtido anteriormente.

Apague tudo

Certo, fizémos nossos testes. Podemos remover tudo apagando nosso cluster.

$ gcloud container clusters delete hello-cluster
The following clusters will be deleted.
 - [hello-cluster] in [us-central1-a]

Do you want to continue (Y/n)?  Y

...

Resumo

Nesse tutorial, criamos um cluster, colocamos nossa aplicação e um load balancer nele, acessamos a interface web e então deletamos esse cluster.

Esse é apenas o começo para o Kubernetes, mas fizémos apenas o básico. Tentarei fazer mais posts sobre Kubernetes. Enquanto isso, você poderia ver Learn Kubernetes in Under 3 Hours: A Detailed Guide to Orchestrating Containers. É um tutorial mais completo que esse, aprendendo os conceitos que testamos aqui mais profundamente, mas em um cluster local.

Referências: