GitHub EN PT

K8s em Exemplos: Hello World

Vamos fazer deploy de um servidor web e acessá-lo. Este é o equivalente do “Hello World” no Kubernetes - criar um Deployment, expor com um Service e fazer uma requisição.

hello.yaml

Um Deployment gerencia réplicas da sua aplicação. Ele garante que o número desejado de pods esteja sempre rodando.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello

Rode 2 réplicas. O selector deve corresponder aos labels do template do pod - é assim que o Deployment sabe quais pods ele gerencia.

spec:
  replicas: 2
  selector:
    matchLabels:
      app: hello

O template define os pods. Cada pod roda um container nginx que serve uma página de boas-vindas na porta 80.

  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
        - name: web
          image: nginx:alpine
          ports:
            - containerPort: 80

Um Service fornece um endpoint estável para acessar os pods. ClusterIP é o tipo padrão - acessível apenas dentro do cluster.

---
apiVersion: v1
kind: Service
metadata:
  name: hello

O selector roteia tráfego para pods com labels correspondentes. A porta 80 no Service encaminha para a porta 80 nos pods.

spec:
  selector:
    app: hello
  ports:
    - port: 80
      targetPort: 80
terminal

Aplique o manifesto. O Kubernetes cria o Deployment, que cria um ReplicaSet, que cria os pods.

$ kubectl apply -f hello.yaml
deployment.apps/hello created
service/hello created
terminal

Verifique se os pods estão rodando. O sufixo aleatório no nome vem do ReplicaSet.

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
hello-5d7b9d8c7f-k2x9m   1/1     Running   0          10s
hello-5d7b9d8c7f-p8z4n   1/1     Running   0          10s
terminal

O Service recebe um IP de cluster. Este IP é estável - pods podem ir e vir, mas o IP do Service permanece o mesmo.

$ kubectl get svc hello
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
hello   ClusterIP   10.96.45.123   <none>        80/TCP    15s
terminal

Teste o Service de dentro do cluster. Criamos um pod temporário com curl e acessamos o Service pelo nome. O DNS resolve hello para o IP do Service.

$ kubectl run curl --image=curlimages/curl --rm -it -- curl -s hello
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
terminal

Para acessar da sua máquina, use port-forward. Isso cria um túnel de localhost:8080 para o Service. Abra http://localhost:8080 no seu navegador.

$ kubectl port-forward svc/hello 8080:80
Forwarding from 127.0.0.1:8080 -> 80

# Em outro terminal:
$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
terminal

Limpe deletando tudo que foi definido no manifesto.

$ kubectl delete -f hello.yaml
deployment.apps "hello" deleted
service "hello" deleted

Índice | Use as setas do teclado para navegar