|
| 1 | +--- |
| 2 | +title: Criando Pods Estáticos |
| 3 | +weight: 170 |
| 4 | +content_type: task |
| 5 | +reviewers: |
| 6 | +- jsafrane |
| 7 | +--- |
| 8 | + |
| 9 | +<!-- overview --> |
| 10 | + |
| 11 | + |
| 12 | +*Pods Estáticos* são gerenciados diretamente pelo `daemon` kubelet em um nó específico, |
| 13 | +sem o {{< glossary_tooltip text="servidor de API" term_id="kube-apiserver" >}} |
| 14 | +observando-os. |
| 15 | +Ao contrário dos pods que são gerenciados pelo `Control Plane` (por exemplo, uma |
| 16 | +{{< glossary_tooltip text="Implantação" term_id="deployment" >}}); |
| 17 | +em vez disso, o kubelet observa cada Pod estático |
| 18 | +(e reinicia-os se falharem). |
| 19 | + |
| 20 | +Pods estáticos estão sempre ligados a um {{< glossary_tooltip term_id="kubelet" >}} em um nó específico. |
| 21 | + |
| 22 | +O Kubelet tenta automaticamente criar um {{< glossary_tooltip text="mirror Pod" term_id="mirror-pod" >}} |
| 23 | +no servidor de API do Kubernetes para cada Pod estático. |
| 24 | +Isso significa que os pods em execução em um nó são visíveis no servidor de API, |
| 25 | +mas não podem ser controlados a partir daí. |
| 26 | +Aos nomes de Pods será sufixados com o nome de host do nó, com um hífem a esquerda. |
| 27 | + |
| 28 | + |
| 29 | +{{< note >}} |
| 30 | +Se você está executando um cluster Kubernetes, usando Pods estáticos para executar um Pod em cada Nó, |
| 31 | +provávelmente você deveria estar usando um {{< glossary_tooltip text="DaemonSet" term_id="daemonset" >}} em substituição. |
| 32 | +{{< /note >}} |
| 33 | + |
| 34 | +{{< note >}} |
| 35 | +A `especificação` de um Pod estático não pode referir-se à outros objetos da API |
| 36 | +(ex., {{< glossary_tooltip text="ServiceAccount" term_id="service-account" >}}, |
| 37 | +{{< glossary_tooltip text="ConfigMap" term_id="configmap" >}}, |
| 38 | +{{< glossary_tooltip text="Secret" term_id="secret" >}}, etc). |
| 39 | +{{< /note >}} |
| 40 | + |
| 41 | +## {{% heading "prerequisites" %}} |
| 42 | + |
| 43 | +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} |
| 44 | + |
| 45 | +Esta página assume que você está usando um {{< glossary_tooltip term_id="cri-o" >}} para executar os Pods, |
| 46 | +e que seus nós estão executando o sistema operacional Fedora. |
| 47 | +Instruções para outras distribuições, ou instalações de Kubernetes, podem variar. |
| 48 | + |
| 49 | +<!-- steps --> |
| 50 | + |
| 51 | +## Crie um pod estático {#static-pod-creation} |
| 52 | + |
| 53 | +Você pode configurar um Pod estático com um [arquivo de configuração hospedado no sistema de arquivos](/docs/tasks/configure-pod-container/static-pod/#configuration-files) ou um [arquivo de configuração hospedado na Web](/docs/tasks/configure-pod-container/static-pod/#pods-created-via-http). |
| 54 | + |
| 55 | +### Manifesto do Pod estático hospedado no sistema de arquivos {#configuration-files} |
| 56 | + |
| 57 | +Os manifestos, são definições de Pod padrão em formato JSON ou YAML em um diretório específico. Use o campo `staticPodPath: <diretório>` no |
| 58 | +[arquivo de configuração do kubelet](/docs/reference/config-api/kubelet-config.v1beta1/), |
| 59 | +que periodicamente varre o diretório e cria/exclui Pods estáticos conforme os arquivos YAML/JSON aparecem/desaparecem. |
| 60 | +Observe que o Kubelet ignorará os arquivos começando com pontos ao varrer o diretório especificado. |
| 61 | + |
| 62 | +Por exemplo, como iniciar um servidor Web simples como um Pod estático |
| 63 | + |
| 64 | +1. Escolha um nó onde você deseja executar um Pod estático. Neste exemplo, é `my-node1`. |
| 65 | + |
| 66 | + ```shell |
| 67 | + ssh my-node1 |
| 68 | + ``` |
| 69 | + |
| 70 | +2. Escolha um diretório, digamos `/etc/kubernetes/manifests` e coloque uma definição de pod para um servidor web lá, por exemplo `/etc/kubernetes/manifests/static-web.yaml`: |
| 71 | + |
| 72 | + ```shell |
| 73 | + # Execute este comando no nó onde o Kubelet está funcionando |
| 74 | + mkdir -p /etc/kubernetes/manifests/ |
| 75 | + cat <<EOF >/etc/kubernetes/manifests/static-web.yaml |
| 76 | + apiVersion: v1 |
| 77 | + kind: Pod |
| 78 | + metadata: |
| 79 | + name: static-web |
| 80 | + labels: |
| 81 | + role: myrole |
| 82 | + spec: |
| 83 | + containers: |
| 84 | + - name: web |
| 85 | + image: nginx |
| 86 | + ports: |
| 87 | + - name: web |
| 88 | + containerPort: 80 |
| 89 | + protocol: TCP |
| 90 | + EOF |
| 91 | + ``` |
| 92 | +
|
| 93 | +3. Configure seu kubelet no nó para usar este diretório executando-o com o argumento `--pod-manifest-path=/etc/kubernetes/manifests/`. No Fedora, edite o arquivo `/etc/kubernetes/kubelet` para incluir esta linha: |
| 94 | +
|
| 95 | + ``` |
| 96 | + KUBELET_ARGS="--cluster-dns=10.254.0.10 --cluster-domain=kube.local --pod-manifest-path=/etc/kubernetes/manifests/" |
| 97 | + ``` |
| 98 | + ou adicione o campo `staticPodPath: <o diretótio>` no |
| 99 | + [arquivo de configuração do kubelet](/docs/reference/config-api/kubelet-config.v1beta1/). |
| 100 | +
|
| 101 | +4. Reinicie o kubelet. No Fedora, você poderia executar: |
| 102 | +
|
| 103 | + ```shell |
| 104 | + # Execute este comando no nó onde o kubelet está funcionando |
| 105 | + systemctl restart kubelet |
| 106 | + ``` |
| 107 | +
|
| 108 | +### Manifesto do Pod estático hospedado na Web {#pods-created-via-http} |
| 109 | +
|
| 110 | +O Kubelet baixa periodicamente um arquivo especificado pelo argumento `--manifest-url=<URL>` |
| 111 | +e interpreta-o como um arquivo JSON/YAML que contém as definições do Pod. |
| 112 | +Similar ao que [manifestos hospedados no sistema de arquivos](#configuration-files) fazem, o kubelet |
| 113 | +reexamina o manifesto em um agendamento. Se houver alterações na lista de Pods estáticos, o kubelet aplica-os. |
| 114 | +
|
| 115 | +Para usar esta abordagem: |
| 116 | +
|
| 117 | +1. Crie um arquivo YAML e armazene-o em um servidor da Web, para que você possa passar o URL desse arquivo para o Kubelet. |
| 118 | +
|
| 119 | + ```yaml |
| 120 | + apiVersion: v1 |
| 121 | + kind: Pod |
| 122 | + metadata: |
| 123 | + name: static-web |
| 124 | + labels: |
| 125 | + role: myrole |
| 126 | + spec: |
| 127 | + containers: |
| 128 | + - name: web |
| 129 | + image: nginx |
| 130 | + ports: |
| 131 | + - name: web |
| 132 | + containerPort: 80 |
| 133 | + protocol: TCP |
| 134 | + ``` |
| 135 | +
|
| 136 | +2. Configure o kubelet no seu nó selecionado para usar este manifesto da Web, executando-o com `--manifest-url=<manifest-url>`. No Fedora, edite `/etc/kubernetes/kubelet` para incluir esta linha: |
| 137 | +
|
| 138 | + ``` |
| 139 | + KUBELET_ARGS="--cluster-dns=10.254.0.10 --cluster-domain=kube.local --manifest-url=<manifest-url>" |
| 140 | + ``` |
| 141 | +
|
| 142 | +3. Reinicie o Kubelet. No Fedora, você usaria: |
| 143 | +
|
| 144 | + ```shell |
| 145 | + # Execute este comando no nó onde o kubelet está funcionando |
| 146 | + systemctl restart kubelet |
| 147 | + ``` |
| 148 | +
|
| 149 | +## Observe o comportamento do Pod estático {#behavior-of-static-pods} |
| 150 | +
|
| 151 | +Quando o kubelet começa, inicia automaticamente todos os pods estáticos definidos. |
| 152 | +Como você definiu um Pod estático e reiniciou o kubelet, o novo pod estático deveria |
| 153 | +já estar em execução. |
| 154 | +
|
| 155 | +Você pode ver os Contêineres em execução (incluindo os Pods estáticos) ao executar (no Nó): |
| 156 | +
|
| 157 | +```shell |
| 158 | +# Execute este comando no nó onde o kubelet está funcionando |
| 159 | +crictl ps |
| 160 | +``` |
| 161 | +
|
| 162 | +A saída pode ser algo como: |
| 163 | +
|
| 164 | +```console |
| 165 | +CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID |
| 166 | +129fd7d382018 docker.io/library/nginx@sha256:... 11 minutes ago Running web 0 34533c6729106 |
| 167 | +``` |
| 168 | +
|
| 169 | +{{< note >}} |
| 170 | +`crictl` mostra a URI da imagem e o checksum SHA-256. O `NAME` vai parecer mais como: |
| 171 | +`docker.io/library/nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31`. |
| 172 | +{{< /note >}} |
| 173 | +
|
| 174 | +Você pode ver o Pod espelho no servidor de API: |
| 175 | +
|
| 176 | +```shell |
| 177 | +kubectl get pods |
| 178 | +``` |
| 179 | +``` |
| 180 | +NAME READY STATUS RESTARTS AGE |
| 181 | +static-web 1/1 Running 0 2m |
| 182 | +``` |
| 183 | +
|
| 184 | +{{< note >}} |
| 185 | +Verifique se o Kubelet tem permissão para criar o Pod espelho no servidor de API. Caso contrário, a solicitação de criação é rejeitada pelo servidor de API. Veja [Admissão de segurança do pod](/docs/concepts/security/pod-security-admission) e [Políticas de Segurança de Pod](/docs/concepts/security/pod-security-policy/). |
| 186 | +{{< /note >}} |
| 187 | +
|
| 188 | +Os {{< glossary_tooltip term_id="label" text="Rótulos" >}} dos pods estáticos são |
| 189 | +propagados no Pod espelho. Você pode usar esses rótulos como |
| 190 | +{{< glossary_tooltip term_id="selector" text="seletores" >}} via normal, etc. |
| 191 | +
|
| 192 | +Se você tentar usar o `kubectl` para excluir o Pod espelho do servidor de API, |
| 193 | +o kubelet _não_ remove o Pod estático: |
| 194 | +
|
| 195 | +```shell |
| 196 | +kubectl delete pod static-web |
| 197 | +``` |
| 198 | +``` |
| 199 | +pod "static-web" deleted |
| 200 | +``` |
| 201 | +Você pode ver que o Pod ainda está funcionando: |
| 202 | +```shell |
| 203 | +kubectl get pods |
| 204 | +``` |
| 205 | +``` |
| 206 | +NAME READY STATUS RESTARTS AGE |
| 207 | +static-web 1/1 Running 0 4s |
| 208 | +``` |
| 209 | +
|
| 210 | +De volta ao seu nó, onde o kubelet está funcionando, você pode tentar parar o Contêiner manualmente. |
| 211 | +Você verá que, depois de algum tempo, o Kubelet notará e reiniciará o Pod |
| 212 | +automaticamente: |
| 213 | +
|
| 214 | +```shell |
| 215 | +# Execute esses comandos no nó onde o Kubelet está funcionando |
| 216 | +crictl stop 129fd7d382018 # substitua pelo ID do seu contêiner |
| 217 | +sleep 20 |
| 218 | +crictl ps |
| 219 | +``` |
| 220 | +```console |
| 221 | +CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID |
| 222 | +89db4553e1eeb docker.io/library/nginx@sha256:... 19 seconds ago Running web 1 34533c6729106 |
| 223 | +``` |
| 224 | +
|
| 225 | +## Adição e remoção dinâmica de Pods estáticos |
| 226 | +
|
| 227 | +O Kubelet em execução varre periodicamente o diretório configurado (`/etc/kubernetes/manifests` em nosso exemplo) por alterações, e adiciona/remove os pods à medida que os arquivos aparecem/desaparecem neste diretório. |
| 228 | +
|
| 229 | +```shell |
| 230 | +# Pressupondo que você esteja usando a configuração de Pod estático hospedada no sistema de arquivos |
| 231 | +# Execute esses comandos no nó onde o Kubelet está funcionando |
| 232 | +# |
| 233 | +mv /etc/kubelet.d/static-web.yaml /tmp |
| 234 | +sleep 20 |
| 235 | +crictl ps |
| 236 | +# Você vê que nenhum contêiner nginx está funcionando |
| 237 | +# |
| 238 | +mv /tmp/static-web.yaml /etc/kubelet.d/ |
| 239 | +sleep 20 |
| 240 | +crictl ps |
| 241 | +``` |
| 242 | +```console |
| 243 | +CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID |
| 244 | +f427638871c35 docker.io/library/nginx@sha256:... 19 seconds ago Running web 1 34533c6729106 |
| 245 | +``` |
0 commit comments