|
| 1 | +--- |
| 2 | +title: Instalando a ferramenta kubeadm |
| 3 | +content_type: task |
| 4 | +weight: 10 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | + |
| 9 | +<img src="https://raw.githubusercontent.com/kubernetes/kubeadm/master/logos/stacked/color/kubeadm-stacked-color.png" align="right" width="150px">Essa página mostra o processo de instalação do conjunto de ferramentas `kubeadm`. |
| 10 | +Para mais informações sobre como criar um cluster com o kubeadm após efetuar a instalação, veja a página [Utilizando kubeadm para criar um cluster](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/). |
| 11 | + |
| 12 | + |
| 13 | +## {{% heading "prerequisites" %}} |
| 14 | + |
| 15 | +* Uma máquina com sistema operacional Linux compatível. O projeto Kubernetes provê instruções para distribuições Linux baseadas em Debian e Red Hat, bem como para distribuições sem um gerenciador de pacotes. |
| 16 | +* 2 GB ou mais de RAM por máquina (menos que isso deixará pouca memória para as suas aplicações). |
| 17 | +* 2 CPUs ou mais. |
| 18 | +* Conexão de rede entre todas as máquinas no cluster. Seja essa pública ou privada. |
| 19 | +* Nome da máquina na rede, endereço MAC e producy_uuid únicos para cada nó. Mais detalhes podem ser lidos [aqui](#veficiar-endereco-mac). |
| 20 | +* Portas específicas abertas nas suas máquinas. Você poderá ler quais são [aqui](#verificar-portas-necessarias). |
| 21 | +* Swap desabilitado. Você *precisa* desabilitar a funcionalidade de swap para que o kubelet funcione de forma correta. |
| 22 | + |
| 23 | +<!-- steps --> |
| 24 | + |
| 25 | +## Verificando se o endereço MAC e o product_uiid são únicos para cada nó {#veficiar-endereco-mac} |
| 26 | + |
| 27 | +* Você pode verificar o endereço MAC da interface de rede utilizando o comando `ip link` ou o comando `ipconfig -a`. |
| 28 | +* O product_uuid pode ser verificado utilizando o comando `sudo cat /sys/class/dmi/I'd/product_uuid`. |
| 29 | + |
| 30 | +É provável que dispositivos físicos possuam endereços únicos. No entanto, é possível que algumas máquinas virtuais possuam endereços iguais. O Kubernetes utiliza esses valores para identificar unicamente os nós em um cluster. Se esses valores não forem únicos para cada nó, o processo de instalação pode [falhar](https://github.com/kubernetes/kubeadm/issues/31). |
| 31 | + |
| 32 | +## Verificando os adaptadores de rede |
| 33 | + |
| 34 | +Se você possuir mais de um adaptador de rede, e seus componentes Kubernetes não forem acessíveis através da rota padrão, recomendamos adicionar o IP das rotas para que os endereços do cluster Kubernetes passem pelo adaptador correto. |
| 35 | + |
| 36 | +## Fazendo com que o iptables enxergue o tráfego agregado |
| 37 | + |
| 38 | +Se assegure de que o módulo `br_netfilter` está carregado. Isso pode ser feito executando o comando `lsmod | grep br_netfilter`. Para carrega-lo explicitamente execute `sudo modprobe br_netfilter`. |
| 39 | + |
| 40 | +Você também deve se assegurar de que o valor da configuração `net.bridge.bridge-nf-call-iptables` no seu `sysctl` está com o valor 1. Um requerimento para que as iptables dos seus nós enxerguem o tráfego agregado corretamente. Como no exemplo abaixo: |
| 41 | + |
| 42 | +```bash |
| 43 | +cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf |
| 44 | +br_netfilter |
| 45 | +EOF |
| 46 | + |
| 47 | +cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf |
| 48 | +net.bridge.bridge-nf-call-ip6tables = 1 |
| 49 | +net.bridge.bridge-nf-call-iptables = 1 |
| 50 | +EOF |
| 51 | +sudo sysctl --system |
| 52 | +``` |
| 53 | + |
| 54 | +Para mais detalhes veja a página [Requisitos do plugin de rede](/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#network-plugin-requirements). |
| 55 | + |
| 56 | +## Verificando as portas necessárias |
| 57 | + |
| 58 | +### Nós da camada de gerenciamento |
| 59 | + |
| 60 | +| Protocolo | Direção | Intervalo de portas | Propósito | Utilizada por | |
| 61 | +|----------|-----------|------------|-------------------------|---------------------------| |
| 62 | +| TCP | Entrada | 6443\* | API do Kubernetes | Todos | |
| 63 | +| TCP | Entrada | 2379-2380 | API servidor cliente do etcd | kube-apiserver, etcd | |
| 64 | +| TCP | Entrada | 10250 | API do kubelet | kubeadm, Camada de gerenciamento | |
| 65 | +| TCP | Entrada | 10251 | kube-scheduler | kubeadm | |
| 66 | +| TCP | Entrada | 10252 | kube-controller-manager | kubeadm | |
| 67 | + |
| 68 | +### Nós de processamento |
| 69 | + |
| 70 | +| Protocolo | Direção | Intervalo de portas | Propósito | Utilizada por | |
| 71 | +|----------|-----------|-------------|-----------------------|-------------------------| |
| 72 | +| TCP | Entrada | 10250 | API do kubelet | kubeadm, Camada de gerenciamento | |
| 73 | +| TCP | Entrada | 30000-32767 | Serviços NodePort† | Todos | |
| 74 | + |
| 75 | +† Intervalo padrão de portas para o [Serviços NodePort](/docs/concepts/services-networking/service/). |
| 76 | + |
| 77 | +Quaisquer portas marcadas com * podem ser substituídas. Dito isso, tenha certeza de que qualquer porta que você tenha customizado esteja aberta. |
| 78 | + |
| 79 | +Embora portas etcd sejam inclusas nos nós da camada de gerenciamento, você também pode hospedar seu próprio cluster etcd externamente, ou em portas customizadas. |
| 80 | + |
| 81 | +O plugin de rede dos pods que você utiliza também pode requer que algumas portas estejam abertas. Dito que essas portas podem diferir dependendo do plugin, por favor leia a documentação dos plugins sobre quais portas serão necessárias abrir. |
| 82 | + |
| 83 | +## Instalando agente de execução {#instalando-agente-de-execucao} |
| 84 | + |
| 85 | +Para executar os contêineres nos Pods, o Kubernetes utiliza um |
| 86 | +{{< glossary_tooltip term_id="container-runtime" text="agente de execução" >}}. |
| 87 | + |
| 88 | +{{< tabs name="container_runtime" >}} |
| 89 | +{{% tab name="Nós Linux" %}} |
| 90 | + |
| 91 | +Por padrão, o Kubernetes utiliza a {{< glossary_tooltip term_id="cri" text="interface do agente de execução">}} (CRI) para interagir com o seu agente de execução de contêiner escolhido. |
| 92 | + |
| 93 | +Se você não especificar nenhum agente de execução, o kubeadm irá tentar identifica-lo automaticamente através de uma lista dos sockets Unix mais utilizados. A tabela a seguir lista os agentes de execução e os caminhos dos sockets a eles associados. |
| 94 | + |
| 95 | +{{< table caption = "Agentes de execução e seus caminhos de socket" >}} |
| 96 | +| Agente de execução | Caminho do socket Unix | |
| 97 | +|------------|-----------------------------------| |
| 98 | +| Docker | `/var/run/dockershim.sock` | |
| 99 | +| containerd | `/run/containerd/containerd.sock` | |
| 100 | +| CRI-O | `/var/run/crio/crio.sock` | |
| 101 | +{{< /table >}} |
| 102 | + |
| 103 | +<br /> |
| 104 | +Se tanto o Docker quanto o containerd forem detectados no sistema, o Docker terá precedência. Isso acontece porque o Docker, desde a versão 18.09, já incluí o containerd e ambos são detectaveis mesmo que você só tenha instalado o Docker. Se outros dois ou mais agentes de execução forem detectados, o kubeadm é encerrado com um erro. |
| 105 | + |
| 106 | +O kubelet se integra com o Docker através da implementação CRI `dockershim` já inclusa. |
| 107 | + |
| 108 | +Veja [agente de execução](/docs/setup/production-environment/container-runtimes/) |
| 109 | +para mais detalhes. |
| 110 | +{{% /tab %}} |
| 111 | +{{% tab name="outros sistemas operacionais" %}} |
| 112 | +Por padrão, o kubeadm utiliza o {{< glossary_tooltip term_id="docker" >}} como agente de execução. |
| 113 | +O kubelet se integra com o Docker através da implementação CRI `dockershim` já inclusa. |
| 114 | + |
| 115 | +Veja [agente de execução](/docs/setup/production-environment/container-runtimes/) |
| 116 | +para mais detalhes. |
| 117 | +{{% /tab %}} |
| 118 | +{{< /tabs >}} |
| 119 | + |
| 120 | + |
| 121 | +## Instalando o kubeadm, kubelet e o kubectl |
| 122 | + |
| 123 | +Você instalará esses pacotes em todas as suas máquinas: |
| 124 | + |
| 125 | +* `kubeadm`: o comando para iniciar o cluster. |
| 126 | + |
| 127 | +* `kubelet`: o componente que executa em todas as máquinas no seu cluster e cuida de coisas como a inicialização de pods e contêineres. |
| 128 | + |
| 129 | +* `kubectl`: a ferramenta de linha de comando para interação com o cluster. |
| 130 | + |
| 131 | +O kubeadm **não irá** instalar ou gerenciar o `kubelet` ou o `kubectl` para você, então você |
| 132 | +precisará garantir que as versões deles são as mesmas da versão da camada de gerenciamento do Kubernetes |
| 133 | +que você quer que o kubeadm instale. Caso isso não seja feito, surge o risco de que uma diferença nas versões |
| 134 | +leve a bugs e comportamentos inesperados. Dito isso, _uma_ diferença de menor grandeza nas versões entre o kubelet e a |
| 135 | +camada de gerenciamento é suportada, mas a versão do kubelet nunca poderá ser superior a versão do servidor da API. |
| 136 | +Por exemplo, um kubelet com a versão 1.7.0 será totalmente compatível com a versão 1.8.0 do servidor da API, mas o contrário não será verdadeiro. |
| 137 | + |
| 138 | +Para mais informações acerca da instalação do `kubectl`, veja [Instale e configure o kubectl](/docs/tasks/tools/). |
| 139 | + |
| 140 | +{{< warning >}} |
| 141 | +Essas instruções removem todos os pacotes Kubernetes de quaisquer atualizações de sistema. |
| 142 | +Isso ocorre porque o kubeadm e o Kubernetes requerem alguns [cuidados especiais para serem atualizados](/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/). |
| 143 | +{{</ warning >}} |
| 144 | + |
| 145 | +para mais detalhes da compatibilidade entre as versões, veja: |
| 146 | + |
| 147 | +* [Políticas de versão e compatibilidade entre versões](/docs/setup/release/version-skew-policy/) do Kubernetes. |
| 148 | +* [Compatibilidade entre versões](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#version-skew-policy) do Kubeadm. |
| 149 | + |
| 150 | +{{< tabs name="k8s_install" >}} |
| 151 | +{{% tab name="Distribuições Debian" %}} |
| 152 | + |
| 153 | +1. Atualize o índice de pacotes `apt` e instale os pacotes necessários para utilizar o repositório `apt` do Kubernetes: |
| 154 | + |
| 155 | + ```shell |
| 156 | + sudo apt-get update |
| 157 | + sudo apt-get install -y apt-transport-https ca-certificates curl |
| 158 | + ``` |
| 159 | + |
| 160 | +2. Faça o download da chave de assinatura pública da Google Cloud: |
| 161 | + |
| 162 | + ```shell |
| 163 | + sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg |
| 164 | + ``` |
| 165 | + |
| 166 | +3. Adicione o repositório `apt` do Kubernetes: |
| 167 | + |
| 168 | + ```shell |
| 169 | + echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list |
| 170 | + ``` |
| 171 | + |
| 172 | +4. Atualize o índice de pacotes `apt`, instale o kubelet, o kubeadm e o kubectl, e fixe suas versões: |
| 173 | + |
| 174 | + ```shell |
| 175 | + sudo apt-get update |
| 176 | + sudo apt-get install -y kubelet kubeadm kubectl |
| 177 | + sudo apt-mark hold kubelet kubeadm kubectl |
| 178 | + ``` |
| 179 | + |
| 180 | +{{% /tab %}} |
| 181 | +{{% tab name="Distribuições Red Hat" %}} |
| 182 | +```bash |
| 183 | +cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo |
| 184 | +[kubernetes] |
| 185 | +name=Kubernetes |
| 186 | +baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch |
| 187 | +enabled=1 |
| 188 | +gpgcheck=1 |
| 189 | +repo_gpgcheck=1 |
| 190 | +gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg |
| 191 | +exclude=kubelet kubeadm kubectl |
| 192 | +EOF |
| 193 | + |
| 194 | +# Set SELinux in permissive mode (effectively disabling it) |
| 195 | +sudo setenforce 0 |
| 196 | +sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config |
| 197 | + |
| 198 | +sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes |
| 199 | + |
| 200 | +sudo systemctl enable --now kubelet |
| 201 | +``` |
| 202 | + |
| 203 | + **Avisos:** |
| 204 | + |
| 205 | + - Colocar o SELinux em modo permissivo ao executar `setenforce 0` e `sed ...` efetivamente o desabilita. |
| 206 | + Isso é necessário para permitir que os contêineres acessem o sistema de arquivos do hospedeiro, que é utilizado pelas redes dos pods por exemplo. |
| 207 | + Você precisará disso até que o suporte ao SELinux seja melhorado no kubelet. |
| 208 | + |
| 209 | + - Você pode deixar o SELinux habilitado se você souber como configura-lo, mas isso pode exegir configurações que não são suportadas pelo kubeadm. |
| 210 | + |
| 211 | +{{% /tab %}} |
| 212 | +{{% tab name="Sem um gerenciador de pacotes" %}} |
| 213 | +Instale os plugins CNI (utilizados por grande parte das redes de pods): |
| 214 | + |
| 215 | +```bash |
| 216 | +CNI_VERSION="v0.8.2" |
| 217 | +ARCH="amd64" |
| 218 | +sudo mkdir -p /opt/cni/bin |
| 219 | +curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-${ARCH}-${CNI_VERSION}.tgz" | sudo tar -C /opt/cni/bin -xz |
| 220 | +``` |
| 221 | + |
| 222 | +Escolha o diretório para baixar os arquivos de comandos. |
| 223 | + |
| 224 | +{{< note >}} |
| 225 | +A variável `DOWNLOAD_DIR` precisa estar configurada para um diretório que permita escrita. |
| 226 | +Se você estiver utilizando o Flatcar Container Linux, veja `DOWNLOAD_DIR=/opt/bin`. |
| 227 | +{{< /note >}} |
| 228 | + |
| 229 | +```bash |
| 230 | +DOWNLOAD_DIR=/usr/local/bin |
| 231 | +sudo mkdir -p $DOWNLOAD_DIR |
| 232 | +``` |
| 233 | + |
| 234 | +Instale o crictl (utilizado pelo kubeadm e pela Interface do Agente de execução do Kubelet (CRI)) |
| 235 | + |
| 236 | +```bash |
| 237 | +CRICTL_VERSION="v1.17.0" |
| 238 | +ARCH="amd64" |
| 239 | +curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz |
| 240 | +``` |
| 241 | + |
| 242 | +Instale o `kubeadm`, o `kubelet`, e o `kubectl` e adicione o serviço systemd `kubelet`: |
| 243 | + |
| 244 | +```bash |
| 245 | +RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)" |
| 246 | +ARCH="amd64" |
| 247 | +cd $DOWNLOAD_DIR |
| 248 | +sudo curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/${ARCH}/{kubeadm,kubelet,kubectl} |
| 249 | +sudo chmod +x {kubeadm,kubelet,kubectl} |
| 250 | + |
| 251 | +RELEASE_VERSION="v0.4.0" |
| 252 | +curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service |
| 253 | +sudo mkdir -p /etc/systemd/system/kubelet.service.d |
| 254 | +curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf |
| 255 | +``` |
| 256 | + |
| 257 | +Habilite e inicie o `kubelet`: |
| 258 | + |
| 259 | +```bash |
| 260 | +systemctl enable --now kubelet |
| 261 | +``` |
| 262 | + |
| 263 | +{{< note >}} |
| 264 | +A distribuição Linux Flatcar Container instala o diretório `/usr` como um sistema de arquivos apenas para leitura. |
| 265 | +Antes de inicializar o seu cluster, você precisa de alguns passos adicionais para configurar um diretório com escrita. |
| 266 | +Veja o [Guia de solução de problemas do Kubeadm](/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/#usr-mounted-read-only/) para aprender como configurar um diretório com escrita. |
| 267 | +{{< /note >}} |
| 268 | +{{% /tab %}} |
| 269 | +{{< /tabs >}} |
| 270 | + |
| 271 | +O kubelet agora ficará reiniciando de alguns em alguns segundos, enquanto espera por instruções vindas do kubeadm. |
| 272 | + |
| 273 | +## Configurando um driver cgroup |
| 274 | + |
| 275 | +Tanto o agente de execução quanto o kubelet possuem uma propriedade chamada |
| 276 | +["driver cgroup"](/docs/setup/production-environment/container-runtimes/), que é importante |
| 277 | +para o gerenciamento dos cgroups em máquinas Linux. |
| 278 | + |
| 279 | +{{< warning >}} |
| 280 | +A compatibilidade entre os drivers cgroup e o agente de execução é necessária. Sem ela o processo do kubelet irá falhar. |
| 281 | + |
| 282 | +Veja [configurando um driver cgroup](/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/) para mais detalhes. |
| 283 | +{{< /warning >}} |
| 284 | + |
| 285 | +## Solucionando problemas |
| 286 | + |
| 287 | +Se você encontrar problemas com o kubeadm, por favor consulte a nossa [documentação de solução de problemas](/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/). |
| 288 | + |
| 289 | +## {{% heading "whatsnext" %}} |
| 290 | + |
| 291 | +* [Utilizando o kubeadm para criar um cluster](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/). |
0 commit comments