|
| 1 | +--- |
| 2 | +title: Plugins de rede |
| 3 | +content_type: concept |
| 4 | +weight: 10 |
| 5 | +--- |
| 6 | + |
| 7 | + |
| 8 | +<!-- overview --> |
| 9 | +Plugins de redes no Kubernetes podem ser dos seguintes tipos: |
| 10 | + |
| 11 | +* Plugins CNI: Aderentes à especificação [Container Network Interface](https://github.com/containernetworking/cni) (CNI), desenhados para interoperabilidade. |
| 12 | + * Kubernetes usa a versão [v0.4.0](https://github.com/containernetworking/cni/blob/spec-v0.4.0/SPEC.md) da especificação CNI. |
| 13 | +* Plugin kubenet: Implementa o `cbr0` básico usando os plugins CNI `bridge` e `host-local` |
| 14 | + |
| 15 | +<!-- body --> |
| 16 | + |
| 17 | +## Instalação |
| 18 | + |
| 19 | +O kubelet possui um plugin único padrão, e um plugin padrão comum para todo o cluster. |
| 20 | +Ele verifica o plugin quando inicia, se lembra o que encontrou, e executa o plugin selecionado |
| 21 | +em momentos oportunos dentro do ciclo de vida de um Pod (isso é verdadeiro apenas com o Docker, |
| 22 | +uma vez que o CRI gerencia seus próprios plugins de CNI). Existem dois parâmetros de linha de comando |
| 23 | +no Kubelet para se ter em mente quando usando plugins: |
| 24 | + |
| 25 | +* `cni-bin-dir`: O Kubelet verifica esse diretório por plugins na inicialização |
| 26 | +* `network-plugin`: O plugin de rede que deve ser utilizado do diretório configurado em |
| 27 | +`cni-bin-dir`. Deve ser igual ao nome configurado por um plugin no diretório de plugins. |
| 28 | +Para plugins de CNI, isso equivale ao valor `cni`. |
| 29 | + |
| 30 | +## Requisitos de plugins de Rede |
| 31 | + |
| 32 | +Além de prover a [interface `NetworkPlugin`](https://github.com/kubernetes/kubernetes/tree/{{< param "fullversion" >}}/pkg/kubelet/dockershim/network/plugins.go) |
| 33 | +para configuração da rede do pod, o plugin pode necessitar de suporte específico ao |
| 34 | +kube-proxy. |
| 35 | +O proxy iptables obviamente depende do iptables, e o plugin deve garantir que o |
| 36 | +tráfego do contêiner esteja disponível para o iptables. Por exemplo, se o plugin |
| 37 | +conecta os contêineres à _Linux bridge_, o plugin deve configurar a diretiva de |
| 38 | +_sysctl_ `net/bridge/bridge-nf-call-iptables` com o valor `1` para garantir que o |
| 39 | +proxy iptables opere normalmente. Se o plugin não faz uso da _Linux Bridge_ (mas outro |
| 40 | +mecanismo, como Open vSwitch) ele deve garantir que o tráfego do contêiner é roteado |
| 41 | +apropriadamente para o proxy. |
| 42 | + |
| 43 | +Por padrão, se nenhum plugin de rede é configurado no kubelet, o plugin `noop` é utilizado, |
| 44 | +que configura `net/bridge/bridge-nf-call-iptables=1` para garantir que configurações simples |
| 45 | +(como Docker com _bridge Linux_) operem corretamente com o proxy iptables. |
| 46 | + |
| 47 | +### CNI |
| 48 | + |
| 49 | +O plugin de CNI é selecionado utilizando-se da opção `--network-plugin=cni` no início do Kubeket. |
| 50 | +O Kubelet lê um arquivo do diretório especificado em `--cni-conf-dir` (padrão `/etc/cni/net.d`) |
| 51 | +e usa a configuração de CNI desse arquivo para configurar a rede de cada Pod. O arquivo de |
| 52 | +configuração do CNI deve usar a [especificação de CNI](https://github.com/containernetworking/cni/blob/master/SPEC.md#network-configuration), |
| 53 | +e qualquer plugin referenciado nesse arquivo deve estar presente no diretório |
| 54 | +`--cni-bin-dir` (padrão `/opt/cni/bin`). |
| 55 | + |
| 56 | +Se existirem múltiplos arquivos de configuração no diretório, o kubelet usa o arquivo de |
| 57 | +configuração que vier primeiro pelo nome, em ordem alfabética. |
| 58 | + |
| 59 | +Adicionalmente ao plugin de CNI especificado no arquivo de configuração, o Kubernetes requer |
| 60 | +o plugin CNI padrão [`lo`](https://github.com/containernetworking/plugins/blob/master/plugins/main/loopback/loopback.go) ao menos na versão 0.2.0. |
| 61 | + |
| 62 | +#### Suporte a hostPort |
| 63 | + |
| 64 | +O plugin de redes CNI suporta `hostPort`. Você pode utilizar o plugin oficial |
| 65 | +[portmap](https://github.com/containernetworking/plugins/tree/master/plugins/meta/portmap) |
| 66 | +ou usar seu próprio plugin com a funcionalidade de _portMapping_. |
| 67 | + |
| 68 | +Caso você deseje habilitar o suporte a `hostPort`, você deve especificar |
| 69 | +`portMappings capability` no seu `cni-conf-dir`. |
| 70 | +Por exemplo: |
| 71 | + |
| 72 | +```json |
| 73 | +{ |
| 74 | + "name": "k8s-pod-network", |
| 75 | + "cniVersion": "0.3.0", |
| 76 | + "plugins": [ |
| 77 | + { |
| 78 | + "type": "calico", |
| 79 | + "log_level": "info", |
| 80 | + "datastore_type": "kubernetes", |
| 81 | + "nodename": "127.0.0.1", |
| 82 | + "ipam": { |
| 83 | + "type": "host-local", |
| 84 | + "subnet": "usePodCidr" |
| 85 | + }, |
| 86 | + "policy": { |
| 87 | + "type": "k8s" |
| 88 | + }, |
| 89 | + "kubernetes": { |
| 90 | + "kubeconfig": "/etc/cni/net.d/calico-kubeconfig" |
| 91 | + } |
| 92 | + }, |
| 93 | + { |
| 94 | + "type": "portmap", |
| 95 | + "capabilities": {"portMappings": true} |
| 96 | + } |
| 97 | + ] |
| 98 | +} |
| 99 | +``` |
| 100 | + |
| 101 | +#### Suporte a controle de banda |
| 102 | + |
| 103 | +**Funcionalidade experimental** |
| 104 | + |
| 105 | +O plugin de rede CNI também suporta o controle de banda de entrada e saída. |
| 106 | +Você pode utilizar o plugin oficial [bandwidth](https://github.com/containernetworking/plugins/tree/master/plugins/meta/bandwidth) |
| 107 | +desenvolvido ou usar seu próprio plugin de controle de banda. |
| 108 | + |
| 109 | +Se você habilitar o suporte ao controle de banda, você deve adicionar o plugin `bandwidth` |
| 110 | +no seu arquivo de configuração de CNI (padrão `/etc/cni/net.d`) e garantir que o programa |
| 111 | +exista no diretório de binários do CNI (padrão `/opt/cni/bin`). |
| 112 | + |
| 113 | +```json |
| 114 | +{ |
| 115 | + "name": "k8s-pod-network", |
| 116 | + "cniVersion": "0.3.0", |
| 117 | + "plugins": [ |
| 118 | + { |
| 119 | + "type": "calico", |
| 120 | + "log_level": "info", |
| 121 | + "datastore_type": "kubernetes", |
| 122 | + "nodename": "127.0.0.1", |
| 123 | + "ipam": { |
| 124 | + "type": "host-local", |
| 125 | + "subnet": "usePodCidr" |
| 126 | + }, |
| 127 | + "policy": { |
| 128 | + "type": "k8s" |
| 129 | + }, |
| 130 | + "kubernetes": { |
| 131 | + "kubeconfig": "/etc/cni/net.d/calico-kubeconfig" |
| 132 | + } |
| 133 | + }, |
| 134 | + { |
| 135 | + "type": "bandwidth", |
| 136 | + "capabilities": {"bandwidth": true} |
| 137 | + } |
| 138 | + ] |
| 139 | +} |
| 140 | +``` |
| 141 | + |
| 142 | +Agora você pode adicionar as anotações `kubernetes.io/ingress-bandwidth` e |
| 143 | +`kubernetes.io/egress-bandwidth` em seu pod. |
| 144 | +Por exemplo: |
| 145 | + |
| 146 | +```yaml |
| 147 | +apiVersion: v1 |
| 148 | +kind: Pod |
| 149 | +metadata: |
| 150 | + annotations: |
| 151 | + kubernetes.io/ingress-bandwidth: 1M |
| 152 | + kubernetes.io/egress-bandwidth: 1M |
| 153 | +... |
| 154 | +``` |
| 155 | + |
| 156 | +### kubenet |
| 157 | + |
| 158 | +Kubenet é um plugin de rede muito simples, existente apenas no Linux. Ele não |
| 159 | +implementa funcionalidades mais avançadas, como rede entre nós ou políticas de rede. |
| 160 | +Ele é geralmente utilizado junto a um provedor de nuvem que configura as regras de |
| 161 | +roteamento para comunicação entre os nós, ou em ambientes com apenas um nó. |
| 162 | + |
| 163 | +O Kubenet cria uma _interface bridge_ no Linux chamada `cbr0` e cria um par _veth_ |
| 164 | +para cada um dos pods com o host como a outra ponta desse par, conectado à `cbr0`. |
| 165 | +Na interface no lado do Pod um endereço IP é alocado de uma faixa associada ao nó, |
| 166 | +sendo parte de alguma configuração no nó ou pelo controller-manager. Na interface `cbr0` |
| 167 | +é associado o MTU equivalente ao menor MTU de uma interface de rede do host. |
| 168 | + |
| 169 | +Esse plugin possui alguns requisitos: |
| 170 | + |
| 171 | +* Os plugins CNI padrão `bridge`, `lo` e `host-local` são obrigatórios, ao menos na |
| 172 | +versão 0.2.0. O Kubenet buscará inicialmente esses plugins no diretório `/opt/cni/bin`. |
| 173 | +Especifique a opção `cni-bin-dir` no kubelet para fornecer um diretório adicional |
| 174 | +de busca. O primeiro local equivalente será o utilizado. |
| 175 | +* O kubelet deve ser executado com a opção `--network-plugin=kubenet` para habilitar esse plugin. |
| 176 | +* O Kubelet deve ainda ser executado com a opção `--non-masquerade-cidr=<clusterCidr>` para |
| 177 | +garantir que o tráfego de IPs para fora dessa faixa seja mascarado. |
| 178 | +* O nó deve possuir uma subrede associada, através da opção `--pod-cidr` configurada |
| 179 | +na inicialização do kubelet, ou as opções `--allocate-node-cidrs=true --cluster-cidr=<cidr>` |
| 180 | +utilizadas na inicialização do _controller-manager_. |
| 181 | + |
| 182 | +### Customizando o MTU (com kubenet) |
| 183 | + |
| 184 | +O MTU deve sempre ser configurado corretamente para obter-se a melhor performance de |
| 185 | +rede. Os plugins de rede geralmente tentam detectar uma configuração correta de MTU, |
| 186 | +porém algumas vezes a lógica não irá resultar em uma configuração adequada. Por exemplo, |
| 187 | +se a _Docker bridge_ ou alguma outra interface possuir um MTU pequeno, o kubenet irá |
| 188 | +selecionar aquela MTU. Ou caso você esteja utilizando encapsulamento IPSEC, o MTU deve |
| 189 | +ser reduzido, e esse cálculo não faz parte do escopo da maioria dos plugins de rede. |
| 190 | + |
| 191 | +Sempre que necessário, você pode configurar explicitamente o MTU com a opção `network-plugin-mtu` |
| 192 | +no kubelet. Por exemplo, na AWS o MTU da `eth0` geralmente é 9001 então você deve |
| 193 | +especificar `--network-plugin-mtu=9001`. Se você estiver usando IPSEC você deve reduzir |
| 194 | +o MTU para permitir o encapsulamento excedente; por exemplo: `--network-plugin-mtu=8773`. |
| 195 | + |
| 196 | +Essa opção faz parte do plugin de rede. Atualmente **apenas o kubenet suporta a configuração |
| 197 | +`network-plugin-mtu`**. |
| 198 | + |
| 199 | +## Resumo de uso |
| 200 | + |
| 201 | +* `--network-plugin=cni` especifica que devemos usar o plugin de redes `cni` com os |
| 202 | +binários do plugin localizados em `--cni-bin-dir` (padrão `/opt/cni/bin`) e as |
| 203 | +configurações do plugin localizadas em `--cni-conf-dir` (default `/etc/cni/net.d`). |
| 204 | +* `--network-plugin=kubenet` especifica que iremos usar o plugin de rede `kubenet` |
| 205 | +com os plugins CNI `bridge`, `lo` e `host-local` localizados em `/opt/cni/bin` ou `cni-bin-dir`. |
| 206 | +* `--network-plugin-mtu=9001` especifica o MTU a ser utilizado, atualmente apenas em uso |
| 207 | +pelo plugin de rede `kubenet` |
| 208 | + |
| 209 | +## {{% heading "whatsnext" %}} |
0 commit comments