K8s em Exemplos: Visão Geral

Kubernetes orquestra containers em um cluster de máquinas. Este guia mostra como os componentes principais se encaixam: Cluster, Nodes, Pods, Deployments e Services.

cluster-overview.txt

Um Cluster é um conjunto de máquinas (nodes) executando Kubernetes. O Control Plane gerencia o cluster, os worker nodes executam suas aplicações.

+-----------------------------------------------------------+
|                         CLUSTER                           |
|                                                           |
|  +---------------+      +---------------------------+     |
|  | Control Plane |      |       Worker Nodes        |     |
|  |               |      |                           |     |
|  |  - API Server |----->|  +--------+   +--------+  |     |
|  |  - Scheduler  |      |  | Node 1 |   | Node 2 |  |     |
|  |  - etcd       |      |  | (Pods) |   | (Pods) |  |     |
|  |               |      |  +--------+   +--------+  |     |
|  +---------------+      +---------------------------+     |
|                                                           |
+-----------------------------------------------------------+
node.txt

Um Node é uma máquina (física ou virtual) no cluster. Cada node executa kubelet (agente), kube-proxy (rede) e um container runtime. Nodes hospedam Pods.

+-----------------------------------------+
|                  NODE                   |
|                                         |
|  +-----------------------------------+  |
|  | kubelet          (fala com API)   |  |
|  | kube-proxy       (rede)           |  |
|  | container runtime (executa pods)  |  |
|  +-----------------------------------+  |
|                                         |
|  +---------+ +---------+ +---------+    |
|  |  Pod A  | |  Pod B  | |  Pod C  |    |
|  +---------+ +---------+ +---------+    |
|                                         |
+-----------------------------------------+
pod.txt

Um Pod é a menor unidade implantável. Ele envolve um ou mais containers que compartilham rede (mesmo IP) e armazenamento. Containers em um Pod comunicam via localhost.

+---------------------------------------+
|                 POD                   |
|            IP: 10.244.1.5             |
|                                       |
|  +-------------+   +-------------+    |
|  |  Container  |   |  Container  |    |
|  |    nginx    |   |   sidecar   |    |
|  |     :80     |   |    :9090    |    |
|  +-------------+   +-------------+    |
|         ^                 ^           |
|         +--- localhost ---+           |
|                                       |
|  +----------------------------------+ |
|  |      Volume Compartilhado        | |
|  +----------------------------------+ |
+---------------------------------------+
deployment-replicaset-pod.txt

Deployment gerencia ReplicaSets, que garantem N cópias de um Pod em execução. Você define o estado desejado, Kubernetes mantém. Deployments lidam com rolling updates.

+-----------------------------------------------+
|                  DEPLOYMENT                   |
|                  replicas: 3                  |
|                                               |
|  +-----------------------------------------+  |
|  |               REPLICASET                |  |
|  |                                         |  |
|  |  +---------+ +---------+ +---------+    |  |
|  |  |   Pod   | |   Pod   | |   Pod   |    |  |
|  |  |  nginx  | |  nginx  | |  nginx  |    |  |
|  |  +---------+ +---------+ +---------+    |  |
|  |                                         |  |
|  +-----------------------------------------+  |
|                                               |
+-----------------------------------------------+
service.txt

Um Service fornece IP estável e nome DNS para acessar Pods. Pods são efêmeros (vêm e vão), mas Services dão um endpoint fixo. Balanceia carga entre Pods correspondentes.

                +-----------------+
                |     SERVICE     |
 requests ----->|  nginx-service  |
                |   10.96.0.100   |
                +--------+--------+
                         |
         +---------------+---------------+
         |               |               |
         v               v               v
   +------------+   +------------+   +------------+
   |     Pod    |   |     Pod    |   |     Pod    |
   |    nginx   |   |    nginx   |   |    nginx   |
   | 10.244.1.5 |   | 10.244.2.3 |   | 10.244.3.7 |
   +------------+   +------------+   +------------+
namespace.txt

Namespaces dividem um cluster em clusters virtuais. Use para separar times, ambientes (dev/prod) ou projetos. Recursos em namespaces diferentes são isolados por padrão.

+-------------------------------------------------+
|                    CLUSTER                      |
|                                                 |
|  +---------------+     +---------------+        |
|  |  namespace:   |     |  namespace:   |        |
|  |     dev       |     |     prod      |        |
|  |               |     |               |        |
|  | +-----------+ |     | +-----------+ | mesmos |
|  | | nginx-svc | |     | | nginx-svc | | nomes  |
|  | | nginx-pod | |     | | nginx-pod | |        |
|  | +-----------+ |     | +-----------+ |        |
|  |               |     |               |        |
|  +---------------+     +---------------+        |
|                                                 |
+-------------------------------------------------+
labels-selectors.txt

Labels são tags chave-valor em recursos. Selectors encontram recursos por labels. É assim que Services encontram Pods, e como você organiza recursos.

    Service selector: app=nginx
                      |
        +-------------+-------------+
        |             |             |
        v             v             v
  +-----------+ +-----------+ +-----------+
  |    Pod    | |    Pod    | |    Pod    |
  | app=nginx | | app=nginx | | app=redis |
  +-----------+ +-----------+ +-----------+
       [x]           [x]       [ ] não selecionado
configmap-secret.txt

ConfigMap armazena configuração (env vars, arquivos de config). Secret armazena dados sensíveis (senhas, tokens). Ambos injetam dados em Pods sem hardcode.

+----------------+     +----------------+
|   ConfigMap    |     |     Secret     |
|                |     |                |
| DB_HOST=mysql  |     | DB_PASS=****   |
| LOG_LEVEL=info |     | API_KEY=****   |
+-------+--------+     +-------+--------+
        |                      |
        +----------+-----------+
                   |
                   v
            +-------------+
            |     Pod     |
            |             |
            | DB_HOST     | <- ConfigMap
            | DB_PASS     | <- Secret
            +-------------+
full-picture.txt

Juntando tudo: Deployments gerenciam Pods, Services os expõem, ConfigMaps/Secrets os configuram, tudo organizado em Namespaces.

+---------------- namespace: production ----------------+
|                                                       |
|  +-------------+    +---------------------------+     |
|  |  ConfigMap  |    |        Deployment         |     |
|  |  Secret     |--->|  +-----+ +-----+ +-----+  |     |
|  +-------------+    |  | Pod | | Pod | | Pod |  |     |
|                     |  +-----+ +-----+ +-----+  |     |
|                     +-------------+-------------+     |
|                                   |                   |
|                          +--------+--------+          |
|                          |     Service     |          |
|     users -------------->|   (ClusterIP)   |          |
|                          +-----------------+          |
|                                                       |
+-------------------------------------------------------+
terminal

Veja todos os recursos principais no namespace atual. Isso mostra Pods, Services, Deployments e ReplicaSets de uma só vez.

$ kubectl get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-6799fc88d8-7xj2k   1/1     Running   0          5m
pod/nginx-6799fc88d8-9abc2   1/1     Running   0          5m
pod/nginx-6799fc88d8-def34   1/1     Running   0          5m

NAME                 TYPE        CLUSTER-IP     PORT(S)   AGE
service/nginx        ClusterIP   10.96.100.50   80/TCP    5m

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   3/3     3            3           5m

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-6799fc88d8   3         3         3       5m

Índice | GitHub | Use as setas do teclado para navegar |