Escolar Documentos
Profissional Documentos
Cultura Documentos
Conceitos
1: Intervalos de limite
2: Cotas de Recursos
3: Visão Geral
3.1: O que é Kubernetes?
3.2: Componentes do Kubernetes
3.3: Objetos do Kubernetes
3.3.1: Nomes
3.3.2: Namespaces
3.3.3: Seletores de Campos
4: Volumes Persistentes
5: Arquitetura do Kubernetes
5.1: Comunicação entre Nó e Control Plane
5.2: Conceitos sobre Cloud Controller Manager
5.3: Controladores
6: Contêineres
6.1: Imagens
6.2: Ambiente de Contêiner
6.3: Classes de execução
6.4: Hooks de Ciclo de Vida do Contêiner
7: Serviços, balanceamento de carga e conectividade
7.1: Políticas de rede
8: Configuração
8.1: Melhores Práticas de Configuração
8.2: ConfigMaps
8.3: Secrets
8.4: Gerenciamento de recursos em Pods e contêineres
8.5: Organizando o acesso ao cluster usando arquivos kubeconfig
9: Segurança
9.1: Visão Geral da Segurança Cloud Native
10: Escalonamento
10.1: Taints e Tolerâncias
10.2: Escalonador do Kubernetes
10.3: Sobrecarga de Pod
11: Administração de Cluster
11.1: Visão Geral da Administração de Cluster
11.2: Certificates
11.3: Conectividade do Cluster
11.4: Arquitetura de Log
11.5: Logs de Sistema
11.6: Métricas para componentes do sistema Kubernetes
11.7: Configurando o Garbage Collection do kubelet
11.8: Proxies no Kubernetes
11.9: Instalando Complementos
12: Extendendo o Kubernetes
12.1: Extendendo a API do Kubernetes
12.1.1: Extendendo a API do Kubernetes com a camada de agregação
12.2: Extensões de Computação, armazenamento e redes
12.2.1: Plugins de rede
https://kubernetes.io/pt-br/docs/concepts/_print/ 1/178
5/14/22, 11:15 AM Conceitos | Kubernetes
Ela irá lhe ajudar a obter um entendimento mais profundo sobre como o Kubernetes
funciona.
1 - Intervalos de limite
Por padrão, os cointêineres são executados com recursos computacionais ilimitados em um
cluster Kubernetes. Com cotas de recursos, os administradores de cluster podem restringir o
consumo e a criação de recursos baseado no namespace. Dentro de um namespace, pod ou
contêiner pode haver o consumo de quantidade de CPU e memória definidos de acordo com
a cota de recursos do namespace. Existe a preocupação de que um Pod ou contêiner possa
monopolizar todos os recursos disponíveis, justamente por conta disso existe o conceito de
Limit Range, ou intervalos de limite, que pode ser definido como uma política utilizada para a
restrição de alocação de recursos (para pods ou contêineres) em um namespace.
Ativando o LimitRange
O suporte ao LimitRange foi ativado por padrão desde o Kubernetes 1.10.
Alguns exemplos de políticas que podem ser criadas utilizando os intervalos de limite são:
https://kubernetes.io/pt-br/docs/concepts/_print/ 2/178
5/14/22, 11:15 AM Conceitos | Kubernetes
Caso os limites totais do namespace sejam menores que a soma dos limites dos
Pods/Contêineres, pode haver contenção por recursos. Nesse caso, os contêineres ou Pods
não serão criados.
Próximos passos
Consulte o documento de design LimitRanger para obter mais informações.
https://kubernetes.io/pt-br/docs/concepts/_print/ 3/178
5/14/22, 11:15 AM Conceitos | Kubernetes
2 - Cotas de Recursos
Quando vários usuários ou equipes compartilham um cluster com um número fixo de nós,
há
uma preocupação de que uma equipe possa usar mais do que é justo durante o
compartilhamento de recursos.
Uma cota de recurso, definida por um objeto ResourceQuota , fornece restrições que limitam
consumo de recursos agregados por namespace. Pode limitar a quantidade de objetos que
podem
ser criado em um namespace por tipo, bem como a quantidade total de recursos
computacionais que podem
ser consumidos por recursos nesse namespace.
Exemplos de políticas que podem ser criadas usando namespaces e cotas são:
Caso a capacidade total do cluster seja menor que a soma das cotas dos namespaces, pode
haver contenção de recursos. Isso é tratado por ordem de chegada.
Você pode limitar a soma total de recursos computacionais que pode ser solicitado em um
determinado namespace.
Nome do
Recurso Descrição
limits Em todos os pods em um estado não terminal, a soma dos limites de CPU
.cpu não pode exceder esse valor.
Como o overcommit não é permitido para recursos estendidos, não faz sentido especificar
tanto requests e limits para o mesmo recurso estendido em uma cota. Portanto, para
recursos estendidos, apenas itens de cota com prefixo requests. é permitido por enquanto.
Tome o recurso GPU como exemplo, se o nome do recurso for nvidia.com/gpu e você quiser
limitar o número total de GPUs solicitadas em um namespace para 4, você pode definir uma
cota da seguinte maneira:
requests.nvidia.com/gpu: 4
Além disso, você pode limitar o consumo de recursos de armazenamento com base na classe
de armazenamento associada.
https://kubernetes.io/pt-br/docs/concepts/_print/ 5/178
5/14/22, 11:15 AM Conceitos | Kubernetes
gold.storageclass.storage.k8s.io/requests.storage: 500Gi
bronze.storageclass.storage.k8s.io/requests.storage: 100Gi
Na versão 1.8, o suporte de cota para armazenamento temporário local foi adicionado como
um recurso alfa:
count/persistentvolumeclaims
count/services
count/secrets
count/configmaps
count/replicationcontrollers
https://kubernetes.io/pt-br/docs/concepts/_print/ 6/178
5/14/22, 11:15 AM Conceitos | Kubernetes
count/deployments.apps
count/replicasets.apps
count/statefulsets.apps
count/jobs.batch
count/cronjobs.batch
A mesma sintaxe pode ser usada para recursos personalizados. Por exemplo, para criar uma
cota em um recurso personalizado widgets no grupo de API example.com , use
count/widgets.example.com .
Nome do
Recurso Descrição
pods O número total de pods em um estado não terminal que pode existir no
namespace. Um pod está em um estado terminal se .status.phase in
(Failed, Succeeded) for verdadeiro.
Por exemplo, a cota de pods conta e impõe um número máximo de pods criados em um
único namespace que não é terminal. Você pode querer definir uma cota pods em um
namespace para evitar o caso em que um usuário cria muitos pods pequenos e esgota o
https://kubernetes.io/pt-br/docs/concepts/_print/ 7/178
5/14/22, 11:15 AM Conceitos | Kubernetes
Escopos de cota
Cada cota pode ter um conjunto associado de scopes . Uma cota só medirá o uso de um
recurso se corresponder
a interseção de escopos enumerados.
Quando um escopo é adicionado à cota, ele limita o número de recursos aos quais ele dá
suporte a aqueles que pertencem ao escopo. Os recursos especificados na cota fora do
conjunto permitido resultam em um erro de validação.
Escopo Descrição
pods
pods
cpu
memory
requests.cpu
requests.memory
limits.cpu
limits.memory
Observe que você não pode especificar os escopos Terminate e o NotTerminate na mesma
cota, e você também não pode especificar o BestEffort e NotBestEffort na mesma cota.
In
NotIn
Exists
DoesNotExist
Terminating
https://kubernetes.io/pt-br/docs/concepts/_print/ 8/178
5/14/22, 11:15 AM Conceitos | Kubernetes
NotTerminating
BestEffort
NotBestEffort
Se o operator for In ou NotIn , o campo values deve ter pelo menos um valor. Por
exemplo:
scopeSelector:
matchExpressions:
- scopeName: PriorityClass
operator: In
values:
- middle
Se o operator for Exists ou DoesNotExist , o campo values NÃO deve ser especificado.
Os pods podem ser criados em uma prioridade específica. Você pode controlar o consumo de
recursos do sistema de um pod com base na prioridade de um pod, usando o
scopeSelector
campo na especificação de cota.
pods
cpu
memory
ephemeral-storage
limits.cpu
limits.memory
limits.ephemeral-storage
requests.cpu
requests.memory
requests.ephemeral-storage
Os pods no cluster têm uma das três classes de prioridade, "baixa", "média", "alta".
Um objeto de cota é criado para cada prioridade.
apiVersion: v1
kind: List
items:
- apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-high
spec:
hard:
cpu: "1000"
memory: 200Gi
pods: "10"
https://kubernetes.io/pt-br/docs/concepts/_print/ 9/178
5/14/22, 11:15 AM Conceitos | Kubernetes
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: ["high"]
- apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-medium
spec:
hard:
cpu: "10"
memory: 20Gi
pods: "10"
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: ["medium"]
- apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-low
spec:
hard:
cpu: "5"
memory: 10Gi
pods: "10"
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: ["low"]
resourcequota/pods-high created
resourcequota/pods-medium created
resourcequota/pods-low created
https://kubernetes.io/pt-br/docs/concepts/_print/ 10/178
5/14/22, 11:15 AM Conceitos | Kubernetes
Name: pods-high
Namespace: default
cpu 0 1k
memory 0 200Gi
pods 0 10
Name: pods-low
Namespace: default
cpu 0 5
memory 0 10Gi
pods 0 10
Name: pods-medium
Namespace: default
cpu 0 10
memory 0 20Gi
pods 0 10
Crie um pod com prioridade "high". Salve o seguinte YAML em um arquivo high-priority-
pod.yml .
apiVersion: v1
kind: Pod
metadata:
name: high-priority
spec:
containers:
- name: high-priority
image: ubuntu
command: ["/bin/sh"]
resources:
requests:
memory: "10Gi"
cpu: "500m"
limits:
memory: "10Gi"
cpu: "500m"
priorityClassName: high
https://kubernetes.io/pt-br/docs/concepts/_print/ 11/178
5/14/22, 11:15 AM Conceitos | Kubernetes
Name: pods-high
Namespace: default
cpu 500m 1k
pods 1 10
Name: pods-low
Namespace: default
cpu 0 5
memory 0 10Gi
pods 0 10
Name: pods-medium
Namespace: default
cpu 0 10
memory 0 20Gi
pods 0 10
Impedir que os usuários usem termos de afinidade entre namespaces pode ser desejável, pois
um pod
com restrições antiafinidade pode bloquear pods de todos os outros namespaces de
ser agendado em um domínio de falha.
O uso desses operadores de escopo pode impedir certos namespaces ( foo-ns no exemplo
abaixo) de ter pods que usam afinidade de pod entre namespaces criando um objeto de cota
de recurso nesse namespace com escopo CrossNamespaceAffinity e limite rígido de 0:
apiVersion: v1
kind: ResourceQuota
metadata:
name: disable-cross-namespace-affinity
namespace: foo-ns
spec:
hard:
pods: "0"
scopeSelector:
matchExpressions:
- scopeName: CrossNamespaceAffinity
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
https://kubernetes.io/pt-br/docs/concepts/_print/ 12/178
5/14/22, 11:15 AM Conceitos | Kubernetes
- name: "ResourceQuota"
configuration:
apiVersion: apiserver.config.k8s.io/v1
kind: ResourceQuotaConfiguration
limitedResources:
- resource: pods
matchScopes:
- scopeName: CrossNamespaceAffinity
Esse recurso é beta e ativado por padrão. Você pode desativá-lo usando o feature gate
PodAffinityNamespaceSelector no kube-apiserver e no kube-scheduler.
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
requests.nvidia.com/gpu: 4
EOF
apiVersion: v1
kind: ResourceQuota
metadata:
name: object-counts
spec:
hard:
configmaps: "10"
https://kubernetes.io/pt-br/docs/concepts/_print/ 13/178
5/14/22, 11:16 AM Conceitos | Kubernetes
persistentvolumeclaims: "4"
pods: "4"
replicationcontrollers: "20"
secrets: "10"
services: "10"
services.loadbalancers: "2"
EOF
NAME AGE
compute-resources 30s
object-counts 32s
Name: compute-resources
Namespace: myspace
limits.cpu 0 2
limits.memory 0 2Gi
requests.cpu 0 1
requests.memory 0 1Gi
requests.nvidia.com/gpu 0 4
Name: object-counts
Namespace: myspace
configmaps 0 10
persistentvolumeclaims 0 4
pods 0 4
replicationcontrollers 0 20
secrets 1 10
services 0 10
services.loadbalancers 0 2
Kubectl also supports object count quota for all standard namespaced resources
using the
syntax count/<resource>.<group> :
https://kubernetes.io/pt-br/docs/concepts/_print/ 14/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Name: test
Namespace: myspace
count/deployments.apps 1 2
count/pods 2 3
count/replicasets.apps 1 4
count/secrets 1 4
Observe que a cota de recursos divide os recursos agregados do cluster, mas não cria
restrições em torno dos nós: pods de vários namespaces podem ser executados no mesmo
nó.
Com este mecanismo, os operadores podem restringir o uso de certas classes de prioridade
para um número limitado de namespaces , e nem todos poderão consumir essas classes de
prioridade por padrão.
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: "ResourceQuota"
configuration:
apiVersion: apiserver.config.k8s.io/v1
kind: ResourceQuotaConfiguration
limitedResources:
- resource: pods
matchScopes:
https://kubernetes.io/pt-br/docs/concepts/_print/ 15/178
5/14/22, 11:16 AM Conceitos | Kubernetes
- scopeName: PriorityClass
operator: In
values: ["cluster-services"]
policy/priority-class-resourcequota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-cluster-services
spec:
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: ["cluster-services"]
resourcequota/pods-cluster-services created
Uma solicitação de criação de pod é rejeitada caso seu priorityClassName estiver definido
como cluster-services e deve ser criado em um namespace diferente de kube-system .
Próximos passos
Veja o documento de design de cota de recursos para mais informações.
Veja um exemplo detalhado de como usar a cota de recursos.
Leia o documento de design de suporte de cota para prioridade de classe.
Veja recursos limitados
https://kubernetes.io/pt-br/docs/concepts/_print/ 16/178
5/14/22, 11:16 AM Conceitos | Kubernetes
3 - Visão Geral
Obtenha uma visão em alto-nível do Kubernetes e dos componentes a partir
dos quais ele é construído.
Voltando no tempo
Vamos dar uma olhada no porque o Kubernetes é tão útil, voltando no tempo.
Era da implantação virtualizada: Como solução, a virtualização foi introduzida. Esse modelo
permite que você execute várias máquinas virtuais (VMs) em uma única CPU de um servidor
físico. A virtualização permite que as aplicações sejam isoladas entre as VMs, e ainda fornece
um nível de segurança, pois as informações de uma aplicação não podem ser acessadas
livremente por outras aplicações.
Cada VM é uma máquina completa que executa todos os componentes, incluindo seu próprio
sistema operacional, além do hardware virtualizado.
Contêineres se tornaram populares porque eles fornecem benefícios extra, tais como:
É assim que o Kubernetes vem ao resgate! O Kubernetes oferece uma estrutura para
executar sistemas distribuídos de forma resiliente. Ele cuida do escalonamento e do
recuperação à falha de sua aplicação, fornece padrões de implantação e muito mais. Por
exemplo, o Kubernetes pode gerenciar facilmente uma implantação no método canário para
seu sistema.
https://kubernetes.io/pt-br/docs/concepts/_print/ 18/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Orquestração de armazenamento
O Kubernetes permite que você monte
automaticamente um sistema de armazenamento de sua escolha, como
armazenamentos locais, provedores de nuvem pública e muito mais.
Lançamentos e reversões automatizadas
Você pode descrever o estado desejado
para seus contêineres implantados usando o Kubernetes, e ele pode alterar o estado
real para o estado desejado em um ritmo controlada. Por exemplo, você pode
automatizar o Kubernetes para criar novos contêineres para sua implantação, remover
os contêineres existentes e adotar todos os seus recursos para o novo contêiner.
Empacotamento binário automático
Você fornece ao Kubernetes um cluster de nós
que pode ser usado para executar tarefas nos contêineres. Você informa ao Kubernetes
de quanta CPU e memória (RAM) cada contêiner precisa. O Kubernetes pode encaixar
contêineres em seus nós para fazer o melhor uso de seus recursos.
Autocorreção
O Kubernetes reinicia os contêineres que falham, substitui os
contêineres, elimina os contêineres que não respondem à verificação de integridade
definida pelo usuário e não os anuncia aos clientes até que estejam prontos para servir.
Gerenciamento de configuração e de segredos
O Kubernetes permite armazenar e
gerenciar informações confidenciais, como senhas, tokens OAuth e chaves SSH. Você
pode implantar e atualizar segredos e configuração de aplicações sem reconstruir suas
imagens de contêiner e sem expor segredos em sua pilha de configuração.
Kubernetes:
Não limita os tipos de aplicações suportadas. O Kubernetes visa oferecer suporte a uma
variedade extremamente diversa de cargas de trabalho, incluindo cargas de trabalho
sem estado, com estado e de processamento de dados. Se uma aplicação puder ser
executada em um contêiner, ele deve ser executado perfeitamente no Kubernetes.
Não implanta código-fonte e não constrói sua aplicação. Os fluxos de trabalho de
integração contínua, entrega e implantação (CI/CD) são determinados pelas culturas e
preferências da organização, bem como pelos requisitos técnicos.
Não fornece serviços em nível de aplicação, tais como middleware (por exemplo,
barramentos de mensagem), estruturas de processamento de dados (por exemplo,
Spark), bancos de dados (por exemplo, MySQL), caches, nem sistemas de
armazenamento em cluster (por exemplo, Ceph), como serviços integrados. Esses
componentes podem ser executados no Kubernetes e/ou podem ser acessados por
aplicações executadas no Kubernetes por meio de mecanismos portáteis, como o Open
Service Broker.
Não dita soluções de logging, monitoramento ou alerta. Ele fornece algumas integrações
como prova de conceito e mecanismos para coletar e exportar métricas.
Não fornece nem exige um sistema/idioma de configuração (por exemplo, Jsonnet). Ele
fornece uma API declarativa que pode ser direcionada por formas arbitrárias de
especificações declarativas.
Não fornece nem adota sistemas abrangentes de configuração de máquinas,
manutenção, gerenciamento ou autocorreção.
Adicionalmente, o Kubernetes não é um mero sistema de orquestração. Na verdade, ele
elimina a necessidade de orquestração. A definição técnica de orquestração é a
execução de um fluxo de trabalho definido: primeiro faça A, depois B e depois C. Em
contraste, o Kubernetes compreende um conjunto de processos de controle
independentes e combináveis que conduzem continuamente o estado atual em direção
ao estado desejado fornecido. Não importa como você vai de A para C. O controle
https://kubernetes.io/pt-br/docs/concepts/_print/ 19/178
5/14/22, 11:16 AM Conceitos | Kubernetes
centralizado também não é necessário. Isso resulta em um sistema que é mais fácil de
usar e mais poderoso, robusto, resiliente e extensível.
Próximos passos
Dê uma olhada em Componentes do Kubernetes.
Pronto para Iniciar?
https://kubernetes.io/pt-br/docs/concepts/_print/ 20/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Este documento descreve os vários componentes que você precisa ter para implantar um
cluster Kubernetes completo e funcional.
Kubernetes cluster
API server
api
Cloud controller
c-m
c-m c-c-m manager
c-c-m
c-m c-c-m (optional) c-c-m
Controller
manager c-m
etcd
api
Node Node (persistence store) etcd
api Node
api
kubelet
kubelet
sched
sched
sched
Scheduler
sched
Node
kube-apiserver
O servidor de API é um componente da Camada de gerenciamento do Kubernetes que expõe
a API do Kubernetes.
O servidor de API é o front end para a camada de gerenciamento do
Kubernetes.
https://kubernetes.io/pt-br/docs/concepts/_print/ 21/178
5/14/22, 11:16 AM Conceitos | Kubernetes
etcd
Armazenamento do tipo Chave-Valor consistente e em alta-disponibilidade usado como
repositório de apoio do Kubernetes para todos os dados do cluster.
Se o seu cluster Kubernetes usa etcd como seu armazenamento de apoio, certifique-se de ter
um plano de back up para seus dados.
Você pode encontrar informações detalhadas sobre o etcd na seção oficial da documentação.
kube-scheduler
Componente da camada de gerenciamento que observa os pods recém-criados sem nenhum
nó atribuído, e seleciona um nó para executá-los.
kube-controller-manager
Componente da camada de gerenciamento que executa os processos de controlador.
cloud-controller-manager
Um componente da camada de gerenciamento do Kubernetes
que incorpora a lógica de
controle específica da nuvem. O gerenciador de controle de nuvem permite que você vincule
seu
cluster na API do seu provedor de nuvem, e separar os componentes que interagem com
essa plataforma de nuvem a partir de componentes que apenas interagem com seu cluster.
O cloud-controller-manager executa apenas controladores que são específicos para seu
provedor de nuvem.
Se você estiver executando o Kubernetes em suas próprias instalações
ou em um ambiente de aprendizagem dentro de seu
próprio PC, o cluster não possui um
gerenciador de controlador de nuvem.
https://kubernetes.io/pt-br/docs/concepts/_print/ 22/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Node Components
Os componentes de nó são executados em todos os nós, mantendo os pods em execução e
fornecendo o ambiente de execução do Kubernetes.
kubelet
Um agente que é executado em cada node no cluster. Ele garante que os contêineres estejam
sendo executados em um Pod.
O kubelet utiliza um conjunto de PodSpecs que são fornecidos por vários mecanismos e
garante que os contêineres descritos nesses PodSpecs estejam funcionando corretamente. O
kubelet não gerencia contêineres que não foram criados pelo Kubernetes.
kube-proxy
kube-proxy é um proxy de rede executado em cada nó no seu cluster,
implementando parte
do conceito de serviço do Kubernetes.
kube-proxy
mantém regras de rede nos nós. Estas regras de rede permitem a comunicação
de rede com seus pods a partir de sessões de rede dentro ou fora de seu cluster.
Container runtime
O agente de execução (runtime) de contêiner é o software responsável por executar os
contêineres.
Addons
Complementos (addons) usam recursos do Kubernetes (DaemonSet, Deployment, etc) para
implementar funcionalidades do cluster. Como fornecem funcionalidades em nível do cluster,
recursos de addons que necessitem ser criados dentro de um namespace pertencem ao
namespace kube-system .
Alguns addons selecionados são descritos abaixo; para uma lista estendida dos addons
disponíveis, por favor consulte Addons.
DNS
Embora os outros complementos não sejam estritamente necessários, todos os clusters do
Kubernetes devem ter um DNS do cluster, já que muitos exemplos dependem disso.
O DNS do cluster é um servidor DNS, além de outros servidores DNS em seu ambiente, que
fornece registros DNS para serviços do Kubernetes.
Web UI (Dashboard)
Dashboard é uma interface de usuário Web, de uso geral, para clusters do Kubernetes. Ele
permite que os usuários gerenciem e solucionem problemas de aplicações em execução no
cluster, bem como o próprio cluster.
Próximos passos
Aprenda sobre Nós.
Aprenda sobre Controladores.
Aprenda sobre kube-scheduler.
Leia a documentação oficial do etcd.
https://kubernetes.io/pt-br/docs/concepts/_print/ 24/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Por exemplo, você pode ter apenas um Pod chamado "myapp-1234", porém você pode ter
um Pod
e um Deployment ambos com o nome "myapp-1234".
Para atributos não únicos providenciados por usuário, Kubernetes providencia labels e
annotations.
Nomes
Recursos Kubernetes podem ter nomes com até 253 caracteres. Os caracteres permitidos em
nomes são: dígitos (0-9), letras minúsculas (a-z), - , e . .
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
UIDs
Kubernetes UIDs são identificadores únicos universais (também chamados de UUIDs).
UUIDs
utilizam padrões ISO/IEC 9834-8 e ITU-T X.667.
Próximos passos
Leia sobre labels em Kubernetes.
Consulte o documento de design Identificadores e Nomes em Kubernetes.
https://kubernetes.io/pt-br/docs/concepts/_print/ 25/178
5/14/22, 11:16 AM Conceitos | Kubernetes
3.3.2 - Namespaces
No Kubernetes, namespaces disponibilizam um mecanismo para isolar grupos de recursos
dentro de um único cluster. Nomes de recursos precisam ser únicos dentro de um
namespace, porém podem se repetir em diferentes namespaces. Escopos baseados em
namespaces são aplicáveis apenas para objetos com namespace (como: Deployments, Services,
etc) e não em objetos que abrangem todo o cluster (como: StorageClass, Nodes,
PersistentVolumes, etc).
Namespaces oferecem escopo para nomes. Nomes de recursos precisam ser únicos dentro
de um namespace, porém não em diferentes namespaces. Namespaces não podem ser
aninhados dentro de outros namespaces e cada recurso Kubernetes pode pertencer à
apenas um namespace.
Namespaces nos permitem dividir os recursos do cluster entre diferentes usuários (via
resource quota).
Não é necessário utilizar múltiplos namespaces para separar recursos levemente diferentes,
como diferentes versões de um mesmo software: use labels para distinguir recursos dentro
de um mesmo namespace.
Nota: Evite criar namespaces com o prefixo kube-, já que este prefixo é reservado para
namespaces do sistema Kubernetes.
Visualizando namespaces
Você pode obter uma lista dos namespaces atuais dentro de um cluster com:
default Active 1d
kube-node-lease Active 1d
kube-public Active 1d
kube-system Active 1d
# Validando
Namespaces e DNS
Quando você cria um Serviço, ele cria uma
entrada DNS correspondente.
Esta entrada possui
o formato: <service-name>.<namespace-name>.svc.cluster.local , de forma que se um
contêiner utilizar apenas <service-name> ele será resolvido para um serviço que é local ao
namespace.
Isso é útil para utilizar a mesma configuração em vários namespaces, por
exemplo em Desenvolvimento, Staging e Produç. Se você quiser acessar múltiplos
namespaces, precisará utilizar um Fully Qualified Domain Name (FQDN).
Para visualizar quais recursos Kubernetes pertencem ou não a algum namespace, utilize:
# Em um namespace
# Sem namespace
Rotulamento Automático
FEATURE STATE: Kubernetes 1.21 [beta]
https://kubernetes.io/pt-br/docs/concepts/_print/ 27/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Próximos passos
Leia sobre a criação de um novo namespace.
Leia sobre a eliminação de um namespace.
https://kubernetes.io/pt-br/docs/concepts/_print/ 28/178
5/14/22, 11:16 AM Conceitos | Kubernetes
metadata.name=my-service
metadata.namespace!=default
status.phase=Pending
O comando kubectl , mostrado a seguir, seleciona todos os Pods nos quais o valor do campo
status.phase é Running :
Nota: Seletores de campos são essencialmente filtros de recursos. Por padrão, nenhum
seletor/filtro é aplicado, de forma que todos os recursos do tipo especificado são
selecionados. Isso faz com que as seguintes pesquisas utilizando kubectl sejam
equivalentes: kubectl get pods e kubectl get pods --field-selector ""
Campos suportados
Os campos de seleção suportados variam dependendo do tipo de recurso Kubernetes. Todos
os tipos de recursos suportam os campos metadata.name e metadata.namespace . Utilizar
campos não suportados produz um erro. Como por exemplo:
Error from server (BadRequest): Unable to find "ingresses" that match label selec
Operadores suportados
Você pode utilizar os operadores = , == e != com seletores de campos ( = e == significam
a mesma coisa). Por exemplo, o comando kubectl a seguir seleciona todos os Kubernetes
Services que não estão no namespace default :
Seletores em cadeia
Assim como label e outros tipos de seletores, podem ser utilizados em cadeia através de uma
lista separada por vírgula. O comando kubectl a seguir seleciona todos os Pods nos quais
status.phase não é igual a Running e spec.restartPolicy é igual a Always
https://kubernetes.io/pt-br/docs/concepts/_print/ 29/178
5/14/22, 11:16 AM Conceitos | Kubernetes
https://kubernetes.io/pt-br/docs/concepts/_print/ 30/178
5/14/22, 11:16 AM Conceitos | Kubernetes
4 - Volumes Persistentes
Esse documento descreve o estado atual dos volumes persistentes no Kubernetes. Sugerimos
que esteja familiarizado com volumes.
Introdução
O gerenciamento de armazenamento é uma questão bem diferente do gerenciamento de
instâncias computacionais. O subsistema PersistentVolume provê uma API para usuários e
administradores que mostra de forma detalhada de como o armazenamento é provido e
como ele é consumido. Para isso, nós introduzimos duas novas APIs: PersistentVolume e
PersistentVolumeClaim.
Um PersistentVolume (PV) é uma parte do armazenamento dentro do cluster que tenha sido
provisionada por um administrador, ou dinamicamente utilizando Classes de
Armazenamento. Isso é um recurso dentro do cluster da mesma forma que um nó também é.
PVs são plugins de volume da mesma forma que Volumes, porém eles têm um ciclo de vida
independente de qualquer Pod que utilize um PV. Essa API tem por objetivo mostrar os
detalhes da implementação do armazenamento, seja ele NFS, iSCSI, ou um armazenamento
específico de um provedor de cloud pública.
Provisionamento
Existem duas formas de provisionar um PV: estaticamente ou dinamicamente.
Estático
O administrador do cluster cria uma determinada quantidade de PVs. Eles possuem todos os
detalhes do armazenamento os quais estão atrelados, que neste caso fica disponível para
utilização por um usuário dentro do cluster. Eles estão presentes na API do Kubernetes e
disponíveis para utilização.
Dinâmico
Quando nenhum dos PVs estáticos, que foram criados anteriormente pelo administrador,
satisfazem os critérios de uma PersistentVolumeClaim enviado por um usuário, o cluster
pode tentar realizar um provisionamento dinâmico para atender a essa PVC. Esse
provisionamento é baseado em StorageClasses: a PVC deve solicitar uma classe de
https://kubernetes.io/pt-br/docs/concepts/_print/ 31/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Binding
Um usuário cria, ou em caso de um provisionamento dinâmico já ter criado, uma
PersistentVolumeClaim solicitando uma quantidade específica de armazenamento e um
determinado modo de acesso. Um controle de loop no master monitora por novas PVCs,
encontra um PV (se possível) que satisfaça os requisitos e realiza o bind. Se o PV foi
provisionado dinamicamente por uma PVC, o loop sempre vai fazer o bind desse PV com essa
PVC em específico. Caso contrário, o usuário vai receber no mínimo o que ele havia solicitado,
porém, o volume possa exceder em relação à solicitação inicial. Uma vez realizado esse
processo, PersistentVolumeClaim sempre vai ter um bind exclusivo, sem levar em conta
como o isso aconteceu. Um bind entre uma PVC e um PV é um mapeamento de um para um,
utilizando o ClaimRef que é um bind bidirecional entre o PersistentVolume e o
PersistentVolumeClaim.
As requisições permanecerão sem bind se o volume solicitado não existir. O bind ocorrerá
somente se os requisitos forem atendidos exatamente da mesma forma como solicitado. Por
exemplo, um bind de uma PVC de 100 GB não ocorrerá num cluster que foi provisionado com
vários PVs de 50 GB. O bind ocorrerá somente no momento em que um PV de 100 GB for
adicionado.
Utilização
Pods utilizam requisições como volumes. O cluster inspeciona a requisição para encontrar o
volume atrelado a ela e monta esse volume para um Pod. Para volumes que suportam
múltiplos modos de acesso, o usuário especifica qual o modo desejado quando utiliza essas
requisições.
Uma vez que o usuário tem a requisição atrelada a um PV, ele pertence ao usuário pelo
tempo que ele precisar. Usuários agendam Pods e acessam seus PVs requisitados através da
seção persistentVolumeClaim no bloco volumes do Pod. Para mais detalhes sobre isso, veja
Requisições como Volumes.
Nota: Uma PVC está sendo utilizada por um Pod quando existe um Pod que está usando
essa PVC.
Se um usuário deleta uma PVC que está sendo utilizada por um Pod, esta PVC não é
removida imediatamente. A remoção da PVC é adiada até que a PVC não esteja mais sendo
utilizado por nenhum Pod. Se um administrador deleta um PV que está atrelado a uma PVC, o
PV não é removido imediatamente também. A remoção do PV é adiada até que o PV não
esteja mais atrelado à PVC.
Note que uma PVC é protegida quando o status da PVC é Terminating e a lista Finalizers
contém kubernetes.io/pvc-protection :
https://kubernetes.io/pt-br/docs/concepts/_print/ 32/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Name: hostpath
Namespace: default
StorageClass: example-hostpath
Status: Terminating
Volume:
Labels: <none>
Annotations: volume.beta.kubernetes.io/storage-class=example-hostpath
volume.beta.kubernetes.io/storage-provisioner=example.com/hostpath
Finalizers: [kubernetes.io/pvc-protection]
...
Name: task-pv-volume
Labels: type=local
Annotations: <none>
Finalizers: [kubernetes.io/pv-protection]
StorageClass: standard
Status: Terminating
Claim:
Capacity: 1Gi
Message:
Source:
Path: /tmp/data
HostPathType:
Events: <none>
Recuperação
Quando um usuário não precisar mais utilizar um volume, ele pode deletar a PVC pela API,
que, permite a recuperação do recurso. A política de recuperação para um PersistentVolume
diz ao cluster o que fazer com o volume após ele ter sido liberado da sua requisição.
Atualmente, volumes podem ser Retidos, Reciclados ou Deletados.
Retenção
A política Retain permite a recuperação de forma manual do recurso. Quando a
PersistentVolumeClaim é deletada, ela continua existindo e o volume é considerado "livre".
Mas ele ainda não está disponível para outra requisição porque os dados da requisição
anterior ainda permanecem no volume. Um administrador pode manualmente recuperar o
volume executando os seguintes passos:
Deletar
Para plugins de volume que suportam a política de recuperação Delete , a deleção vai
remover o tanto o PersistentVolume do Kubernetes, quanto o armazenamento associado à
infraestrutura externa, como AWS EBS, GCE PD, Azure Disk, ou Cinder volume. Volumes que
foram provisionados dinamicamente herdam a política de retenção da sua StorageClass, que
https://kubernetes.io/pt-br/docs/concepts/_print/ 33/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Reciclar
Em caso do volume plugin ter suporte a essa operação, a política de retenção Recycle faz
uma limpeza básica ( rm -rf /thevolume/* ) no volume e torna ele disponível novamente
para outra requisição.
apiVersion: v1
kind: Pod
metadata:
name: pv-recycler
namespace: default
spec:
restartPolicy: Never
volumes:
- name: vol
hostPath:
path: /any/path/it/will/be/replaced
containers:
- name: pv-recycler
image: "k8s.gcr.io/busybox"
- name: vol
mountPath: /scrub
Reservando um PersistentVolume
A camada de gerenciamento pode fazer o bind de um PersistentVolumeClaims com
PersistentVolumes equivalentes no cluster. Contudo, se você quer que uma PVC faça um bind
com um PV específico, é preciso fazer o pré-bind deles.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: foo-pvc
namespace: foo
spec:
https://kubernetes.io/pt-br/docs/concepts/_print/ 34/178
5/14/22, 11:16 AM Conceitos | Kubernetes
...
Esse método não garante nenhum privilégio de bind no PersistentVolume. Para evitar que
alguma outra PersistentVolumeClaims possa usar o PV que você especificar, você precisa
primeiro reservar esse volume de armazenamento. Especifique sua PersistentVolumeClaim
no campo claimRef do PV para que outras PVCs não façam bind nele.
apiVersion: v1
kind: PersistentVolume
metadata:
name: foo-pv
spec:
storageClassName: ""
claimRef:
name: foo-pvc
namespace: foo
...
Isso é útil se você deseja utilizar PersistentVolumes que possuem suas claimPolicy
configuradas para Retain , incluindo situações onde você estiver reutilizando um PV
existente.
gcePersistentDisk
awsElasticBlockStore
Cinder
glusterfs
rbd
Azure File
Azure Disk
Portworx
FlexVolumes
CSI
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gluster-vol-default
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://192.168.10.100:8080"
restusuário: ""
secretNamespace: ""
secretName: ""
allowVolumeExpansion: true
https://kubernetes.io/pt-br/docs/concepts/_print/ 35/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Para solicitar um volume maior para uma PVC, edite a PVC e especifique um tamanho maior.
Isso irá fazer com o que volume atrelado ao respectivo PersistentVolume seja expandido.
Nunca um PersistentVolume é criado para satisfazer a requisição. Ao invés disso, um volume
existente é redimensionado.
O suporte à expansão de volumes CSI é habilitada por padrão, porém é necessário um driver
CSI específico para suportar a expansão do volume. Verifique a documentação do driver CSI
específico para mais informações.
Nota: A Expansão de PVCs em uso está disponível como beta desde o Kubernetes 1.15, e
como alpha desde a versão 1.11. A funcionalidade ExpandInUsePersistentVolumes
precisa ser habilitada, o que já está automático para vários clusters que possuem
funcionalidades beta. Verifique a documentação feature gate para mais informações.
Neste caso, você não precisa deletar e recriar um Pod ou um deployment que está sendo
utilizado por uma PVC existente.
Automaticamente, qualquer PVC em uso fica disponível para
o Pod assim que o sistema de arquivo for expandido.
Essa funcionalidade não tem efeito em
PVCs que não estão em uso por um Pod ou deployment. Você deve criar um Pod que utilize a
PVC antes que a expansão seja completada.
Da mesma forma que outros tipos de volumes - volumes FlexVolume também podem ser
expandidos quando estiverem em uso por um Pod.
Nota: Expandir volumes do tipo EBS é uma operação que toma muito tempo. Além disso,
só é possível fazer uma modificação por volume a cada 6 horas.
https://kubernetes.io/pt-br/docs/concepts/_print/ 36/178
5/14/22, 11:16 AM Conceitos | Kubernetes
2. Delete a PVC. Desde que o PV tenha a política de recuperação Retain - nenhum dado
será perdido quando a PVC for recriada.
3. Delete a entrada claimRef da especificação do PV para que uma PVC possa fazer bind
com ele. Isso deve tornar o PV Available .
4. Recrie a PVC com um tamanho menor que o PV e configure o campo volumeName da
PCV com o nome do PV. Isso deve fazer o bind de uma nova PVC a um PV existente.
5. Não esqueça de restaurar a política de recuperação do PV.
flexVolume - FlexVolume
Volumes Persistentes
Cada PV contém uma spec e um status, que é a especificação e o status do volume. O nome
do PersistentVolume deve ser um DNS válido.
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: slow
mountOptions:
https://kubernetes.io/pt-br/docs/concepts/_print/ 37/178
5/14/22, 11:16 AM Conceitos | Kubernetes
- hard
- nfsvers=4.1
nfs:
path: /tmp
server: 172.17.0.2
Capacidade
Geralmente, um PV terá uma capacidade de armazenamento específica. Isso é configurado
usando o atributo capacity do PV. Veja o Modelo de Recurso do Kubernetes para entender
as unidades aceitas pelo atributo capacity .
Modo do Volume
FEATURE STATE: Kubernetes v1.18 [stable]
Você pode configurar o valor do volumeMode para Block para utilizar um disco bruto como
volume. Esse volume é apresentado num Pod como um dispositivo de bloco, sem nenhum
sistema de arquivo. Esse modo é útil para prover ao Pod a forma mais rápida para acessar
um volume, sem nenhuma camada de sistema de arquivo entre o Pod e o volume. Por outro
lado, a aplicação que estiver rodando no Pod deverá saber como tratar um dispositivo de
bloco. Veja Suporte a Volume de Bloco Bruto para um exemplo de como utilizar o volume
como volumeMode: Block num Pod.
Modos de Acesso
Um PersistentVolume pode ser montado num host das mais variadas formas suportadas pelo
provedor. Como mostrado na tabela abaixo, os provedores terão diferentes capacidades e
cada modo de acesso do PV são configurados nos modos específicos suportados para cada
volume em particular. Por exemplo, o NFS pode suportar múltiplos clientes read/write, mas
um PV NFS específico pode ser exportado no server como read-only. Cada PV recebe seu
próprio modo de acesso que descreve suas capacidades específicas.
RWO - ReadWriteOnce
ROX - ReadOnlyMany
RWX - ReadWriteMany
https://kubernetes.io/pt-br/docs/concepts/_print/ 38/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Importante! Um volume somente pode ser montado utilizando um único modo de acesso
por vez, independente se ele suportar mais de um. Por exemplo, um GCEPersistentDisk
pode ser montado como ReadWriteOnce por um único nó ou ReadOnlyMany por vários
nós, porém não simultaneamente.
Plugin de
Volume ReadWriteOnce ReadOnlyMany ReadWriteMany
AWSElasticBloc ✓ - -
kStore
AzureFile ✓ ✓ ✓
AzureDisk ✓ - -
CephFS ✓ ✓ ✓
Cinder ✓ - -
FC ✓ ✓ -
Flocker ✓ - -
GCEPersistentD ✓ ✓ -
isk
Glusterfs ✓ ✓ ✓
HostPath ✓ - -
iSCSI ✓ ✓ -
Quobyte ✓ ✓ ✓
NFS ✓ ✓ ✓
RBD ✓ ✓ -
PortworxVolum ✓ - ✓
e
ScaleIO ✓ ✓ -
StorageOS ✓ - -
Classe
Um PV pode ter uma classe, que é especificada na configuração do atributo
storageClassName com o nome da StorageClass. Um PV de uma classe específica só pode ser
atrelado a requisições PVCs dessa mesma classe. Um PV sem storageClassName não possui
nenhuma classe e pode ser montado somente a PVCs que não solicitem nenhuma classe em
específico.
https://kubernetes.io/pt-br/docs/concepts/_print/ 39/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Política de Retenção
Atualmente as políticas de retenção são:
Atualmente, somente NFS e HostPath suportam reciclagem. Volumes AWS EBS, GCE PD,
Azure Disk e Cinder suportam delete.
Opções de Montagem
Um administrador do Kubernetes pode especificar opções de montagem adicionais quando
um Volume Persistente é montado num nó.
AWSElasticBlockStore
AzureDisk
AzureFile
CephFS
Cinder (OpenStack block storage)
GCEPersistentDisk
Glusterfs
NFS
Quobyte Volumes
RBD (Ceph Block Device)
StorageOS
VsphereVolume
iSCSI
Afinidade de Nó
Nota: Para a maioria dos tipos de volume, a configuração desse campo não se faz
necessária. Isso é automaticamente populado pelos seguintes volumes de bloco do tipo:
AWS EBS, GCE PD e Azure Disk. Você precisa deixar isso configurado para volumes do
tipo local.
https://kubernetes.io/pt-br/docs/concepts/_print/ 40/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Estado
Um volume sempre estará em um dos seguintes estados:
Available -- um recurso que está livre e ainda não foi atrelado a nenhuma requisição
Bound -- um volume atrelado a uma requisição
Released -- a requisição foi deletada, mas o curso ainda não foi recuperado pelo cluster
Failed -- o volume fracassou na sua recuperação automática
PersistentVolumeClaims
Cada PVC contém uma spec e um status, que é a especificação e estado de uma requisição.
O nome de um objeto PersistentVolumeClaim precisa ser um DNS válido.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 8Gi
storageClassName: slow
selector:
matchLabels:
release: "stable"
matchExpressions:
Modos de Acesso
As requisições usam as mesmas convenções que os volumes quando eles solicitam um
armazenamento com um modo de acesso específico.
Modos de Volume
As requisições usam as mesmas convenções que os volumes quando eles indicam o tipo de
volume, seja ele um sistema de arquivo ou dispositivo de bloco.
Recursos
Assim como Pods, as requisições podem solicitar quantidades específicas de recurso. Neste
caso, a solicitação é por armazenamento. O mesmo modelo de recurso vale para volumes e
requisições.
Seletor
Requisições podem especifiar um seletor de rótulo para posteriormente filtrar um grupo de
volumes. Somente os volumes que possuam rótulos que satisfaçam os critérios do seletor
podem ser atrelados à requisição. O seletor pode conter dois campos:
https://kubernetes.io/pt-br/docs/concepts/_print/ 41/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Classe
Uma requisição pode solicitar uma classe específica através da StorageClass utilizando o
atributo storageClassName . Neste caso o bind ocorrerá somente com os PVs que possuírem
a mesma classe do storageClassName dos PVCs.
As PVCs não precisam necessariamente solicitar uma classe. Uma PVC com sua
storageClassName configurada como "" sempre solicitará um PV sem classe, dessa forma
ela sempre será atrelada a um PV sem classe (que não tenha nenhuma notação, ou seja, igual
a "" ). Uma PVC sem storageClassName não é a mesma coisa e será tratada pelo cluster de
forma diferente, porém isso dependerá se o puglin de admissão DefaultStorageClass
estiver habilitado.
Dependendo do modo de instalação, uma StorageClass padrão pode ser implantada num
cluster Kubernetes durante a instalação pelo addon manager.
Quando uma PVC especifica um selector para solicitar uma StorageClass, os requisitos são
do tipo AND: somente um PV com a classe solicitada e com o rótulo requisitado pode ser
atrelado à PVC.
Nota: Atualmente, uma PVC que tenha selector não pode ter um PV dinamicamente
provisionado.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
https://kubernetes.io/pt-br/docs/concepts/_print/ 42/178
5/14/22, 11:16 AM Conceitos | Kubernetes
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim
Sobre Namespaces
Os binds dos PersistentVolumes são exclusivos e, desde que as PersistentVolumeClaims são
objetos do namespace, fazer a montagem das requisições com "Muitos" nós ( ROX , RWX ) é
possível somente para um namespace.
AWSElasticBlockStore
AzureDisk
CSI
FC (Fibre Channel)
GCEPersistentDisk
iSCSI
Local volume
OpenStack Cinder
RBD (Ceph Block Device)
VsphereVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: block-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
volumeMode: Block
persistentVolumeReclaimPolicy: Retain
fc:
targetWWNs: ["50060e801049cfd1"]
lun: 0
readOnly: false
apiVersion: v1
https://kubernetes.io/pt-br/docs/concepts/_print/ 43/178
5/14/22, 11:16 AM Conceitos | Kubernetes
kind: PersistentVolumeClaim
metadata:
name: block-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
resources:
requests:
storage: 10Gi
apiVersion: v1
kind: Pod
metadata:
name: pod-with-block-volume
spec:
containers:
- name: fc-container
image: fedora:26
volumeDevices:
- name: data
devicePath: /dev/xvda
volumes:
- name: data
persistentVolumeClaim:
claimName: block-pvc
Nota: Quando adicionar um dispositivo de bloco bruto num Pod, você especifica o
caminho do dispositivo no contêiner ao invés de um ponto de montagem.
https://kubernetes.io/pt-br/docs/concepts/_print/ 44/178
5/14/22, 11:16 AM Conceitos | Kubernetes
O snapshot de volume é suportado somente pelo plugin de volume CSI. Veja Snapshot de
Volume para mais detalhes.
Plugins de volume in-tree estão depreciados. Você pode
consultar sobre os plugins de volume depreciados em Perguntas Frequentes sobre Plugins de
Volume.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restore-pvc
spec:
storageClassName: csi-hostpath-sc
dataSource:
name: new-snapshot-test
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Clonagem de Volume
A Clonagem de Volume é possível somente com plugins de volume CSI.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cloned-pvc
spec:
storageClassName: my-csi-plugin
dataSource:
name: existing-src-pvc-name
kind: PersistentVolumeClaim
accessModes:
- ReadWriteOnce
https://kubernetes.io/pt-br/docs/concepts/_print/ 45/178
5/14/22, 11:16 AM Conceitos | Kubernetes
resources:
requests:
storage: 10Gi
Não inclua objetos PersistentVolume na configuração, pois o usuário que irá instanciar a
configuração talvez não tenha permissão para criar PersistentVolume.
Próximos passos
Saiba mais sobre Criando um PersistentVolume.
Saiba mais sobre Criando um PersistentVolumeClaim.
Leia a documentação sobre planejamento de Armazenamento Persistente.
Referência
PersistentVolume
PersistentVolumeSpec
PersistentVolumeClaim
https://kubernetes.io/pt-br/docs/concepts/_print/ 46/178
5/14/22, 11:16 AM Conceitos | Kubernetes
5 - Arquitetura do Kubernetes
5.1 - Comunicação entre Nó e Control
Plane
Este documento cataloga os caminhos de comunicação entre o control plane (o
apiserver) e o
cluster Kubernetes. A intenção é permitir que os usuários
personalizem sua instalação para
proteger a configuração de rede
então o cluster pode ser executado em uma rede não
confiável (ou em IPs totalmente públicos em um
provedor de nuvem).
Os nós devem ser provisionados com o certificado root público para o cluster
de tal forma
que eles podem se conectar de forma segura ao apiserver junto com o cliente válido
credenciais. Por exemplo, em uma implantação padrão do GKE, as credenciais do cliente
fornecidos para o kubelet estão na forma de um certificado de cliente. Vejo
bootstrapping
TLS do kubelet
para provisionamento automatizado de certificados de cliente kubelet.
Os pods que desejam se conectar ao apiserver podem fazê-lo com segurança, aproveitando
conta de serviço para que o Kubernetes injetará automaticamente o certificado raiz público
certificado e um token de portador válido no pod quando ele é instanciado.
O serviço
kubernetes (no namespace default ) é configurado com um IP virtual
endereço que é
redirecionado (via kube-proxy) para o endpoint com HTTPS no
apiserver.
SSH Túnel
O Kubernetes suporta túneis SSH para proteger os caminhos de comunicação do control
plane para os nós. Nesta configuração, o apiserver inicia um túnel SSH para cada nó
no
cluster (conectando ao servidor ssh escutando na porta 22) e passa
todo o tráfego destinado
a um kubelet, nó, pod ou serviço através do túnel.
Este túnel garante que o tráfego não seja
exposto fora da rede aos quais
os nós estão sendo executados.
Atualmente, os túneis SSH estão obsoletos, portanto, você não deve optar por usá-los, a
menos que saiba o que está fazendo. O serviço Konnectivity é um substituto para este canal
de comunicação.
Konnectivity service
FEATURE STATE: Kubernetes v1.18 [beta]
Como uma substituição aos túneis SSH, o serviço Konnectivity fornece proxy de nível TCP
para a comunicação do control plane para o cluster. O serviço Konnectivity consiste em duas
partes: o servidor Konnectivity na rede control plane e os agentes Konnectivity na rede dos
nós. Os agentes Konnectivity iniciam conexões com o servidor Konnectivity e mantêm as
conexões de rede. Depois de habilitar o serviço Konnectivity, todo o tráfego do control plane
para os nós passa por essas conexões.
https://kubernetes.io/pt-br/docs/concepts/_print/ 48/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Este documento discute os conceitos por trás do Cloud Controller Manager e fornece
detalhes sobre suas funções associadas.
Kubelet
Kubernetes controller manager
Kubernetes API server
O CCM consolida toda a lógica que depende da nuvem dos três componentes anteriores para
criar um único ponto de integração com a nuvem. A nova arquitetura com o CCM se parece
com isso:
Componentes do CCM
https://kubernetes.io/pt-br/docs/concepts/_print/ 49/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Node controller
Volume controller
Route controller
Service controller
Node controller
Route controller
Service controller
Nota: O Volume Controller foi deliberadamente escolhido para não fazer parte do CCM.
Devido à complexidade envolvida e devido aos esforços existentes para abstrair a lógica
de volume específica do fornecedor, foi decidido que o Volume Controller não será
movido para o CCM.
O plano original para suportar volumes usando o CCM era usar volumes Flex para suportar
volumes plugáveis. No entanto, um esforço concorrente conhecido como CSI está sendo
planejado para substituir o Flex.
Considerando essas dinâmicas, decidimos ter uma medida de intervalo intermediário até que
o CSI esteja pronto.
Funções do CCM
O CCM herda suas funções de componentes do Kubernetes que são dependentes de um
provedor de nuvem. Esta seção é estruturada com base nesses componentes.
Node Controller
Route Controller
Service Controller
Node Controller
O Node Controller é responsável por inicializar um nó obtendo informações sobre os nós em
execução no cluster do provedor de nuvem. O Node Controller executa as seguintes funções:
Route Controller
O Route Controller é responsável por configurar as rotas na nuvem apropriadamente, de
modo que os contêineres em diferentes nodes no cluster do Kubernetes possam se
comunicar entre si. O Route Controller é aplicável apenas para clusters do Google Compute
Engine.
https://kubernetes.io/pt-br/docs/concepts/_print/ 50/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Service controller
O Service controller é responsável por ouvir os eventos de criação, atualização e exclusão do
serviço. Com base no estado atual dos serviços no Kubernetes, ele configura os
balanceadores de carga da nuvem (como o ELB, o Google LB ou o Oracle Cloud Infrastrucutre
LB) para refletir o estado dos serviços no Kubernetes. Além disso, garante que os back-ends
de serviço para balanceadores de carga da nuvem estejam atualizados.
2. Kubelet
O Node Controller contém a funcionalidade dependente da nuvem do kubelet. Antes da
introdução do CCM, o kubelet era responsável por inicializar um nó com detalhes específicos
da nuvem, como endereços IP, rótulos de região / zona e informações de tipo de instância. A
introdução do CCM mudou esta operação de inicialização do kubelet para o CCM.
Mecanismo de plugins
O Cloud Controller Manager usa interfaces Go para permitir implementações de qualquer
nuvem a ser conectada. Especificamente, ele usa a Interface CloudProvider definidaaqui.
Autorização
Esta seção divide o acesso necessário em vários objetos da API pelo CCM para executar suas
operações.
Node Controller
O Node Controller só funciona com objetos Node. Ele requer acesso total para obter, listar,
criar, atualizar, corrigir, assistir e excluir objetos Node.
v1/Node:
Get
List
Create
Update
Patch
Watch
Delete
Rote Controller
O Rote Controller escuta a criação do objeto Node e configura as rotas apropriadamente. Isso
requer acesso a objetos Node.
v1/Node:
https://kubernetes.io/pt-br/docs/concepts/_print/ 51/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Get
Service Controller
O Service Controller escuta eventos de criação, atualização e exclusão de objeto de serviço e,
em seguida, configura pontos de extremidade para esses serviços de forma apropriada.
Para acessar os Serviços, é necessário listar e monitorar o acesso. Para atualizar os Serviços,
ele requer patch e atualização de acesso.
Para configurar endpoints para os Serviços, é necessário acesso para criar, listar, obter,
assistir e atualizar.
v1/Service:
List
Get
Watch
Patch
Update
Outros
A implementação do núcleo do CCM requer acesso para criar eventos e, para garantir a
operação segura, requer acesso para criar ServiceAccounts.
v1/Event:
Create
Patch
Update
v1/ServiceAccount:
Create
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cloud-controller-manager
rules:
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- update
- apiGroups:
- ""
resources:
- nodes
verbs:
- '*'
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
- apiGroups:
- ""
resources:
- services
https://kubernetes.io/pt-br/docs/concepts/_print/ 52/178
5/14/22, 11:16 AM Conceitos | Kubernetes
verbs:
- list
- patch
- update
- watch
- apiGroups:
- ""
resources:
- serviceaccounts
verbs:
- create
- apiGroups:
- ""
resources:
- persistentvolumes
verbs:
- get
- list
- update
- watch
- apiGroups:
- ""
resources:
- endpoints
verbs:
- create
- get
- list
- watch
- update
Digital Ocean
Oracle
Azure
GCP
AWS
BaiduCloud
Linode
Administração de Cluster
Voce vai encontrar instruções completas para configurar e executar o CCM
aqui.
https://kubernetes.io/pt-br/docs/concepts/_print/ 53/178
5/14/22, 11:16 AM Conceitos | Kubernetes
5.3 - Controladores
Em robótica e automação um control loop, ou em português ciclo de controle, é
um ciclo não
terminado que regula o estado de um sistema.
Quando o controlador Job observa uma nova tarefa ele garante que,
algures no seu cluster, os
kubelets num conjunto de nós (Nodes) estão correndo o número
correto de Pods para
completar o trabalho.
O controlador Job não corre Pods ou containers ele próprio.
Em vez
disso, o controlador Job informa o API server para criar ou remover Pods.
Outros componentes
do plano de controle
(control plane)
atuam na nova informação (existem novos Pods para
serem agendados e executados),
e eventualmente o trabalho é feito.
Após ter criado um novo Job, o estado desejado é que esse Job seja completado.
O controlador
Job faz com que o estado atual para esse Job esteja mais perto do seu
estado desejado: criando
Pods que fazem o trabalho desejado para esse Job para que
o Job fique mais perto de ser
completado.
Controle direto
Em contraste com Job, alguns controladores necessitam de efetuar
mudanças fora do cluster.
https://kubernetes.io/pt-br/docs/concepts/_print/ 54/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Controladores que interagem com estados externos encontram o seu estado desejado
a
partir do API server, e então comunicam diretamente com o sistema externo para
trazer o
estado atual mais próximo do desejado.
O seu cluster pode mudar em qualquer momento à medida que as ações acontecem e
os
ciclos de controle corrigem falhas automaticamente. Isto significa que,
potencialmente, o seu
cluster nunca atinge um estado estável.
Design
Como um princípio do seu desenho, o Kubernetes usa muitos controladores onde cada
um
gerencia um aspecto particular do estado do cluster. Comumente, um particular
ciclo de
controle (controlador) usa uma espécie de recurso como o seu estado desejado,
e tem uma
espécie diferente de recurso que o mesmo gere para garantir que esse estado desejado
é
cumprido.
É útil que haja controladores simples em vez de um conjunto monolítico de ciclos de controle
que estão interligados. Controladores podem falhar, então o Kubernetes foi desenhado para
permitir isso.
Nota:
Podem existir vários controladores que criam ou atualizam a mesma espécie (kind) de
objeto.
Atrás das cortinas, os controladores do Kubernetes garantem que eles apenas
tomam
atenção aos recursos ligados aos seus recursos controladores.
Por exemplo, você pode ter Deployments e Jobs; ambos criam Pods.
O controlador de Job
não apaga os Pods que o seu Deployment criou,
porque existe informação (labels)
que os
controladores podem usar para diferenciar esses Pods.
https://kubernetes.io/pt-br/docs/concepts/_print/ 55/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Próximos passos
Leia mais sobre o plano de controle do Kubernetes
Descubra alguns dos objetos Kubernetes básicos.
Aprenda mais sobre API do Kubernetes
Se pretender escrever o seu próprio controlador, veja Padrões de Extensão
https://kubernetes.io/pt-br/docs/concepts/_print/ 56/178
5/14/22, 11:16 AM Conceitos | Kubernetes
6 - Contêineres
Tecnologia para empacotar aplicações com suas dependências em tempo de
execução
Imagem de contêiner
Uma imagem de contêiner é um pacote de software pronto para executar, contendo tudo
que é preciso para executar uma aplicação:
o código e o agente de execução necessário,
aplicação, bibliotecas do sistema e valores padrões para qualquer configuração essencial.
Por design, um contêiner é imutável: você não pode mudar o código de um contêiner que já
está executando. Se você tem uma aplicação conteinerizada e quer fazer mudanças, você
precisa construir uma nova imagem que inclui a mudança, e recriar o contêiner para iniciar a
partir da imagem atualizada.
Próximos passos
Imagens de contêineres
Pods
https://kubernetes.io/pt-br/docs/concepts/_print/ 57/178
5/14/22, 11:16 AM Conceitos | Kubernetes
6.1 - Imagens
Uma imagem de contêiner representa dados binários que encapsulam uma aplicação e todas
as suas dependências de software. As imagens de contêiner são pacotes de software
executáveis que podem ser executados de forma autônoma e que fazem suposições muito
bem definidas sobre seu agente de execução do ambiente.
Normalmente, você cria uma imagem de contêiner da sua aplicação e a envia para um
registro antes de fazer referência a ela em um Pod
Se você não especificar um hostname de registro, o Kubernetes presumirá que você se refere
ao registro público do Docker.
Após a parte do nome da imagem, você pode adicionar uma tag (como também usar com
comandos como docker e podman ).
As tags permitem identificar diferentes versões da
mesma série de imagens.
Cuidado:
Você deve evitar usar a tag latest quando estiver realizando o deploy de contêineres
em produção,
pois é mais difícil rastrear qual versão da imagem está sendo executada,
além de tornar mais difícil o processo de reversão para uma versão funcional.
Atualizando imagens
A política padrão de pull é IfNotPresent a qual faz com que o
kubelet ignore
o processo de
pull da imagem, caso a mesma já exista. Se você prefere sempre forçar o processo de pull,
você pode seguir uma das opções abaixo:
Quando imagePullPolicy é definido sem um valor específico, ele também é definido como
Always .
https://kubernetes.io/pt-br/docs/concepts/_print/ 58/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Além de fornecer o binário das imagens, um registro de contêiner também pode servir um
índice de imagem do contêiner. Um índice de imagem pode apontar para múltiplos
manifestos da imagem para versões específicas de arquitetura de um contêiner. A ideia é que
você possa ter um nome para uma imagem (por exemplo: pause , exemple/meuconteiner ,
kube-apiserver ) e permitir que diferentes sistemas busquem o binário da imagem correta
para a arquitetura de máquina que estão usando.
Se você executar o Docker em seus nós, poderá configurar o contêiner runtime do Docker
para autenticação em um registro de contêiner privado.
{--root-dir:-/var/lib/kubelet}/config.json
{cwd of kubelet}/config.json
${HOME}/.docker/config.json
/.docker/config.json
{--root-dir:-/var/lib/kubelet}/.dockercfg
{cwd of kubelet}/.dockercfg
${HOME}/.dockercfg
/.dockercfg
https://kubernetes.io/pt-br/docs/concepts/_print/ 59/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Nota: Você talvez tenha que definir HOME=/root explicitamente no ambiente do processo
kubelet.
Aqui estão as etapas recomendadas para configurar seus nós para usar um registro privado.
Neste
exemplo, execute-os em seu desktop/laptop:
1. Execute docker login [servidor] para cada conjunto de credenciais que deseja usar.
Isso atualiza o $HOME/.docker/config.json em seu PC.
2. Visualize $HOME/.docker/config.json em um editor para garantir que contém apenas
as credenciais que você deseja usar.
3. Obtenha uma lista de seus nós; por exemplo:
se você quiser os nomes: nodes=$( kubectl get nodes -o
jsonpath='{range.items[*].metadata}{.name} {end}' )
4. Copie seu .docker/config.json local para uma das listas de caminhos de busca acima.
por exemplo, para testar isso: for n in $nodes; do scp ~/.docker/config.json
root@"$n":/var/lib/kubelet/config.json; done
Verifique se está funcionando criando um pod que usa uma imagem privada; por exemplo:
apiVersion: v1
kind: Pod
metadata:
name: private-image-test-1
spec:
containers:
- name: uses-private-image
image: $PRIVATE_IMAGE_NAME
imagePullPolicy: Always
EOF
pod/private-image-test-1 created
Se tudo estiver funcionando, então, após algum tempo, você pode executar:
SUCCESS
Fri, 26 Jun 2015 15:36:13 -0700 Fri, 26 Jun 2015 15:39:13 -0700 19 {ku
Você deve garantir que todos os nós no cluster tenham o mesmo .docker/config.json .
Caso contrário, os pods serão executados com sucesso em alguns nós e falharão em outros.
Por exemplo, se você usar o escalonamento automático de nós, cada modelo de instância
precisa incluir o .docker/config.json ou montar um drive que o contenha.
Todos os pods terão premissão de leitura às imagens em qualquer registro privado, uma vez
que
as chaves privadas do registro são adicionadas ao .docker/config.json .
Imagens pré-obtidas
Nota: Essa abordagem é adequada se você puder controlar a configuração do nó. Isto
não funcionará de forma confiável se o seu provedor de nuvem for responsável pelo
gerenciamento de nós e os substituir
automaticamente.
Por padrão, o kubelet tenta realizar um "pull" para cada imagem do registro especificado.
No
entanto, se a propriedade imagePullPolicy do contêiner for definida como IfNotPresent
ou Never ,
em seguida, uma imagem local é usada (preferencial ou exclusivamente,
respectivamente).
Se você quiser usar imagens pré-obtidas como um substituto para a autenticação do registro,
você deve garantir que todos os nós no cluster tenham as mesmas imagens pré-obtidas.
Isso pode ser usado para pré-carregar certas imagens com o intuíto de aumentar a
velocidade ou como uma alternativa para autenticação em um registro privado.
Isso é particularmente útil se você estiver usando vários registros privados de contêineres,
como kubectl create secret docker-registry cria um Segredo que
só funciona com um
único registro privado.
Nota: Os pods só podem fazer referência a pull secrets de imagem em seu próprio
namespace,
portanto, esse processo precisa ser feito uma vez por namespace.
https://kubernetes.io/pt-br/docs/concepts/_print/ 61/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Por exemplo:
apiVersion: v1
kind: Pod
metadata:
name: foo
namespace: awesomeapps
spec:
containers:
- name: foo
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistrykey
EOF
resources:
- pod.yaml
EOF
Isso precisa ser feito para cada pod que está usando um registro privado.
Você pode usar isso em conjunto com um .docker / config.json por nó. As credenciais
serão mescladas.
Casos de uso
Existem várias soluções para configurar registros privados. Aqui estão alguns
casos de uso
comuns e soluções sugeridas.
1. Cluster executando apenas imagens não proprietárias (por exemplo, código aberto).
Não há necessidade de ocultar imagens.
Use imagens públicas no Docker hub.
Nenhuma configuração necessária.
Alguns provedores de nuvem armazenam em cache ou espelham
automaticamente imagens públicas, o que melhora a disponibilidade e reduz
o tempo para extrair imagens.
2. Cluster executando algumas imagens proprietárias que devem ser ocultadas para quem
está fora da empresa, mas
visível para todos os usuários do cluster.
Use um registro Docker privado hospedado.
Pode ser hospedado no Docker Hub ou em outro lugar.
Configure manualmente .docker/config.json em cada nó conforme descrito
acima.
Ou execute um registro privado interno atrás de seu firewall com permissão de
leitura.
Nenhuma configuração do Kubernetes é necessária.
Use um serviço de registro de imagem de contêiner que controla o acesso à
imagem
Funcionará melhor com o escalonamento automático do cluster do que com
a configuração manual de nós.
https://kubernetes.io/pt-br/docs/concepts/_print/ 62/178
5/14/22, 11:16 AM Conceitos | Kubernetes
3. Cluster com imagens proprietárias, algumas das quais requerem controle de acesso
mais rígido.
Certifique-se de que o controlador de admissão AlwaysPullImages está ativo. Caso
contrário, todos os pods têm potencialmente acesso a todas as imagens.
Mova dados confidenciais para um recurso "secreto", em vez de empacotá-los em
uma imagem.
4. Um cluster multilocatário em que cada locatário precisa de seu próprio registro privado.
Certifique-se de que o controlador de admissão AlwaysPullImages está ativo. Caso
contrário, todos os Pods de todos os locatários terão potencialmente acesso a
todas as imagens.
Execute um registro privado com autorização necessária.
Gere credenciais de registro para cada locatário, coloque em segredo e preencha o
segredo para cada namespace de locatário.
O locatário adiciona esse segredo a imagePullSecrets de cada namespace.
Se precisar de acesso a vários registros, você pode criar um segredo para cada registro.
O
Kubelet mesclará qualquer imagePullSecrets em um único .docker/config.json virtual
Próximos passos
Leia a OCI Image Manifest Specification
https://kubernetes.io/pt-br/docs/concepts/_print/ 63/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Ambiente de contêiner
O ambiente de contêiner do Kubernetes fornece recursos importantes para contêineres:
Informação de contêiner
O hostname de um contêiner é o nome do Pod em que o contêiner está executando.
Isso é
disponibilizado através do comando hostname ou da função gethostname chamada na libc.
Variáveis de ambiente definidas pelo usuário a partir da definição do Pod também são
disponíveis para o contêiner, assim como qualquer variável de ambiente especificada
estáticamente na imagem Docker.
Informação do cluster
Uma lista de todos os serviços que estão executando quando um contêiner foi criado é
disponibilizada para o contêiner como variáveis de ambiente.
Essas variáveis de ambiente são
compatíveis com a funcionalidade docker link do Docker.
Para um serviço nomeado foo que mapeia para um contêiner nomeado bar, as seguintes
variáveis são definidas:
Serviços possuem endereço IP dedicado e são disponibilizados para o contêiner via DNS,
se
possuírem DNS addon habilitado.
Próximos passos
Aprenda mais sobre hooks de ciclo de vida do contêiner.
Obtenha experiência prática
anexando manipuladores a eventos de ciclo de vida do
contêiner.
https://kubernetes.io/pt-br/docs/concepts/_print/ 64/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Motivação
Você pode configurar um RuntimeClass diferente entre os diferentes Pods para prover
um
equilíbrio entre performance versus segurança. Por exemplo, se parte de sua carga de
trabalho necessita de um alto nível de garantia de segurança da informação, você pode
optar
em executar esses Pods em um agente de execução que usa virtualização de hardware.
Você
então terá o benefício do isolamento extra de um agente de execução alternativo, ao
custo
de uma latência adicional.
Você pode ainda usar um RuntimeClass para executar diferentes Pods com o mesmo agente
de execução de contêineres mas com diferentes configurações.
Configuração
1. Configure a implementação do CRI nos nós (depende do agente de execução)
2. Crie o recurso RuntimeClass correspondente.
Nota: RuntimeClass assume uma configuração homogênea de nós entre todo o cluster
por padrão
(o que significa que todos os nós estão configurados do mesmo jeito
referente aos agentes de
execução). Para suportar configurações heterogêneas, veja
Associação abaixo.
metadata:
https://kubernetes.io/pt-br/docs/concepts/_print/ 65/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Uso
Uma vez que as classes de execução estão configuradas no cluster, usar elas é relativamente
simples. Especifique um runtimeClassName na especificação do Pod. Por exemplo:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
runtimeClassName: myclass
# ...
Isso irá instruir o kubelet a usar o RuntimeClass nomeado acima (myclass) para esse Pod. Se
o nome do RuntimeClass não existir, ou o CRI não puder executar a solicitação, o Pod entrará
na fase
final Failed . Procure por um
evento correspondente
para uma mensagem de erro.
Configuração do CRI
Para maiores detalhes de configuração dos agentes de execução CRI, veja instalação do CRI.
dockershim
O CRI dockershim embutido no Kubernetes não suporta outros agentes de execução.
containerd
Agentes de execução são configurados através da configuração do containerd em
/etc/containerd/config.toml . Agentes válidos são configurados sob a seção de runtimes :
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.${HANDLER_NAME}]
CRI-O
Agentes de execução são configurados através da configuração do CRI-O em
/etc/crio/crio.conf .
Agentes válidos são configurados na seção crio.runtime
table:
[crio.runtime.runtimes.${HANDLER_NAME}]
runtime_path = "${PATH_TO_BINARY}"
https://kubernetes.io/pt-br/docs/concepts/_print/ 66/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Associação
FEATURE STATE: Kubernetes v1.16 [beta]
Se os nós suportados possuírem marcação de restrição para prevenir outros Pods com uma
classe de execução diferente de executar no nó, você pode adicionar o campo tolerations
ao objeto RuntimeClass. Assim como com o nodeSelector , o tolerations é combinado com
o campo tolerations do Pod em tempo de admissão, efetivamente pegando a intersecção
do
conjunto de nós aplicáveis para cada.
Para saber mais sobre a configuração de seleção de nós e tolerâncias, veja Associando Pods a
Nós.
Sobrecarga de Pods
FEATURE STATE: Kubernetes v1.18 [beta]
Você pode especificar os recursos extra que estão associados à execução de um Pod.
Declarar esses
recursos extra permite ao cluster (incluindo o agendador/scheduler de pods)
contabilizar por
esses recursos quando estiver decidindo sobre Pods e recursos. Para usar a
contabilização
desses recursos extras, você deve estar com o feature gate
PodOverhead
habilitado (ele já está habilitado por padrão).
Próximos passos
RuntimeClass Design
RuntimeClass Scheduling Design
Leia mais sobre Sobrecarga de Pods
PodOverhead Feature Design
https://kubernetes.io/pt-br/docs/concepts/_print/ 67/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Visão Geral
Análogo a muitas estruturas de linguagem de programação que tem hooks de ciclo de vida de
componentes, como angular,
o Kubernetes fornece aos contêineres hooks de ciclo de vida.
Os
hooks permitem que os contêineres estejam cientes dos eventos em seu ciclo de vida de
gerenciamento
e executem código implementado em um manipulador quando o hook de
ciclo de vida correspondente é executado.
Hooks do contêiner
Existem dois hooks que são expostos para os contêiners:
PostStart
PreStop
Esse hook é chamado imediatamente antes de um contêiner ser encerrado devido a uma
solicitação de API ou um gerenciamento de evento como liveness/startup probe failure,
preemption, resource contention e outros.
Uma chamada ao hook PreStop falha se o
contêiner já está em um estado finalizado ou concluído e o hook deve ser concluído antes que
o sinal TERM seja enviado para parar o contêiner. A contagem regressiva do período de
tolerância de término do Pod começa antes que o hook PreStop seja executado, portanto,
independentemente do resultado do manipulador, o contêiner será encerrado dentro do
período de tolerância de encerramento do Pod. Nenhum parâmetro é passado para o
manipulador.
Os hooks PreStop não são executados de forma assíncrona a partir do sinal para parar o
contêiner, o hook precisa finalizar a sua execução antes que o sinal TERM possa ser enviado.
Se um hook PreStop travar durante a execução, a fase do Pod será Terminating e
permanecerá até que o Pod seja morto após seu terminationGracePeriodSeconds expirar.
Esse período de tolerância se aplica ao tempo total necessário
para o hook PreStop executar
e para o contêiner parar normalmente.
Se por exemplo, o terminationGracePeriodSeconds é
60, e o hook leva 55 segundos para ser concluído, e o contêiner leva 10 segundos para parar
normalmente após receber o sinal, então o contêiner será morto antes que possa parar
normalmente, uma vez que o terminationGracePeriodSeconds é menor que o tempo total
(55 + 10) que é necessário para que essas duas coisas aconteçam.
Events:
Próximos passos
Saiba mais sobre o Ambiente de contêiner.
Obtenha experiência prática
anexando manipuladores a eventos de ciclo de vida do
contêiner.
https://kubernetes.io/pt-br/docs/concepts/_print/ 69/178
5/14/22, 11:16 AM Conceitos | Kubernetes
https://kubernetes.io/pt-br/docs/concepts/_print/ 70/178
5/14/22, 11:16 AM Conceitos | Kubernetes
As entidades que um Pod pode se comunicar são identificadas através de uma combinação
dos 3
identificadores à seguir:
1. Outros pods que são permitidos (exceção: um pod não pode bloquear a si próprio)
2. Namespaces que são permitidos
3. Blocos de IP (exceção: o tráfego de e para o nó que um Pod está executando sempre é
permitido,
independentemente do endereço IP do Pod ou do Nó)
Quando uma política de redes baseada em IP é criada, nós definimos a política baseada em
blocos de IP (faixas CIDR).
Pré requisitos
As políticas de rede são implementadas pelo plugin de redes. Para usar
uma política de
redes, você deve usar uma solução de redes que suporte o objeto NetworkPolicy .
A criação
de um objeto NetworkPolicy sem um controlador que implemente essas regras não tem
efeito.
Os pods tornam-se isolados ao existir uma NetworkPolicy que selecione eles. Uma vez que
exista qualquer NetworkPolicy no namespace selecionando um pod em específico, aquele
pod
irá rejeitar qualquer conexão não permitida por qualquer NetworkPolicy . (Outros pod
no mesmo
namespace que não são selecionados por nenhuma outra NetworkPolicy irão
continuar aceitando
todo tráfego de rede.)
As políticas de rede não conflitam; elas são aditivas. Se qualquer política selecionar um pod,
o
pod torna-se restrito ao que é permitido pela união das regras de entrada/saída de tráfego
definidas
nas políticas. Assim, a ordem de avaliação não afeta o resultado da política.
Para o fluxo de rede entre dois pods ser permitido, tanto a política de saída no pod de origem
e a política de entrada no pod de destino devem permitir o tráfego. Se a política de saída na
origem, ou a política de entrada no destino negar o tráfego, o tráfego será bloqueado.
O recurso NetworkPolicy
Veja a referência NetworkPolicy para uma definição completa do recurso.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
https://kubernetes.io/pt-br/docs/concepts/_print/ 71/178
5/14/22, 11:16 AM Conceitos | Kubernetes
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
Nota: Criar esse objeto no seu cluster não terá efeito a não ser que você escolha uma
solução de redes que suporte políticas de rede.
policyTypes: Cada NetworkPolicy inclui uma lista de policyTypes que pode incluir
Ingress ,
Egress ou ambos. O campo policyTypes indica se a política se aplica ao tráfego
de entrada
com destino aos pods selecionados, o tráfego de saída com origem dos pods
selecionados ou ambos.
Se nenhum policyType for definido então por padrão o tipo
Ingress será sempre utilizado, e o
tipo Egress será configurado apenas se o objeto
contiver alguma regra de saída. (campo egress a seguir).
ingress: Cada NetworkPolicy pode incluir uma lista de regras de entrada permitidas através
do campo ingress .
Cada regra permite o tráfego que corresponde simultaneamente às
sessões from (de) e ports (portas).
A política de exemplo acima contém uma regra simples,
que corresponde ao tráfego em uma única porta,
de uma das três origens definidas, sendo a
primeira definida via ipBlock , a segunda via namespaceSelector e
a terceira via
podSelector .
egress: Cada política pode incluir uma lista de regras de regras de saída permitidas através
do campo egress .
Cada regra permite o tráfego que corresponde simultaneamente às
sessões to (para) e ports (portas).
A política de exemplo acima contém uma regra simples,
que corresponde ao tráfego destinado a uma
porta em qualquer destino pertencente à faixa
de IPs em 10.0.0.0/24 .
1. Isola os pods no namespace "default" com a label "role=db" para ambos os tráfegos de
entrada
e saída (se eles ainda não estavam isolados)
podSelector: Seleciona Pods no mesmo namespace que a política de rede foi criada, e que
deve
ser permitido origens no tráfego de entrada ou destinos no tráfego de saída.
namespaceSelector: Seleciona namespaces para o qual todos os Pods devem ser permitidos
como
origens no caso de tráfego de entrada ou destino no tráfego de saída.
...
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
podSelector:
matchLabels:
role: client
...
contém um único elemento from permitindo conexões de Pods com a label role=client
em
namespaces com a label user=alice . Mas essa política:
...
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
- podSelector:
matchLabels:
role: client
...
contém dois elementos no conjunto from e permite conexões de Pods no namespace local
com
a label role=client , OU de qualquer outro Pod em qualquer outro namespace que
tenha
a label user=alice .
https://kubernetes.io/pt-br/docs/concepts/_print/ 73/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Quando estiver em dúvida, utilize o comando kubectl describe para verificar como o
Kubernetes interpretou a política.
No caso de tráfego de entrada, isso significa que em alguns casos você pode filtrar os pacotes
de entrada baseado no IP de origem atual, enquanto que em outros casos o IP de origem que
a NetworkPolicy atua pode ser o IP de um LoadBalancer ou do Nó em que o Pod está
executando.
No caso de tráfego de saída, isso significa que conexões de Pods para Services que são
reescritos
para IPs externos ao cluster podem ou não estar sujeitos a políticas baseadas no
campo ipBlock .
Políticas padrão
Por padrão, se nenhuma política existir no namespace, então todo o tráfego de entrada e
saída é
permitido de e para os pods nesse namespace. Os exemplos a seguir permitem a
você mudar o
comportamento padrão nesse namespace.
service/networking/network-policy-default-deny-ingress.yaml
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
Isso garante que mesmo pods que não são selecionados por nenhuma outra política de rede
ainda
serão isolados. Essa política não muda o comportamento padrão de isolamento de
tráfego de saída
nesse namespace.
service/networking/network-policy-allow-all-ingress.yaml
https://kubernetes.io/pt-br/docs/concepts/_print/ 74/178
5/14/22, 11:16 AM Conceitos | Kubernetes
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all-ingress
spec:
podSelector: {}
ingress:
- {}
policyTypes:
- Ingress
service/networking/network-policy-default-deny-egress.yaml
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-egress
spec:
podSelector: {}
policyTypes:
- Egress
Isso garante que mesmo pods que não são selecionados por outra política de rede não seja
permitido
tráfego de saída. Essa política não muda o comportamento padrão de tráfego de
entrada.
service/networking/network-policy-allow-all-egress.yaml
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all-egress
spec:
podSelector: {}
egress:
- {}
policyTypes:
- Egress
https://kubernetes.io/pt-br/docs/concepts/_print/ 75/178
5/14/22, 11:16 AM Conceitos | Kubernetes
service/networking/network-policy-default-deny-all.yaml
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
Isso garante que mesmo pods que não são selecionados por nenhuma outra política de redes
não
possuam permissão de tráfego de entrada ou saída.
Ao escrever uma política de redes, você pode selecionar uma faixa de portas ao invés de uma
porta única, utilizando-se do campo endPort conforme a seguir:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: multi-port-egress
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 32000
endPort: 32768
A regra acima permite a qualquer Pod com a label "role=db" no namespace default de se
comunicar
com qualquer IP na faixa 10.0.0.0/24 através de protocolo TCP, desde que a
porta de destino
esteja na faixa entre 32000 e 32768.
Por ser uma funcionalidade "alpha", ela é desativada por padrão. Para habilitar o campo
endPort
no cluster, você (ou o seu administrador do cluster) deve habilitar o feature
gate NetworkPolicyEndPort no kube-apiserver com a flag --feature-
gates=NetworkPolicyEndPort=true,... .
https://kubernetes.io/pt-br/docs/concepts/_print/ 76/178
5/14/22, 11:16 AM Conceitos | Kubernetes
O campo endPort só pode ser definido se o campo port também for definido.
Ambos os campos port e endPort devem ser números.
Enquanto que um objeto NetworkPolicy não pode selecionar um namespace pelo seu nome
através de
um campo específico, você pode utilizar essa label padrão para selecionar um
namespace pelo seu nome.
Forçar o tráfego interno do cluster passar por um gateway comum (pode ser
implementado via service mesh ou outros proxies)
Qualquer coisa relacionada a TLS/mTLS (use um service mesh ou ingress controller para
isso)
Políticas específicas a nível do nó kubernetes (você pode utilizar as notações de IP CIDR
para isso, mas não pode selecionar nós Kubernetes por suas identidades)
Selecionar Services pelo seu nome (você pode, contudo, selecionar pods e
namespaces por seus labels o que torna-se uma solução de contorno viável).
Criação ou gerenciamento
Políticas padrão que são aplicadas a todos os namespaces e pods (existem alguns
plugins externos do Kubernetes e projetos que podem fazer isso, e a comunidade está
trabalhando nessa especificação).
Ferramental de testes para validação de políticas de redes.
Possibilidade de logar eventos de segurança de redes (conexões bloqueadas, aceitas).
Existem plugins CNI que conseguem fazer isso à parte.
Possibilidade de explicitamente negar políticas de rede (o modelo das NetworkPolicies
são "negar por padrão e conforme a necessidade, deve-se adicionar regras que
permitam o tráfego).
Bloquear o tráfego que venha da interface de loopback/localhost ou que venham do nó
em que o Pod se encontre.
Próximos passos
Veja o tutorial Declarando políticas de redes para mais exemplos.
Veja mais cenários comuns e exemplos de políticas de redes.
https://kubernetes.io/pt-br/docs/concepts/_print/ 77/178
5/14/22, 11:16 AM Conceitos | Kubernetes
8 - Configuração
8.1 - Melhores Práticas de
Configuração
Esse documento destaca e consolida as melhores práticas de configuração apresentadas em
todo o guia de usuário,
na documentação de introdução e nos exemplos.
Este é um documento vivo. Se você pensar em algo que não está nesta lista, mas pode ser útil
para outras pessoas,
não hesite em criar uma issue ou submeter um PR.
Escreva seus arquivos de configuração usando YAML ao invés de JSON. Embora esses
formatos possam ser usados alternadamente em quase todos os cenários, YAML tende
a ser mais amigável.
Coloque descrições de objetos nas anotações para permitir uma melhor análise.
Criar um Deployment, que cria um ReplicaSet para garantir que o número desejado de
Pods esteja disponível e especifica uma estratégia para substituir os Pods (como
RollingUpdate), é quase sempre preferível do que criar Pods diretamente, exceto para
alguns cenários explícitos de restartPolicy:Never. Um Job também pode ser apropriado.
Services
Crie o Service antes de suas cargas de trabalho de backend correspondentes
(Deployments ou ReplicaSets) e antes de quaisquer cargas de trabalho que precisem
acessá-lo. Quando o
Kubernetes inicia um contêiner, ele fornece variáveis de ambiente
apontando para todos os Services que estavam em execução quando o contêiner foi
iniciado. Por exemplo, se um Service chamado foo existe, todos os contêineres vão
receber as seguintes variáveis em seu ambiente inicial:
https://kubernetes.io/pt-br/docs/concepts/_print/ 78/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Isso implica em um requisito de pedido - qualquer Service que um Pod quer acessar precisa
ser criado antes do Pod em si, ou então as variáveis de ambiente não serão populadas. O
DNS não possui essa restrição.
Não especifique um hostPort para um Pod a menos que isso seja absolutamente
necessário. Quando você vincula um Pod a um hostPort , isso limita o número de
lugares em que o Pod pode ser agendado, porque cada
combinação de < hostIP ,
hostPort , protocol > deve ser única. Se você não especificar o hostIP e protocol
explicitamente, o Kubernetes vai usar 0.0.0.0 como o hostIP padrão e TCP como
protocol padrão.
Se você precisa de acesso a porta apenas para fins de depuração, pode usar o apiserver
proxy ou o kubectl port-forward .
Use headless Services (que tem um ClusterIP ou None ) para descoberta de serviço
quando você não precisar de um balanceador de carga kube-proxy .
Usando Labels
Defina e use labels que identifiquem atributos semânticos da sua aplicação ou
Deployment, como { app: myapp, tier: frontend, phase: test, deployment: v3 } .
Você pode usar essas labels para selecionar os Pods apropriados para outros recursos;
por exemplo, um Service que seleciona todos os Pods tier: frontend , ou todos
os
componentes de app: myapp . Veja o app guestbook para exemplos dessa abordagem.
Um Service pode ser feito para abranger vários Deployments, omitindo labels específicas de
lançamento de seu seletor. Quando você
precisar atualizar um serviço em execução sem
downtime, use um Deployment.
Imagens de Contêiner
https://kubernetes.io/pt-br/docs/concepts/_print/ 79/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Nota: Para garantir que seu contêiner sempre use a mesma versão de uma imagem,
você pode especificar seu resumo de assinatura;
substitua <nome-da-imagem>:<tag> por
<nome-da-imagem>@<hash> (por exemplo,
image@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2).
Esse resumo de assinatura identifica exclusivamente uma versão
específica de uma
imagem, então isso nunca vai ser atualizado pelo Kubernetes a menos que você mude o
valor do resumo de assinatura da imagem.
Nota: Você deve evitar o uso da tag :latest em produção, pois é mais difícil rastrear
qual versão da imagem está sendo executada e mais difícil reverter adequadamente.
Usando kubectl
Use kubectl apply -f <directory> . Isso procura por configurações do Kubernetes em
todos os arquivos .yaml , .yml em <directory> e passa isso para apply .
Use labels selectors para operações get e delete em vez de nomes de objetos
específicos. Consulte as seções sobre label selectors
e usando Labels efetivamente.
https://kubernetes.io/pt-br/docs/concepts/_print/ 80/178
5/14/22, 11:16 AM Conceitos | Kubernetes
8.2 - ConfigMaps
Um ConfigMap é um objeto da API usado para armazenar dados não-confidenciais em pares
chave-valor.
Pods podem consumir ConfigMaps como variáveis de ambiente, argumentos de
linha de comando ou como arquivos de configuração em um volume.
Motivação
Utilize um ConfigMap para manter a configuração separada do código da aplicação.
Por exemplo, imagine que você esteja desenvolvendo uma aplicação que pode ser executada
no seu computador local (para desenvolvimento) e na nuvem (para manipular tráfego real).
Você escreve código para ler a variável de ambiente chamada DATABASE_HOST .
No seu
ambiente local, você configura essa variável com o valor localhost . Na nuvem, você
configura essa variável para referenciar um serviço
do Kubernetes que expõe o componente
do banco de dados ao seu cluster.
Isto permite que você baixe uma imagem de contêiner que
roda na nuvem e depure exatamente
o mesmo código localmente se necessário.
Um ConfigMap não foi planejado para conter grandes quantidades de dados. Os dados
armazenados
em um ConfigMap não podem exceder 1 MiB. Se você precisa armazenar
configurações que são maiores
que este limite, considere montar um volume ou utilizar um
serviço separado de banco de dados
ou de arquivamento de dados.
Objeto ConfigMap
Um ConfigMap é um objeto
da API que permite o armazenamento de configurações para
consumo por outros objetos. Diferentemente
de outros objetos do Kubernetes que contém
um campo spec , o ConfigMap contém os campos data e
binaryData . Estes campos
aceitam pares chave-valor como valores. Ambos os campos data e binaryData
são
opcionais. O campo data foi pensado para conter sequências de bytes UTF-8, enquanto o
campo binaryData
foi planejado para conter dados binários em forma de strings codificadas
em base64.
Cada chave sob as seções data ou binaryData pode conter quaisquer caracteres
alfanuméricos,
- , _ e . . As chaves armazenadas na seção data não podem colidir com as
chaves armazenadas
na seção binaryData .
ConfigMaps e Pods
Você pode escrever uma spec para um Pod que se refere a um ConfigMap e configurar o(s)
contêiner(es)
neste Pod baseados em dados do ConfigMap. O Pod e o ConfigMap devem
estar no mesmo
namespace.
https://kubernetes.io/pt-br/docs/concepts/_print/ 81/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Exemplo de um ConfigMap que contém algumas chaves com valores avulsos e outras chaves
com valores semelhantes
a fragmentos de arquivos de configuração:
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# chaves com valores de propriedades; cada chave mapeia para um valor avulso
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
O quarto método envolve escrita de código para leitura do ConfigMap e dos seus dados. No
entanto,
como a API do Kubernetes está sendo utilizada diretamente, a aplicação pode
solicitar atualizações
sempre que o ConfigMap for alterado e reagir quando isso ocorre.
Acessar a API do Kubernetes
diretamente também permite ler ConfigMaps em outros
namespaces.
Exemplo de um Pod que utiliza valores do ConfigMap game-demo para configurar um Pod:
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
env:
# Define as variáveis de ambiente
valueFrom:
configMapKeyRef:
- name: UI_PROPERTIES_FILE_NAME
valueFrom:
configMapKeyRef:
name: game-demo
key: ui_properties_file_name
https://kubernetes.io/pt-br/docs/concepts/_print/ 82/178
5/14/22, 11:16 AM Conceitos | Kubernetes
volumeMounts:
- name: config
mountPath: "/config"
readOnly: true
volumes:
- name: config
configMap:
name: game-demo
items:
- key: "game.properties"
path: "game.properties"
- key: "user-interface.properties"
path: "user-interface.properties"
ConfigMaps não diferenciam entre propriedades com valores simples ou valores complexos,
que ocupam várias linhas. O importante é a forma que Pods e outros objetos consomem tais
valores.
Neste exemplo, definir um volume e montar ele dentro do contêiner demo no caminho
/config
cria dois arquivos: /config/game.properties e /config/user-
interface.properties , embora existam
quatro chaves distintas no ConfigMap. Isso se deve
ao fato de que a definição do Pod contém uma lista
items na seção volumes .
Se a lista
items for omitida, cada chave do ConfigMap torna-se um arquivo cujo nome é a sua chave
correspondente, e quatro arquivos serão criados.
Usando ConfigMaps
ConfigMaps podem ser montados como volumes de dados. ConfigMaps também podem ser
utilizados
por outras partes do sistema sem serem diretamente expostos ao Pod. Por
exemplo, ConfigMaps
podem conter dados que outras partes do sistema devem usar para
configuração.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
configMap:
name: myconfigmap
ConfigMaps imutáveis
FEATURE STATE: Kubernetes v1.21 [stable]
https://kubernetes.io/pt-br/docs/concepts/_print/ 84/178
5/14/22, 11:16 AM Conceitos | Kubernetes
apiVersion: v1
kind: ConfigMap
metadata:
...
data:
...
immutable: true
Após um ConfigMap ser marcado como imutável, não é possível reverter a alteração, nem
alterar o conteúdo dos campos data ou binaryData . É possível apenas apagar e recriar
o
ConfigMap. Como Pods existentes que consomem o ConfigMap em questão mantém um
ponto de
montagem que continuará referenciando este objeto após a remoção, é
recomendado recriar
estes pods.
Próximos passos
Leia sobre Secrets (em inglês).
Leia Configure a Pod to Use a ConfigMap (em inglês).
Leia The Twelve-Factor App (em inglês) para entender a motivação da separação de
código
e configuração.
https://kubernetes.io/pt-br/docs/concepts/_print/ 85/178
5/14/22, 11:16 AM Conceitos | Kubernetes
8.3 - Secrets
Um Secret é um objeto que contém uma pequena quantidade de informação sensível,
como
senhas, tokens ou chaves. Este tipo de informação poderia, em outras
circunstâncias, ser
colocada diretamente em uma configuração de
Pod ou em uma
imagem de contêiner. O uso
de
Secrets evita que você tenha de incluir dados confidenciais no seu código.
Secrets podem ser criados de forma independente dos Pods que os consomem. Isto
reduz o
risco de que o Secret e seus dados sejam expostos durante o processo de
criação,
visualização e edição ou atualização de Pods. O Kubernetes e as
aplicações que rodam no seu
cluster podem também tomar outras precauções com
Secrets, como por exemplo evitar a
escrita de dados confidenciais em local de
armazenamento persistente (não-volátil).
Cuidado:
Os Secrets do Kubernetes são, por padrão, gravados não-encriptados no sistema
de
armazenamento de dados utilizado pelo servidor da API (etcd). Qualquer pessoa
com
acesso à API ou ao etcd consegue obter ou modificar um Secret.
Além disso, qualquer
pessoa que possui autorização para criar Pods em um namespace
consegue utilizar este
privilégio para ler qualquer Secret naquele namespace. Isso
inclui acesso indireto, como
por exemplo a permissão para criar Deployments.
Para utilizar Secrets de forma segura, siga pelo menos as instruções abaixo:
Como um arquivo em um
volume montado em um ou mais de
seus contêineres.
Como uma variável de ambiente em um
contêiner.
Pelo kubelet ao baixar imagens de contêiner para o
Pod.
Tipos de Secrets
https://kubernetes.io/pt-br/docs/concepts/_print/ 86/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Ao criar um Secret, você pode especificar o seu tipo utilizando o campo type
do objeto
Secret, ou algumas opções de linha de comando equivalentes no comando
kubectl , quando
disponíveis. O campo type de um Secret é utilizado para
facilitar a manipulação
programática de diferentes tipos de dados confidenciais.
O Kubernetes oferece vários tipos embutidos de Secret para casos de uso comuns.
Estes
tipos variam em termos de validações efetuadas e limitações que o
Kubernetes impõe neles.
Você pode definir e utilizar seu próprio tipo de Secret definindo o valor do
campo type como
uma string não-nula em um objeto Secret. Uma string em branco
é tratada como o tipo
Opaque . O Kubernetes não restringe nomes de tipos. No
entanto, quando tipos embutidos
são utilizados, você precisa atender a todos os
requisitos daquele tipo.
https://kubernetes.io/pt-br/docs/concepts/_print/ 87/178
5/14/22, 11:16 AM Conceitos | Kubernetes
apiVersion: v1
kind: Secret
metadata:
name: secret-sa-sample
annotations:
kubernetes.io/service-account-name: "sa-name"
type: kubernetes.io/service-account-token
data:
# Você pode incluir pares chave-valor adicionais, da mesma forma que faria com
extra: YmFyCg==
Veja a documentação de
ServiceAccount
para mais informações sobre o funcionamento de
service accounts. Você pode
verificar também os campos automountServiceAccountToken e
serviceAccountName
do Pod
para mais informações sobre como referenciar service
accounts em Pods.
kubernetes.io/dockercfg
kubernetes.io/dockerconfigjson
apiVersion: v1
kind: Secret
metadata:
name: secret-dockercfg
type: kubernetes.io/dockercfg
data:
.dockercfg: |
https://kubernetes.io/pt-br/docs/concepts/_print/ 88/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Nota: Se você não desejar fazer a codificação em formato base64, você pode utilizar o
campo stringData como alternativa.
--docker-username=tiger \
--docker-password=pass113 \
--docker-email=tiger@acme.com \
--docker-server=my-registry.example:5000
"apiVersion": "v1",
"data": {
".dockerconfigjson": "eyJhdXRocyI6eyJteS1yZWdpc3RyeTo1MDAwIjp7InVzZXJuYW1
},
"kind": "Secret",
"metadata": {
"creationTimestamp": "2021-07-01T07:30:59Z",
"name": "secret-tiger-docker",
"namespace": "default",
"resourceVersion": "566718",
"uid": "e15c1d7b-9071-4100-8681-f3a7a2ce89ca"
},
"type": "kubernetes.io/dockerconfigjson"
"auths":{
"my-registry:5000":{
"username":"tiger",
"password":"pass113",
"email":"tiger@acme.com",
"auth":"dGlnZXI6cGFzczExMw=="
}
}
Ambos os valores para estas duas chaves são textos codificados em formato base64.
Você
pode fornecer os valores como texto simples utilizando o campo stringData
na criação do
Secret.
apiVersion: v1
kind: Secret
metadata:
name: secret-basic-auth
type: kubernetes.io/basic-auth
stringData:
username: admin
password: t0p-Secret
apiVersion: v1
kind: Secret
metadata:
name: secret-ssh-auth
type: kubernetes.io/ssh-auth
data:
ssh-privatekey: |
MIIEpQIBAAKCAQEAulqb/Y ...
Cuidado: Chaves privadas SSH não estabelecem, por si só, uma comunicação confiável
entre um cliente SSH e um servidor. Uma forma secundária de estabelecer
confiança é
necessária para mitigar ataques "machine-in-the-middle", como
por exemplo um arquivo
known_hosts adicionado a um ConfigMap.
Secrets TLS
O Kubernetes fornece o tipo embutido de Secret kubernetes.io/tls para
armazenamento
de um certificado e sua chave associada que são tipicamente
utilizados para TLS. Estes dados
são utilizados primariamente para a
finalização TLS do recurso Ingress, mas podem ser
https://kubernetes.io/pt-br/docs/concepts/_print/ 90/178
5/14/22, 11:16 AM Conceitos | Kubernetes
apiVersion: v1
kind: Secret
metadata:
name: secret-tls
type: kubernetes.io/tls
data:
tls.crt: |
MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
tls.key: |
MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...
--cert=path/to/cert/file \
--key=path/to/key/file
apiVersion: v1
kind: Secret
metadata:
name: bootstrap-token-5emitj
namespace: kube-system
type: bootstrap.kubernetes.io/token
data:
https://kubernetes.io/pt-br/docs/concepts/_print/ 91/178
5/14/22, 11:16 AM Conceitos | Kubernetes
auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG
expiration: MjAyMC0wOS0xM1QwNDozOToxMFo=
token-id: NWVtaXRq
token-secret: a3E0Z2lodnN6emduMXAwcg==
usage-bootstrap-authentication: dHJ1ZQ==
usage-bootstrap-signing: dHJ1ZQ==
O YAML acima pode parecer confuso, já que os valores estão todos codificados em
formato
base64. Você pode criar o mesmo Secret utilizando este YAML:
apiVersion: v1
kind: Secret
metadata:
name: bootstrap-token-5emitj
# Um Secret de token de inicialização geralmente fica armazenado no namespace
# kube-system
namespace: kube-system
type: bootstrap.kubernetes.io/token
stringData:
auth-extra-groups: "system:bootstrappers:kubeadm:default-node-token"
expiration: "2020-09-13T04:39:10Z"
token-id: "5emitj"
token-secret: "kq4gihvszzgn1p0r"
usage-bootstrap-authentication: "true"
usage-bootstrap-signing: "true"
Criando um Secret
Há várias formas diferentes de criar um Secret:
Editando um Secret
Um Secret existente no cluster pode ser editado com o seguinte comando:
https://kubernetes.io/pt-br/docs/concepts/_print/ 92/178
5/14/22, 11:16 AM Conceitos | Kubernetes
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this fil
# reopened with the relevant failures.
apiVersion: v1
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: { ... }
creationTimestamp: 2016-01-22T18:41:56Z
name: mysecret
namespace: default
resourceVersion: "164619"
uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque
Utilizando Secrets
Secrets podem ser montados como volumes de dados ou expostos como
variáveis de ambiente
para serem utilizados num container de um Pod. Secrets também
podem ser
utilizados por outras partes do sistema, sem serem diretamente expostos ao Pod.
Por exemplo, Secrets podem conter credenciais que outras partes do sistema devem
utilizar
para interagir com sistemas externos no lugar do usuário.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
https://kubernetes.io/pt-br/docs/concepts/_print/ 93/178
5/14/22, 11:16 AM Conceitos | Kubernetes
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
Cada Secret que você deseja utilizar deve ser referenciado na lista
.spec.volumes .
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
Neste caso:
https://kubernetes.io/pt-br/docs/concepts/_print/ 94/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Por exemplo, você pode especificar uma permissão padrão da seguinte maneira:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: mysecret
defaultMode: 0400
Note que a especificação JSON não suporta notação octal. Neste caso, utilize o
valor 256 para
permissões equivalentes a 0400. Se você utilizar YAML ao invés
de JSON para o Pod, você
pode utilizar notação octal para especificar permissões
de uma forma mais natural.
Perceba que se você acessar o Pod com kubectl exec , você precisará seguir o
vínculo
simbólico para encontrar a permissão esperada. Por exemplo,
cd /etc/foo
ls -l
total 0
cd /etc/foo/..data
ls -l
total 8
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
https://kubernetes.io/pt-br/docs/concepts/_print/ 95/178
5/14/22, 11:16 AM Conceitos | Kubernetes
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
mode: 0777
Note que os valores de permissões podem ser exibidos em formato decimal se você
ler essa
informação posteriormente.
ls /etc/foo
O resultado é semelhante a:
username
password
cat /etc/foo/username
O resultado é semelhante a:
admin
cat /etc/foo/password
O resultado é semelhante a:
1f2d1e2e67df
https://kubernetes.io/pt-br/docs/concepts/_print/ 96/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Como resultado, o tempo decorrido total entre o momento em que o Secret foi
atualizado até
o momento em que as novas chaves são projetadas nos Pods pode
ser tão longo quanto o
tempo de sincronização do kubelet somado ao tempo de
propagação do cache, onde o
tempo de propagação do cache depende do tipo de
cache escolhido: o tempo de propagação
pode ser igual ao tempo de propagação
do watch, TTL do cache, ou zero, de acordo com cada
um dos tipos de cache.
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
resultados abaixo:
echo $SECRET_USERNAME
O resultado é semelhante a:
admin
echo $SECRET_PASSWORD
O resultado é semelhante a:
1f2d1e2e67df
Secrets imutáveis
FEATURE STATE: Kubernetes v1.21 [stable]
apiVersion: v1
kind: Secret
metadata:
...
data:
...
immutable: true
Nota: Uma vez que um Secret ou ConfigMap seja marcado como imutável, não é mais
possível reverter esta mudança, nem alterar os conteúdos do campo data. Você
pode
somente apagar e recriar o Secret. Pods existentes mantém um ponto de
montagem
referenciando o Secret removido - é recomendado recriar tais Pods.
https://kubernetes.io/pt-br/docs/concepts/_print/ 98/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Usando imagePullSecrets
O campo imagePullSecrets é uma lista de referências para Secrets no mesmo
namespace.
Você pode utilizar a lista imagePullSecrets para enviar Secrets
que contém uma senha para
acesso a um registro de contêineres do Docker (ou
outros registros de contêineres) ao
kubelet. O kubelet utiliza essa informação
para baixar uma imagem privada no lugar do seu
Pod.
Veja a API PodSpec
para maiores detalhes sobre o campo imagePullSecrets .
Detalhes
Restrições
Referências a Secrets em volumes são validadas para garantir que o objeto
especificado
realmente existe e é um objeto do tipo Secret. Portanto, um Secret
precisa ser criado antes
de quaisquer Pods que dependam deste.
Secrets individuais são limitados ao tamanho de 1MiB. Esta limitação ter por
objetivo
desencorajar a criação de Secrets muito grandes que poderiam exaurir
a memória do
servidor da API e do kubelet. No entanto, a criação de muitos
Secrets pequenos também
pode exaurir a memória. Limites mais completos de uso
de memória em função de Secrets é
uma funcionalidade prevista para o futuro.
O kubelet suporta apenas o uso de Secrets em Pods onde os Secrets são obtidos
do servidor
da API. Isso inclui quaisquer Pods criados usando o comando
kubectl , ou indiretamente
através de um controlador de replicação, mas não
inclui Pods criados como resultado das
flags --manifest-url e --config do
kubelet, ou a sua API REST (estas são formas incomuns
de criar um Pod).
A spec de um Pod estático
não pode se referir a um Secret ou a qualquer
outro objeto da API.
Secrets precisam ser criados antes de serem consumidos em Pods como variáveis de
ambiente, exceto quando são marcados como opcionais. Referências a Secrets que
não
existem provocam falhas na inicialização do Pod.
https://kubernetes.io/pt-br/docs/concepts/_print/ 99/178
5/14/22, 11:16 AM Conceitos | Kubernetes
O resultado é semelhante a:
Casos de uso
Caso de uso: Como variáveis de ambiente em um contêiner
Crie um manifesto de Secret
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
USER_NAME: YWRtaW4=
PASSWORD: MWYyZDFlMmU2N2Rm
apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
envFrom:
- secretRef:
name: mysecret
restartPolicy: Never
https://kubernetes.io/pt-br/docs/concepts/_print/ 100/178
5/14/22, 11:16 AM Conceitos | Kubernetes
O resultado é semelhante a:
Cuidado: Analise cuidadosamente antes de enviar suas próprias chaves SSH: outros
usuários
do cluster podem ter acesso a este Secret. Utilize uma service account que você
deseje que seja acessível a todos os usuários com os quais você compartilha o
cluster do
Kubernetes em questão. Desse modo, você pode revogar esta service
account caso os
usuários sejam comprometidos.
Agora você pode criar um Pod que referencia o Secret com a chave SSH e consome-o
em um
volume:
apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
labels:
name: secret-test
spec:
volumes:
- name: secret-volume
secret:
secretName: ssh-key-secret
containers:
- name: ssh-test-container
image: mySshImage
volumeMounts:
- name: secret-volume
readOnly: true
mountPath: "/etc/secret-volume"
/etc/secret-volume/ssh-publickey
/etc/secret-volume/ssh-privatekey
O contêiner então pode utilizar os dados do secret para estabelecer uma conexão
SSH.
https://kubernetes.io/pt-br/docs/concepts/_print/ 101/178
5/14/22, 11:16 AM Conceitos | Kubernetes
O resultado é semelhante a:
Você pode também criar um Secret com credenciais para o ambiente de testes.
O resultado é semelhante a:
Nota:
Caracteres especiais como $ , \ , * , + e ! serão interpretados pelo seu
shell e
precisam de
sequências de escape. Na maioria dos shells, a forma mais fácil de gerar
sequências
de escape para suas senhas é escrevê-las entre aspas simples ( ' ). Por
exemplo,
se a sua senha for S!B\*d$zDsb= , você deve executar o comando da seguinte
forma:
apiVersion: v1
kind: List
items:
- kind: Pod
apiVersion: v1
metadata:
name: prod-db-client-pod
labels:
name: prod-db-client
spec:
volumes:
- name: secret-volume
secret:
secretName: prod-db-secret
containers:
- name: db-client-container
image: myClientImage
volumeMounts:
- name: secret-volume
readOnly: true
mountPath: "/etc/secret-volume"
- kind: Pod
apiVersion: v1
metadata:
name: test-db-client-pod
https://kubernetes.io/pt-br/docs/concepts/_print/ 102/178
5/14/22, 11:16 AM Conceitos | Kubernetes
labels:
name: test-db-client
spec:
volumes:
- name: secret-volume
secret:
secretName: test-db-secret
containers:
- name: db-client-container
image: myClientImage
volumeMounts:
- name: secret-volume
readOnly: true
mountPath: "/etc/secret-volume"
EOF
resources:
- pod.yaml
EOF
kubectl apply -k .
/etc/secret-volume/username
/etc/secret-volume/password
Observe como as spec s para cada um dos Pods diverge somente em um campo. Isso
facilita
a criação de Pods com capacidades diferentes a partir de um template
mais genérico.
Você pode simplificar ainda mais a definição básica do Pod através da utilização
de duas
service accounts diferentes:
apiVersion: v1
kind: Pod
metadata:
name: prod-db-client-pod
labels:
name: prod-db-client
spec:
serviceAccount: prod-db-client
containers:
- name: db-client-container
image: myClientImage
https://kubernetes.io/pt-br/docs/concepts/_print/ 103/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Você pode fazer com que seus dados fiquem "ocultos" definindo uma chave que se
inicia com
um ponto ( . ). Este tipo de chave representa um dotfile, ou
arquivo "oculto". Por exemplo,
quando o Secret abaixo é montado em um volume,
secret-volume :
apiVersion: v1
kind: Secret
metadata:
name: dotfile-secret
data:
.secret-file: dmFsdWUtMg0KDQo=
---
apiVersion: v1
kind: Pod
metadata:
name: secret-dotfiles-pod
spec:
volumes:
- name: secret-volume
secret:
secretName: dotfile-secret
containers:
- name: dotfile-test-container
image: k8s.gcr.io/busybox
command:
- ls
- "-l"
- "/etc/secret-volume"
volumeMounts:
- name: secret-volume
readOnly: true
mountPath: "/etc/secret-volume"
Nota: Arquivos com nomes iniciados por um caractere de ponto são ocultos do resultado
do comando ls -l. Você precisa utilizar ls -la para vê-los ao listar o
conteúdo de um
diretório.
Melhores práticas
Clientes que utilizam a API de Secrets
https://kubernetes.io/pt-br/docs/concepts/_print/ 104/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Ao instalar aplicações que interajam com a API de Secrets, você deve limitar o
acesso
utilizando políticas de autorização
como RBAC.
Aplicações que necessitam acessar a API de Secret devem realizar uma requisição
get nos
Secrets que precisam. Isto permite que administradores restrinjam o
acesso a todos os
Secrets, enquanto
utilizam uma lista de autorização a instâncias individuais
que a aplicação
precise.
Para melhor desempenho em uma requisição get repetitiva, clientes podem criar
objetos
que referenciam o Secret e então utilizar a requisição watch neste
novo objeto, requisitando
o Secret novamente quando a referência mudar.
Além disso, uma API de "observação em
lotes"
para permitir a clientes observar recursos individuais também foi proposta e
provavelmente estará disponível em versões futuras do Kubernetes.
Propriedades de segurança
Proteções
Como Secrets podem ser criados de forma independente de Pods que os utilizam,
há menos
risco de um Secret ser exposto durante o fluxo de trabalho de criação,
visualização, e edição
de Pods. O sistema pode também tomar precauções adicionais
com Secrets, como por
exemplo evitar que sejam escritos em disco quando possível.
Secrets de vários Pods diferentes podem existir no mesmo nó. No entanto, somente
os
Secrets que um Pod requerer estão potencialmente visíveis em seus contêineres.
Portanto,
um Pod não tem acesso aos Secrets de outro Pod.
Um Pod pode conter vários contêineres. Porém, cada contêiner em um Pod precisa
requerer
o volume de Secret nos seus volumeMounts para que este fique visível
dentro do contêiner.
Esta característica pode ser utilizada para construir
partições de segurança ao nível do Pod.
Riscos
No servidor da API, os dados de Secret são armazenados no
etcd; portanto:
Administradores devem habilitar encriptação em disco para dados do cluster
(requer Kubernetes v1.13 ou posterior).
https://kubernetes.io/pt-br/docs/concepts/_print/ 105/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Próximos passos
Aprenda a gerenciar Secrets utilizando kubectl
Aprenda a gerenciar Secrets utilizando arquivos de configuração
Aprenda a gerenciar Secrets utilizando kustomize
Leia a documentação de referência da API de Secrets
https://kubernetes.io/pt-br/docs/concepts/_print/ 106/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Requerimentos e limites
Se o nó em que um Pod está rodando tem o suficiente de um recurso específico
disponível, é
possível (e permitido) a um contêiner utilizar mais do que o seu
request para aquele recurso
especifica. No entanto, não é permitido a um
contêiner consumir mais do que o seu limit
para um recurso.
Nota: Se um contêiner especifica seu próprio limite de memória, mas não especifica seu
requerimento de memória, o Kubernetes automaticamente cria um requerimento de
memória com o mesmo valor do limite. A mesma regra vale para o limite de CPU:
quando
não há requerimento de CPU, o Kubernetes automaticamente cria um
requerimento de
CPU idêntico ao limite.
Tipos de recursos
CPU e memória são tipos de recursos. Um tipo de recurso possui uma unidade
básica. CPU
representa processamento computacional e é especificada em unidades
de CPU do
Kubernetes.
Memória é especificada em bytes. Em cargas de trabalho Linux, você pode
especificar o recurso huge pages. Huge pages são uma funcionalidade
específica do Linux que
permite ao núcleo do sistema operacional alocar
blocos de memória muito maiores que o
tamanho de página de memória padrão.
Nota: Você não pode superdimensionar (ou solicitar acima do limite físico) recursos do
tipo hugepages-*.
O recurso hugepages-* difere dos recursos memory e cpu neste aspecto.
https://kubernetes.io/pt-br/docs/concepts/_print/ 107/178
5/14/22, 11:16 AM Conceitos | Kubernetes
spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.limits.hugepages-<size>
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory
spec.containers[].resources.requests.hugepages-<size>
Recursos de CPU são sempre especificados como uma quantidade absoluta de recurso,
nunca como uma quantidade relativa. Por exemplo, 500m de CPU representam
grosseiramente a mesma quantidade de poder computacional, independentemente do
contêiner rodar em uma máquina com processador de núcleo único, de dois núcleos
ou de
48 núcleos.
Nota: O Kubernetes não permite que você especifique recursos de CPU com uma
precisão
maior que 1m. Devido a isso, é útil especificar unidades de CPU menores do que
1.0 ou 1000m utilizando a notação de milicpu. Por exemplo, 5m ao invés de
0.005.
https://kubernetes.io/pt-br/docs/concepts/_print/ 108/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Ei, Pi, Ti, Gi, Mi, Ki. Por exemplo, as quantidades abaixo representam, a grosso
modo, o
mesmo valor:
---
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: log-aggregator
image: images.my-company.example/log-aggregator:v6
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
https://kubernetes.io/pt-br/docs/concepts/_print/ 109/178
5/14/22, 11:16 AM Conceitos | Kubernetes
A um contêiner pode ou não ser permitido exceder seu limite de CPU por períodos
de tempo
estendidos. No entanto, agentes de execução de contêiner não encerram
Pods por uso
excessivo de CPU.
https://kubernetes.io/pt-br/docs/concepts/_print/ 110/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Pods utilizam armazenamento local efêmero para dados temporários, cache e logs.
O kubelet
pode fornecer armazenamento temporário a Pods que utilizam
armazenamento local
efêmero para montar volumes
do tipo emptyDir em contêineres.
Com esta funcionalidade em fase beta, o Kubernetes permite que você rastreie,
reserve e
limite quanto armazenamento local efêmero um Pod pode consumir.
Seu nó pode ter tantos outros sistemas de arquivos não utilizados pelo Kubernetes
quantos você desejar.
Se você tiver uma configuração diferente, o kubelet não irá aplicar limites de
recursos para o
armazenamento local efêmero.
Nota: O kubelet rastreia volumes emptyDir que utilizem o sistema de arquivos tmpfs
como uso de memória de contêiner, ao invés de consumo de armazenamento local
efêmero.
https://kubernetes.io/pt-br/docs/concepts/_print/ 111/178
5/14/22, 11:16 AM Conceitos | Kubernetes
spec.containers[].resources.limits.ephemeral-storage
spec.containers[].resources.requests.ephemeral-storage
128974848
129e6
129M
123Mi
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
ephemeral-storage: "2Gi"
limits:
ephemeral-storage: "4Gi"
volumeMounts:
- name: ephemeral
mountPath: "/tmp"
- name: log-aggregator
image: images.my-company.example/log-aggregator:v6
resources:
requests:
ephemeral-storage: "2Gi"
limits:
ephemeral-storage: "4Gi"
volumeMounts:
- name: ephemeral
mountPath: "/tmp"
volumes:
- name: ephemeral
emptyDir: {}
https://kubernetes.io/pt-br/docs/concepts/_print/ 112/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Cuidado:
Se o kubelet não estiver medindo armazenamento efêmero local, um Pod que exeder
seu
limite de armazenamento local não será removido por exceder os limites de
recurso de
armazenamento local.
Nota:
Neste modo, o kubelet não rastreia descritores de arquivos abertos para arquivos
removidos.
Recursos estendidos
Recursos estendidos são nomes de recursos absolutos fora do domínio
kubernetes.io .
Estes recursos permitem a operadores de cluster anunciar e a
usuários consumir recursos
que não são embutidos pelo Kubernetes.
https://kubernetes.io/pt-br/docs/concepts/_print/ 113/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Outros recursos
A fim de anunciar um novo recurso estendido a nível de nó, o operador do cluster
pode
enviar uma requisição HTTP com o método PATCH para o servidor da API do
Kubernetes para
especificar a quantidade disponível em um nó no cluster, através
do campo
status.capacity . Após a realização desta operação, o campo
status.capacity do nó irá
conter um novo recurso. O campo status.allocatable
é atualizado automaticamente pelo
kubelet, de forma assíncrona, com o novo
recurso.
Exemplo:
Este exemplo demonstra como utilizar a ferramenta curl para criar uma
requisição HTTP
que anuncia cinco recursos "example.com/foo" no nó k8s-node-1 ,
cujo nó da camada de
gerenciamento é k8s-master .
--request PATCH \
Você pode especificar os recursos estendidos que são manipulados por extensões
do
escalonador nas configurações do kube-scheduler.
Exemplo:
https://kubernetes.io/pt-br/docs/concepts/_print/ 114/178
5/14/22, 11:16 AM Conceitos | Kubernetes
"kind": "Policy",
"apiVersion": "v1",
"extenders": [
{
"urlPrefix":"<extender-endpoint>",
"bindVerb": "bind",
"managedResources": [
"name": "example.com/foo",
"ignoredByScheduler": true
}
]
Para consumir um recurso estendido em um Pod, inclua o nome do recurso como uma
chave
no mapa spec.containers[].resources.limits na especificação do contêiner.
Exemplo:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: myimage
resources:
requests:
cpu: 2
example.com/foo: 1
limits:
example.com/foo: 1
https://kubernetes.io/pt-br/docs/concepts/_print/ 115/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Limitação de PID
Limites de ID de processo (PID) permitem à configuração de um kubelet limitar o
número de
PIDs que um dado Pod pode consumir. Consulte
PID Limiting para mais informações.
Solução de problemas
Meus pods estão pendentes com um evento
FailedScheduling
Se o escalonador não conseguir encontrar nenhum nó que atenda aos requisitos de
recursos
do Pod, este Pod permanecerá não-agendado até que um local destino
possa ser encontrado.
Um Evento
é produzido cada vez que o escalonador falhar em encontrar um local para
agendar
o Pod. Você pode utilizar o utilitário kubectl para ver os eventos de um Pod.
Por
exemplo:
Events:
No exemplo acima, o Pod de nome "frontend" não pôde ser agendado devido à nenhum
nó
possuir CPU suficiente para suprir seu requerimento de CPU. Mensagens de erro
semelhantes a essa podem sugerir falha devido a falta de memória
( PodExceedsFreeMemory ).
De maneira geral, se um Pod estiver pendente com uma
mensagem deste tipo, há diversas
possibilidades de solução a serem tentadas:
https://kubernetes.io/pt-br/docs/concepts/_print/ 116/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Name: e2e-test-node-pool-4lw4
Capacity:
cpu: 2
memory: 7679792Ki
pods: 110
Allocatable:
cpu: 1800m
memory: 7474992Ki
pods: 110
No exemplo anterior, você pode verificar que se um Pod requisitar mais que 1,120
CPUs ou
mais que 6,23Gi de memória, tal Pod não caberá neste nó.
Ao verificar a seção "Pods", você pode observar quais Pods estão consumindo
espaço neste
nó.
A quantidade de recursos disponível aos Pods é menor que a capacidade do nó, pois
daemons do sistema utilizam uma parcela dos recursos disponíveis. Dentro da API
do
Kubernetes, cada nó tem um campo .status.allocatable
(consulte NodeStatus
para mais
detalhes).
Você deve também considerar o nível de acesso fornecido aos usuários de qualquer
namespace: acesso completo para escrita permite a alguém com este acesso
remover
qualquer recurso, incluindo uma configuração de ResourceQuota .
https://kubernetes.io/pt-br/docs/concepts/_print/ 117/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Name: simmemleak-hra99
Namespace: default
Image(s): saadali/simmemleak
Node: kubernetes-node-tf0f/10.240.216.66
Labels: name=simmemleak
Status: Running
Reason:
Message:
IP: 10.244.2.75
Containers:
simmemleak:
Image: saadali/simmemleak:latest
Limits:
cpu: 100m
memory: 50Mi
State: Running
Reason: OOMKilled
Ready: False
Restart Count: 5
Conditions:
Type Status
Ready False
Events:
Próximos passos
Pratique a criação de requerimentos de recursos de memória em contêineres e Pods.
Pratique a criação de requerimentos de CPU em contêineres and Pods.
Leia como a referência da API define um contêiner
e seus requerimentos de recursos.
Leia sobre quotas de projeto no XFS.
Leia mais sobre a referência de configuração do kube-scheduler (v1beta3).
https://kubernetes.io/pt-br/docs/concepts/_print/ 118/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Nota: Um arquivo que é utilizado para configurar o acesso aos clusters é chamado de
kubeconfig. Esta á uma forma genérica de referenciamento para um arquivo de
configuração desta natureza. Isso não significa que existe um arquivo com o nome
kubeconfig.
Por padrão, o kubectl procura por um arquivo de nome config no diretório $HOME/.kube
Contexto
Um elemento de contexto em um kubeconfig é utilizado para agrupar parâmetros de acesso
em um nome conveniente. Cada contexto possui três parâmetros: cluster, namespace, e
usuário.
https://kubernetes.io/pt-br/docs/concepts/_print/ 119/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Como descrito anteriormente, a saída poderá ser resultado de um único arquivo kubeconfig,
ou poderá ser o resultado da junção de vários arquivos kubeconfig.
Aqui estão as regras que o kubectl utiliza quando realiza a combinação de arquivos
kubeconfig:
Caso contrário, se a variável de ambiente KUBECONFIG estiver definida, esta deverá ser
utilizada como uma lista de arquivos a serem combinados, seguindo o fluxo a seguir:
Construir cada peça de informação do cluster baseado nas opções à seguir; a primeira
ocorrência encontrada será a opção vencedora:
https://kubernetes.io/pt-br/docs/concepts/_print/ 120/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Referências de arquivos
Arquivos e caminhos referenciados em um arquivo kubeconfig são relativos à localização do
arquivo kubeconfig.
Próximos passos
Configurar Accesso para Multiplos Clusters
kubectl config
https://kubernetes.io/pt-br/docs/concepts/_print/ 121/178
5/14/22, 11:16 AM Conceitos | Kubernetes
9 - Segurança
9.1 - Visão Geral da Segurança Cloud
Native
Esta visão geral define um modelo para pensar sobre a segurança em Kubernetes no
contexto da Segurança em Cloud Native.
Aviso: Este modelo de segurança no contêiner fornece sugestões, não prova políticas de
segurança da informação.
Cada camada do modelo de segurança Cloud Native é construída sobre a próxima camada
mais externa.
A camada de código se beneficia de uma base forte (Cloud, Cluster, Contêiner)
de camadas seguras.
Você não pode proteger contra padrões ruins de segurança nas
camadas de base através de
segurança no nível do Código.
Cloud
De muitas maneiras, a Cloud (ou servidores co-localizados, ou o datacenter corporativo) é a
base de computação confiável
de um cluster Kubernetes. Se a camada de Cloud é vulnerável
(ou
configurado de alguma maneira vulnerável), então não há garantia de que os
componentes construídos
em cima desta base estejam seguros. Cada provedor de Cloud faz
recomendações de segurança
para executar as cargas de trabalho com segurança nos
ambientes.
Segurança de Infraestrutura
Sugestões para proteger sua infraestrutura em um cluster Kubernetes:
Área de
Interesse para
Infraestrutura
Kubernetes Recomendação
Acesso de rede Os nós devem ser configurados para só aceitar conexões (por meio de
aos Nós listas de controle de acesso à rede) do control plane nas portas
(nodes) especificadas e aceitar conexões para serviços no Kubernetes do tipo
NodePort e LoadBalancer. Se possível, esses nós não devem ser
expostos inteiramente na Internet pública.
Encriptação Sempre que possível, é uma boa prática encriptar todas as unidades de
etcd armazenamento, mas como o etcd mantém o estado de todo o cluster
(incluindo os Secrets), seu disco deve ser criptografado.
https://kubernetes.io/pt-br/docs/concepts/_print/ 123/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Cluster
Existem duas áreas de preocupação para proteger o Kubernetes:
Componentes do Cluster
Se você deseja proteger seu cluster de acesso acidental ou malicioso e adotar
boas práticas
de informação, leia e siga os conselhos sobre
protegendo seu cluster.
Autenticação https://kubernetes.io/docs/concepts/securi
ty/controlling-access/
Contêiner
A segurança do contêiner está fora do escopo deste guia. Aqui estão recomendações gerais e
links para explorar este tópico:
Área de Interesse
para Contêineres Recomendação
https://kubernetes.io/pt-br/docs/concepts/_print/ 124/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Área de Interesse
para Contêineres Recomendação
Código
O código da aplicação é uma das principais superfícies de ataque sobre a qual você tem
maior controle.
Embora a proteção do código do aplicativo esteja fora do tópico de segurança
do Kubernetes, aqui
são recomendações para proteger o código do aplicativo:
Segurança de código
Área de
Atenção
para o
Código Recomendação
Acesso Se seu código precisar se comunicar por TCP, execute um handshake TLS com
só o cliente antecipadamente. Com exceção de alguns casos, encripte tudo em
através trânsito. Indo um passo adiante, é uma boa ideia encriptar o tráfego de rede
de TLS entre os serviços. Isso pode ser feito por meio de um processo conhecido
como mutual ou mTLS, que realiza uma verificação bilateral da comunicação
mediante os certificados nos serviços.
Limitand Essa recomendação pode ser um pouco autoexplicativa, mas, sempre que
o possível, você só deve expor as portas em seu serviço que são absolutamente
intervalo essenciais para a comunicação ou coleta de métricas.
s de
porta de
comunic
ação
https://kubernetes.io/pt-br/docs/concepts/_print/ 125/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Área de
Atenção
para o
Código Recomendação
Análise A maioria das linguagens fornece uma maneira para analisar um extrato do
de código referente a quaisquer práticas de codificação potencialmente
Código inseguras. Sempre que possível, você deve automatizar verificações usando
Estático ferramentas que podem verificar as bases de código em busca de erros de
segurança comuns. Algumas das ferramentas podem ser encontradas em
OWASP Source Code Analysis Tools.
Ataques Existem algumas ferramentas automatizadas que você pode executar contra
de seu serviço para tentar alguns dos ataques mais conhecidos. Isso inclui
sondage injeção de SQL, CSRF e XSS. Uma das ferramentas de análise dinâmica mais
m populares é o OWASP Zed Attack proxy.
dinâmic
a
Próximos passos
Saiba mais sobre os tópicos de segurança do Kubernetes:
https://kubernetes.io/pt-br/docs/concepts/_print/ 126/178
5/14/22, 11:16 AM Conceitos | Kubernetes
10 - Escalonamento
No Kubernetes, agendamento refere-se a garantia de que os pods
correspondam aos nós para que o kubelet possa executá-los. Remoção é o
processo de falha proativa de um ou mais pods em nós com falta de
recursos.
Tolerâncias são aplicadas em pods e permitem, mas não exigem, que os pods sejam alocados
em nós com taints correspondentes.
Taints e tolerâncias trabalham juntos para garantir que pods não sejam alocados em nós
inapropriados. Um ou mais taints são aplicados em um nó; isso define que o nó não deve
aceitar nenhum pod que não tolera essas taints.
Conceitos
Você adiciona um taint a um nó utilizando kubectl taint.
Por exemplo,
define um taint no nó node1 . O taint tem a chave key1 , valor value1 e o efeito
NoSchedule .
Isso significa que nenhum pod conseguirá ser executado no nó node1 a menos
que possua uma tolerância correspondente.
Para remover o taint adicionado pelo comando acima, você pode executar:
Você especifica uma tolerância para um pod na especificação do Pod. Ambas as seguintes
tolerâncias "correspondem" ao taint criado pelo kubectl taint acima, e assim um pod com
qualquer uma delas poderia ser executado no node1 :
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
tolerations:
- key: "key1"
operator: "Exists"
effect: "NoSchedule"
pods/pod-with-toleration.yaml
https://kubernetes.io/pt-br/docs/concepts/_print/ 127/178
5/14/22, 11:16 AM Conceitos | Kubernetes
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "example-key"
operator: "Exists"
effect: "NoSchedule"
o valor de operator é Exists (no caso nenhum value deve ser especificado), ou
o valor de operator é Equal e os valores de value são iguais.
Nota:
Existem dois casos especiais:
Uma key vazia com o operador Exists "casa" todas as chaves, valores e efeitos, o que
significa que o pod irá tolerar tudo.
O exemplo acima usou effect de NoSchedule . De forma alternativa, você pode usar
effect de PreferNoSchedule .
Nesse efeito, o sistema tentará evitar que o pod seja alocado
ao nó caso ele não tolere os taints definidos, contudo a alocação não será evitada de forma
obrigatória. Pode-se dizer que o PreferNoSchedule é uma versão permissiva do NoSchedule .
O terceiro tipo de effect é o NoExecute que será descrito posteriormente.
Você pode colocar múltiplos taints no mesmo nó e múltiplas tolerâncias no mesmo pod.
O
jeito que o Kubernetes processa múltiplos taints e tolerâncias é como um filtro: começa com
todos os taints de um nó, em seguida ignora aqueles para os quais o pod tem uma tolerância
relacionada; os taints restantes que não foram ignorados indicam o efeito no pod. Mais
especificamente,
se existe pelo menos um taint não tolerado com o efeito NoSchedule , o Kubernetes não
alocará o pod naquele nó
se existe um taint não tolerado com o efeito NoSchedule , mas existe pelo menos um
taint não tolerado com o efeito PreferNoSchedule , o Kubernetes tentará não alocar o
pod no nó
se existe pelo menos um taint não tolerado com o efeito NoExecute , o pod será expulso
do nó (caso já esteja em execução) e não será alocado ao nó (caso ainda não esteja em
execução).
https://kubernetes.io/pt-br/docs/concepts/_print/ 128/178
5/14/22, 11:16 AM Conceitos | Kubernetes
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
Nesse caso, o pod não será alocado ao nó porque não possui uma tolerância para o terceiro
taint. Porém, se ele já estiver rodando no nó quando o taint foi adicionado, não será afetado
e continuará rodando, tendo em vista que o terceiro taint é o único não tolerado pelo pod.
Normalmente, se um taint com o efeito NoExecute é adicionado a um nó, qualquer pod que
não o tolere será expulso imediatamente e pods que o toleram nunca serão expulsos.
Contudo, uma tolerância com efeito NoExecute pode especificar de forma opcional o campo
tolerationSeconds , que determina quanto tempo o pod continuará alocado ao nó depois
que o taint é adicionado. Por exemplo,
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 3600
significa que se esse pod está sendo executado e um taint correspondente é adicionado ao
nó, o pod irá continuar rodando neste nó por 3600 segundos e depois será expulso. Se o taint
for removido antes desse tempo acabar, o pod não será expulso.
Nós Dedicados: Se você quiser dedicar um conjunto de nós para uso exclusivo de um
conjunto específico de usuários, poderá adicionar um taint nesses nós. (digamos,
kubectl taint nodes nodename dedicated=groupName:NoSchedule ) e em seguida
adicionar uma tolerância correspondente para seus pods (isso seria feito mais
facilmente com a escrita de um controlador de admissão customizado).
Os pods com
tolerância terão sua execução permitida nos nós com taints (dedicados), assim como em
qualquer outro nó no cluster. Se você quiser dedicar nós a esses pods e garantir que
eles usem apenas os nós dedicados, precisará adicionar uma label similar ao taint para o
mesmo conjunto de nós (por exemplo, dedicated=groupName ), e o controle de admissão
deverá adicionar uma afinidade de nó para exigir que os pods podem ser executados
apenas nos nós definidos com a label dedicated=groupName .
Nós com hardware especial: Em um cluster no qual um pequeno grupo de nós possui
hardware especializado (por exemplo, GPUs), é desejável manter pods que não
necessitem desse tipo de hardware fora desses nós, dessa forma o recurso estará
disponível para pods que precisem do hardware especializado. Isso pode ser feito
aplicando taints nos nós com o hardware especializado (por exemplo, kubectl taint
nodes nodename special=true:NoSchedule or kubectl taint nodes nodename
special=true:PreferNoSchedule ) e aplicando uma tolerância correspondente nos pods
que usam o hardware especial. Assim como no caso de uso de nós dedicados, é
provavelmente mais fácil aplicar as tolerâncias utilizando um controlador de admissão.
https://kubernetes.io/pt-br/docs/concepts/_print/ 129/178
5/14/22, 11:16 AM Conceitos | Kubernetes
O efeito de taint NoExecute , mencionado acima, afeta pods que já estão rodando no nó da
seguinte forma
Nota: A camada de gerenciamento limita a taxa de adição de novos taints aos nós. Esse
limite gerencia o número de expulsões que são disparadas quando muitos nós se tornam
inalcançáveis ao mesmo tempo (por exemplo: se ocorre uma falha na rede).
Você pode especificar tolerationSeconds em um Pod para definir quanto tempo ele ficará
alocado em um nó que está falhando ou está sem resposta.
Por exemplo, você talvez queira manter uma aplicação com vários estados salvos localmente
alocado em um nó por um longo período na ocorrência de uma divisão na rede, esperando
que essa divisão se recuperará e assim a expulsão do pod pode ser evitada.
A tolerância que
você define para esse Pod poderia ficar assim:
https://kubernetes.io/pt-br/docs/concepts/_print/ 130/178
5/14/22, 11:16 AM Conceitos | Kubernetes
tolerations:
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 6000
Nota:
O Kubernetes automaticamente adiciona uma tolerância para node.kubernetes.io/not-
ready e node.kubernetes.io/unreachable com tolerationSeconds=300 , a menos que
você, ou um controlador, defina essas tolerâncias explicitamente.
Pods do tipo DaemonSet são criados com tolerâncias NoExecute sem a propriedade
tolerationSeconds para os seguintes taints:
node.kubernetes.io/unreachable
node.kubernetes.io/not-ready
Isso garante que esses pods do DaemonSet nunca sejam expulsos por conta desses
problemas.
O agendador verifica taints, não condições de nó, quando realiza suas decisões de
agendamento. Isso garante que as condições de nó não afetem diretamente o agendamento.
Por exemplo, se a condição de nó DiskPressure está ativa, a camada de gerenciamento
adiciona o taint node.kubernetes.io/disk-pressure e não aloca novos pods no nó afetado.
Se a condição MemoryPressure está ativa, a camada de gerenciamento adiciona o taint
node.kubernetes.io/memory-pressure .
node.kubernetes.io/memory-pressure
node.kubernetes.io/disk-pressure
Adicionando essas tolerâncias garante retro compatibilidade. Você também pode adicionar
tolerâncias de forma arbitrária aos DaemonSets.
Próximos passos
Leia sobre Node-pressure Eviction e como você pode configurá-la
https://kubernetes.io/pt-br/docs/concepts/_print/ 131/178
5/14/22, 11:16 AM Conceitos | Kubernetes
https://kubernetes.io/pt-br/docs/concepts/_print/ 132/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Se você quiser entender por que os Pods são alocados em um Node específico
ou se planeja
implementar um escalonador personalizado, esta página ajudará você a
aprender sobre
escalonamento.
kube-scheduler
kube-scheduler
é o escalonador padrão do Kubernetes e é executado como parte do
control plane.
O kube-scheduler é projetado para que, se você quiser e precisar, possa
escrever seu próprio componente de escalonamento e usá-lo.
Fatores que precisam ser levados em consideração para decisões de escalonamento incluem
requisitos individuais e coletivos de recursos,
restrições de hardware / software / política,
especificações de afinidade e anti-afinidade,
localidade de dados, interferência entre cargas
de trabalho e assim por diante.
1. Filtragem
2. Pontuação
Por fim, o kube-scheduler atribui o Pod ao Node com a classificação mais alta.
Se houver mais
de um Node com pontuações iguais, o kube-scheduler seleciona
um deles aleatoriamente.
https://kubernetes.io/pt-br/docs/concepts/_print/ 133/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Próximos passos
Leia sobre ajuste de desempenho do escalonador
Leia sobre restrições de propagação da topologia de pod
Leia a documentação de referência para o kube-scheduler
Aprenda como configurar vários escalonadores
Aprenda sobre políticas de gerenciamento de topologia
Aprenda sobre Pod Overhead
Saiba mais sobre o agendamento de pods que usam volumes em:
Suporte de topologia de volume
Rastreamento de capacidade de armazenamento
Limites de volumes específicos do nó
https://kubernetes.io/pt-br/docs/concepts/_print/ 134/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Quando você executa um Pod num nó, o próprio Pod usa uma quantidade de recursos do
sistema. Estes
recursos são adicionais aos recursos necessários para executar o(s)
contêiner(s) dentro do Pod.
Sobrecarga de Pod, do inglês Pod Overhead, é uma funcionalidade
que serve para contabilizar os recursos consumidos pela
infraestrutura do Pod para além das
solicitações e limites do contêiner.
Exemplo de uso
Para usar a funcionalidade PodOverhead, é necessário uma RuntimeClass que define o
campo overhead .
Por exemplo, poderia usar a definição da RuntimeClass abaixo com um
agente de execução de contêiner virtualizado
que use cerca de 120MiB por Pod para a
máquina virtual e o sistema operacional convidado:
---
kind: RuntimeClass
apiVersion: node.k8s.io/v1beta1
metadata:
name: kata-fc
handler: kata-fc
overhead:
podFixed:
memory: "120Mi"
cpu: "250m"
As cargas de trabalho que são criadas e que especificam o manipulador RuntimeClass kata-
fc irão
usar a sobrecarga de memória e cpu em conta para os cálculos da quota de recursos,
agendamento de nós,
assim como dimensionamento do cgroup do Pod.
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
runtimeClassName: kata-fc
containers:
- name: busybox-ctr
image: busybox
stdin: true
tty: true
resources:
https://kubernetes.io/pt-br/docs/concepts/_print/ 135/178
5/14/22, 11:16 AM Conceitos | Kubernetes
limits:
cpu: 500m
memory: 100Mi
- name: nginx-ctr
image: nginx
resources:
limits:
cpu: 1500m
memory: 100Mi
A saída é:
map[cpu:250m memory:120Mi]
Se for definido um ResourceQuota, a soma das requisições dos contêineres assim como o
campo overhead são contados.
Quando o kube-scheduler está decidindo que nó deve executar um novo Pod, o agendador
considera o overhead do pod,
assim como a soma de pedidos aos contêineres para esse
Pod. Para este exemplo, o agendador adiciona as requisições e a sobrecarga, depois procura
um nó com 2.25 CPU e 320 MiB de memória disponível.
Assim que um Pod é agendado a um nó, o kubelet nesse nó cria um novo cgroup
para o Pod.
É dentro deste Pod que o agente de execução de contêiners subjacente vai criar contêineres.
Se o recurso tiver um limite definido para cada contêiner (QoS garantida ou Burstrable QoS
com limites definidos),
o kubelet definirá um limite superior para o cgroup do Pod associado
a esse recurso (cpu.cfs_quota_us para CPU
e memory.limit_in_bytes de memória). Este limite
superior é baseado na soma dos limites do contêiner mais o overhead
definido no PodSpec.
Para CPU, se o Pod for QoS garantida ou Burstrable QoS, o kubelet vai definir cpu.shares
baseado na soma dos
pedidos ao contêiner mais o overhead definido no PodSpec.
https://kubernetes.io/pt-br/docs/concepts/_print/ 136/178
5/14/22, 11:16 AM Conceitos | Kubernetes
A saída mostra que 2250m CPU e 320MiB de memória são solicitados, que inclui
PodOverhead:
O caminho do cgroup resultante inclui o contêiner pause do Pod. O cgroup no nível do Pod
está um diretório acima.
"cgroupsPath": "/kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2/7ccf55a
# Mude também o nome do cgroup para combinar com o cgroup alocado ao Pod.
cat /sys/fs/cgroup/memory/kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2/memor
335544320
Observabilidade
Uma métrica kube_pod_overhead está disponível em kube-state-metrics
para ajudar a
identificar quando o PodOverhead está sendo utilizado e para ajudar a observar a estabilidade
das cargas de trabalho
em execução com uma sobrecarga (Overhead) definida. Esta
funcionalidade não está disponível na versão 1.9 do kube-state-metrics,
mas é esperado em
uma próxima versão. Os usuários necessitarão entretanto construir o kube-state-metrics a
partir do código fonte.
https://kubernetes.io/pt-br/docs/concepts/_print/ 137/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Próximos passos
RuntimeClass
PodOverhead Design
https://kubernetes.io/pt-br/docs/concepts/_print/ 138/178
5/14/22, 11:16 AM Conceitos | Kubernetes
11 - Administração de Cluster
Detalhes de baixo nível relevantes para criar ou administrar um cluster
Kubernetes.
A visão geral da administração do cluster é para qualquer pessoa que crie ou administre um
cluster do Kubernetes.
É pressuposto alguma familiaridade com os conceitos principais do
Kubernetes.
Planejando um cluster
Consulte os guias em Configuração para exemplos de como planejar, instalar e configurar
clusters Kubernetes. As soluções listadas neste artigo são chamadas de distros.
Nota: Nem todas as distros são mantidas ativamente. Escolha distros que foram testadas
com uma versão recente do Kubernetes.
Gerenciando um cluster
Aprenda como gerenciar nós.
Aprenda a configurar e gerenciar a quota de recursos para clusters compartilhados.
Protegendo um cluster
Gerar Certificados descreve os passos para gerar certificados usando diferentes cadeias
de ferramentas.
Protegendo o kubelet
Comunicação Control Plane-Nó
TLS bootstrapping
Autenticação/autorização do kubelet
https://kubernetes.io/pt-br/docs/concepts/_print/ 140/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Planejando um cluster
Veja os guias em Setup para exemplos de como planejar, iniciar e configurar clusters
Kubernetes. As soluções listadas neste artigo são chamadas distros.
Seu cluster será on-premises, ou in the cloud (IaaS)? Kubernetes não suporta
diretamente clusters híbridos. Em vez disso, você pode configurar vários clusters.
Você quer apenas rodar um cluster, ou você espera fazer desenvolvimento ativo do
código de projeto do Kubernetes? Se for a segunda opção, escolha uma distro mais
ativa. Algumas distros fornecem apenas binários, mas oferecem uma maior variedade
de opções.
Nota: Nem todas as distros são ativamente mantidas. Escolha as distros que foram testadas
com uma versão recente do Kubernetes.
Gerenciando um cluster
Gerenciando um cluster descreve vários tópicos relacionados ao ciclo de vida de um
cluster: criando um novo cluster, atualizando o nó mestre e os nós de trabalho do
cluster, executando manutenção de nó (por exemplo, atualizações de kernel) e
atualizando a versão da API do Kubernetes de um cluster em execução.
Protegendo um cluster
Certificados descreve as etapas para gerar certificados usando diferentes ferramentas.
https://kubernetes.io/pt-br/docs/concepts/_print/ 141/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Auditando
descreve como interagir com os logs de auditoria do Kubernetes.
Protegendo o kubelet
Comunicação Master-Node
TLS bootstrapping
Autenticação/Autorização Kubelet
https://kubernetes.io/pt-br/docs/concepts/_print/ 142/178
5/14/22, 11:16 AM Conceitos | Kubernetes
11.2 - Certificates
Ao usar um client para autenticação de certificado, você pode gerar certificados
manualmente através easyrsa , openssl ou cfssl .
easyrsa
easyrsa pode gerar manualmente certificados para o seu cluster.
cd easy-rsa-master/easyrsa3
./easyrsa init-pki
./easyrsa --subject-alt-name="IP:${MASTER_IP},"\
"IP:${MASTER_CLUSTER_IP},"\
"DNS:kubernetes,"\
"DNS:kubernetes.default,"\
"DNS:kubernetes.default.svc,"\
"DNS:kubernetes.default.svc.cluster,"\
"DNS:kubernetes.default.svc.cluster.local" \
--days=10000 \
--client-ca-file=/yourdirectory/ca.crt
--tls-cert-file=/yourdirectory/server.crt
--tls-private-key-file=/yourdirectory/server.key
openssl
openssl pode gerar manualmente certificados para o seu cluster.
2. De acordo com o ca.key, gere um ca.crt (use -days para definir o tempo efetivo do
certificado):
https://kubernetes.io/pt-br/docs/concepts/_print/ 143/178
5/14/22, 11:16 AM Conceitos | Kubernetes
openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 100
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
C = <country>
ST = <state>
L = <city>
O = <organization>
OU = <organization unit>
CN = <MASTER_IP>
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster
DNS.5 = kubernetes.default.svc.cluster.local
IP.1 = <MASTER_IP>
IP.2 = <MASTER_CLUSTER_IP>
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names
7. Veja o certificado:
https://kubernetes.io/pt-br/docs/concepts/_print/ 144/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Por fim, adicione os mesmos parâmetros nos parâmetros iniciais do Servidor de API.
cfssl
cfssl é outra ferramenta para geração de certificados.
chmod +x cfssl
chmod +x cfssljson
mkdir cert
cd cert
3. Crie um arquivo de configuração JSON para gerar o arquivo CA, por exemplo, ca-
config.json :
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
https://kubernetes.io/pt-br/docs/concepts/_print/ 145/178
5/14/22, 11:16 AM Conceitos | Kubernetes
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names":[{
"C": "<country>",
"ST": "<state>",
"L": "<city>",
"O": "<organization>",
}]
6. Crie um arquivo de configuração JSON para gerar chaves e certificados para o Servidor
de API, por exemplo, server-csr.json . Certifique-se de substituir os valores entre
colchetes angulares por valores reais que você deseja usar. O MASTER_CLUSTER_IP é o IP
do serviço do cluster para o servidor da API, conforme descrito na subseção anterior. O
exemplo abaixo também assume que você está usando cluster.local como DNS de
domínio padrão
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"<MASTER_IP>",
"<MASTER_CLUSTER_IP>",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"C": "<country>",
"ST": "<state>",
"L": "<city>",
"O": "<organization>",
}]
7. Gere a chave e o certificado para o Servidor de API, que são, por padrão, salvos nos
arquivos server-key.pem e server.pem respectivamente:
--config=ca-config.json -profile=kubernetes \
https://kubernetes.io/pt-br/docs/concepts/_print/ 146/178
5/14/22, 11:16 AM Conceitos | Kubernetes
sudo update-ca-certificates
done.
API de certificados
Você pode usar a API certificates.k8s.io para provisionar
certificados x509 a serem
usados para autenticação conforme documentado
aqui.
https://kubernetes.io/pt-br/docs/concepts/_print/ 147/178
5/14/22, 11:16 AM Conceitos | Kubernetes
A alocação dinâmica de portas traz uma série de complicações para o sistema - toda
aplicação deve obter suas portas através de flags de configuração, os servidores de API
devem saber como inserir números dinämicos de portas nos blocos de configuração, serviços
precisam saber como buscar um ao outro, etc. Ao invés de lidar com isso, o Kubernetes
faz
de uma maneira diferente.
pods em um nó podem se comunicar com todos os pods em todos os nós sem usar
NAT.
agentes em um nó (por exemplo o kubelet ou um serviço local) podem se comunicar
com
todos os Pods naquele nó.
Nota: Para as plataformas que suportam Pods executando na rede do host (como o Linux):
https://kubernetes.io/pt-br/docs/concepts/_print/ 148/178
5/14/22, 11:16 AM Conceitos | Kubernetes
É possível solicitar uma porta no nó que será encaminhada para seu Pod (chamado
de portas
do host), mas isso é uma operação muito específica. Como esse encaminhamento
é
implementado é um detalhe do agente de execução do contêiner. O Pod mesmo
desconhece a existência ou não de portas do host.
Nota:
Esta seção tem links para projetos de terceiros que fornecem a funcionalidade
exigida pelo Kubernetes. Os autores do projeto Kubernetes não são responsáveis por
esses projetos. Esta página obedece as diretrizes de conteúdo do site CNCF, listando os
itens em ordem alfabética. Para adicionar um projeto a esta lista, leia o guia de conteúdo
antes de enviar sua alteração.
Antrea
O projeto Antrea é uma solução de
conectividade para Kubernetes que pretende ser nativa.
Ela utiliza o Open vSwitch
na camada de conectividade de dados. O Open vSwitch é um switch
virtual de alta
performance e programável que suporta Linux e Windows. O Open vSwitch
permite
ao Antrea implementar políticas de rede do Kubernetes (NetworkPolicies) de
uma
forma muito performática e eficiente.
O uso desse plugin permite aos Pods no Kubernetes ter o mesmo endereço de IP dentro do
pod como se eles estivessem dentro da rede do VPC. O CNI (Container Network Interface)
aloca um Elastic Networking Interface (ENI) para cada nó do Kubernetes e usa uma
faixa de
endereços IP secundário de cada ENI para os Pods no nó. O CNI inclui
controles para pré
alocação dos ENIs e endereços IP para um início mais rápido dos
pods e permite clusters com
até 2,000 nós.
Calico
Calico é uma solução de conectividade e
segurança para contêineres, máquinas virtuais e
serviços nativos em hosts. O
Calico suporta múltiplas camadas de conectividade/dados, como
por exemplo:
uma camada Linux eBPF nativa, uma camada de conectividade baseada em
conceitos
padrão do Linux e uma camada baseada no HNS do Windows. O calico provê uma
camada completa de conectividade e rede, mas também pode ser usado em conjunto com
CNIs de provedores de nuvem
para permitir a criação de políticas de rede.
Cilium
Cilium é um software de código fonte aberto
para prover conectividade e segurança entre
contêineres de aplicação. O Cilium
pode lidar com tráfego na camada de aplicação (ex. HTTP)
e pode forçar políticas
de rede nas camadas L3-L7 usando um modelo de segurança baseado
em identidade e
desacoplado do endereçamento de redes, podendo inclusive ser utilizado
com outros
plugins CNI.
Flannel
Flannel é uma camada muito simples
de conectividade que satisfaz os requisitos do
Kubernetes. Muitas pessoas
reportaram sucesso em utilizar o Flannel com o Kubernetes.
O Docker irá agora alocar IPs do bloco cbr-cidr . Contêineres podem alcançar
outros
contêineres e nós através da interface cbr0 . Esses IPs são todos roteáveis
dentro da rede do
projeto do GCE.
O GCE mesmo não sabe nada sobre esses IPs, então não irá mascará-los quando tentarem
se
comunicar com a internet. Para permitir isso uma regra de IPTables é utilizada para
mascarar
o tráfego para IPs fora da rede do projeto do GCE (no exemplo abaixo, 10.0.0.0/8):
https://kubernetes.io/pt-br/docs/concepts/_print/ 150/178
5/14/22, 11:16 AM Conceitos | Kubernetes
sysctl net.ipv4.ip_forward=1
O resultado disso tudo é que Pods agora podem alcançar outros Pods e podem também
se
comunicar com a Internet.
Kube-router
Kube-router é uma solução construída
que visa prover alta performance e simplicidade
operacional. Kube-router provê um
proxy de serviços baseado no LVS/IPVS,
uma solução de
comunicação pod-para-pod baseada em encaminhamento de pacotes Linux e sem camadas
adicionais, e funcionalidade de políticas de redes baseadas no IPTables/IPSet.
Próximos passos
Design inicial do modelo de conectividade do Kubernetes e alguns planos futuros
estão
descritos com maiores detalhes no
documento de design de redes.
https://kubernetes.io/pt-br/docs/concepts/_print/ 151/178
5/14/22, 11:16 AM Conceitos | Kubernetes
debug/counter-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
image: busybox
A saída será:
pod/counter created
https://kubernetes.io/pt-br/docs/concepts/_print/ 152/178
5/14/22, 11:16 AM Conceitos | Kubernetes
A saída será:
...
Você pode usar kubectl logs para recuperar logs de uma instanciação anterior de um
contêiner com o sinalizador --previous , caso o contêiner tenha falhado. Se o seu pod tiver
vários contêineres, você deverá especificar quais logs do contêiner você deseja acessar
anexando um nome de contêiner ao comando. Veja a documentação do kubectl logs para
mais destalhes.
Logs no nível do Nó
Nota: O driver de log json do Docker trata cada linha como uma mensagem separada. Ao
usar o driver de log do Docker, não há suporte direto para mensagens de várias linhas.
Você precisa lidar com mensagens de várias linhas no nível do agente de log ou superior.
Por padrão, se um contêiner reiniciar, o kubelet manterá um contêiner terminado com seus
logs. Se um pod for despejado do nó, todos os contêineres correspondentes também serão
despejados, juntamente com seus logs.
Como exemplo, você pode encontrar informações detalhadas sobre como o kube-up.sh
define o log da imagem COS no GCP no script correspondente.
Quando você executa kubectl logs como no exemplo de log básico acima, o kubelet no nó
lida com a solicitação e lê diretamente do arquivo de log, retornando o conteúdo na resposta.
https://kubernetes.io/pt-br/docs/concepts/_print/ 153/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Você pode implementar o log em nível de cluster incluindo um agente de log em nível de nó em
cada nó. O agente de log é uma ferramenta dedicada que expõe logs ou envia logs para um
back-end. Geralmente, o agente de log é um contêiner que tem acesso a um diretório com
arquivos de log de todos os contêineres de aplicativos nesse nó.
Como o agente de log deve ser executado em todos os nós, é comum implementá-lo como
uma réplica do DaemonSet, um pod de manifesto ou um processo nativo dedicado no nó. No
entanto, as duas últimas abordagens são obsoletas e altamente desencorajadas.
https://kubernetes.io/pt-br/docs/concepts/_print/ 154/178
5/14/22, 11:16 AM Conceitos | Kubernetes
O Kubernetes não especifica um agente de log, mas dois agentes de log opcionais são
fornecidos com a versão Kubernetes: Stackdriver Logging para uso com o Google Cloud
Platform e Elasticsearch. Você pode encontrar mais informações e instruções nos
documentos dedicados. Ambos usam fluentd com configuração customizada como um
agente no nó.
Fazendo com que seus contêineres de sidecar fluam para seus próprios stdout e stderr ,
você pode tirar proveito do kubelet e do agente de log que já executam em cada nó. Os
contêineres sidecar lêem logs de um arquivo, socket ou journald. Cada contêiner sidecar
individual imprime o log em seu próprio stdout ou stderr stream.
Essa abordagem permite separar vários fluxos de logs de diferentes partes do seu aplicativo,
algumas das quais podem não ter suporte para gravar em stdout ou stderr . A lógica por
trás do redirecionamento de logs é mínima, portanto dificilmente representa uma sobrecarga
significativa. Além disso, como stdout e stderr são manipulados pelo kubelet, você pode
usar ferramentas internas como o kubectl logs .
Considere o seguinte exemplo. Um pod executa um único contêiner e grava em dois arquivos
de log diferentes, usando dois formatos diferentes. Aqui está um arquivo de configuração
para o Pod:
admin/logging/two-files-counter-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
https://kubernetes.io/pt-br/docs/concepts/_print/ 155/178
5/14/22, 11:16 AM Conceitos | Kubernetes
image: busybox
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
i=$((i+1));
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
emptyDir: {}
Seria uma bagunça ter entradas de log de diferentes formatos no mesmo fluxo de logs,
mesmo se você conseguisse redirecionar os dois componentes para o fluxo stdout do
contêiner. Em vez disso, você pode introduzir dois contêineres sidecar. Cada contêiner
sidecar pode direcionar um arquivo de log específico de um volume compartilhado e depois
redirecionar os logs para seu próprio fluxo stdout .
Aqui está um arquivo de configuração para um pod que possui dois contêineres sidecar:
admin/logging/two-files-counter-pod-streaming-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
image: busybox
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
i=$((i+1));
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
- name: count-log-1
image: busybox
volumeMounts:
- name: varlog
mountPath: /var/log
- name: count-log-2
image: busybox
volumeMounts:
- name: varlog
mountPath: /var/log
https://kubernetes.io/pt-br/docs/concepts/_print/ 156/178
5/14/22, 11:16 AM Conceitos | Kubernetes
volumes:
- name: varlog
emptyDir: {}
Agora, quando você executa este pod, é possível acessar cada fluxo de log separadamente,
executando os seguintes comandos:
...
...
Observe que, apesar do baixo uso da CPU e da memória (ordem de alguns milicores por CPU
e ordem de vários megabytes de memória), gravar logs em um arquivo e depois transmiti-los
para o stdout pode duplicar o uso do disco. Se você tem um aplicativo que grava em um
único arquivo, geralmente é melhor definir /dev/stdout como destino, em vez de
implementar a abordagem de contêiner de transmissão no sidecar.
Os contêineres sidecar também podem ser usados para rotacionar arquivos de log que não
podem ser rotacionados pelo próprio aplicativo. Um exemplo dessa abordagem é um
pequeno contêiner executando logrotate periodicamente.
No entanto, é recomendável
usar o stdout e o stderr diretamente e deixar as políticas de rotação e retenção no
kubelet.
Se o agente de log no nível do nó não for flexível o suficiente para sua situação, você poderá
criar um contêiner secundário com um agente de log separado que você configurou
especificamente para executar com seu aplicativo.
https://kubernetes.io/pt-br/docs/concepts/_print/ 157/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Como exemplo, você pode usar o Stackdriver, que usa fluentd como um agente de log. Aqui
estão dois arquivos de configuração que você pode usar para implementar essa abordagem.
O primeiro arquivo contém um ConfigMap para configurar o fluentd.
admin/logging/fluentd-sidecar-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-config
data:
fluentd.conf: |
<source>
type tail
format none
path /var/log/1.log
pos_file /var/log/1.log.pos
tag count.format1
</source>
<source>
type tail
format none
path /var/log/2.log
pos_file /var/log/2.log.pos
tag count.format2
</source>
<match **>
type google_cloud
</match>
Nota: A configuração do fluentd está além do escopo deste artigo. Para obter
informações sobre como configurar o fluentd, consulte a documentação oficial do
fluentd.
admin/logging/two-files-counter-pod-agent-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
image: busybox
args:
- /bin/sh
- -c
- >
i=0;
while true;
https://kubernetes.io/pt-br/docs/concepts/_print/ 158/178
5/14/22, 11:16 AM Conceitos | Kubernetes
do
i=$((i+1));
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
- name: count-agent
image: k8s.gcr.io/fluentd-gcp:1.30
env:
- name: FLUENTD_ARGS
value: -c /etc/fluentd-config/fluentd.conf
volumeMounts:
- name: varlog
mountPath: /var/log
- name: config-volume
mountPath: /etc/fluentd-config
volumes:
- name: varlog
emptyDir: {}
- name: config-volume
configMap:
name: fluentd-config
Depois de algum tempo, você pode encontrar mensagens de log na interface do Stackdriver.
Lembre-se de que este é apenas um exemplo e você pode realmente substituir o fluentd por
qualquer agente de log, lendo de qualquer fonte dentro de um contêiner de aplicativo.
Você pode implementar o log no nível do cluster, expondo ou enviando logs diretamente de
todos os aplicativos; no entanto, a implementação desse mecanismo de log está fora do
escopo do Kubernetes.
https://kubernetes.io/pt-br/docs/concepts/_print/ 159/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Klog
Klog é a biblioteca de logs do Kubernetes. Responsável por gerar as mensagens de log para
os componentes do sistema.
Logs Estruturados
FEATURE STATE: Kubernetes v1.19 [alpha]
Aviso:
A migração pro formato de logs estruturados é um processo em andamento. Nem todos
os logs estão dessa forma na versão atual. Sendo assim, para realizar o processamento
de arquivos de log, você também precisa lidar com logs não estruturados.
A estruturação dos logs trás uma estrutura uniforme para as mensagens de log, permitindo a
extração programática de informações. Logs estruturados podem ser armazenados e
processados com menos esforço e custo. Esse formato é totalmente retrocompatível e é
habilitado por padrão.
Exemplo:
Aviso:
Algumas opções da biblioteca klog ainda não funcionam com os logs em formato JSON.
Para ver uma lista completa de quais são estas, veja a documentação da ferramenta de
linha de comando.
https://kubernetes.io/pt-br/docs/concepts/_print/ 160/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Nem todos os logs estarão garantidamente em formato JSON (como por exemplo
durante o início de processos). Sendo assim, se você pretende realizar o processamento
dos logs, seu código deverá saber tratar também linhas que não são JSON.
A opção --logging-format=json muda o formato dos logs, do formato padrão da klog para
JSON. Abaixo segue um exemplo de um log em formato JSON (identado):
"ts": 1580306777.04728,
"v": 4,
"pod":{
"name": "nginx-1",
"namespace": "default"
},
"status": "ready"
}
kube-controller-manager
kube-apiserver
kube-scheduler
kubelet
kube-controller-manager
kube-apiserver
kube-scheduler
kubelet
Nota: O filtro de limpeza dos logs não impede a exposição de dados sensíveis nos logs
das aplicações em execução.
A opção -v controla o nível de detalhe dos logs. Um valor maior aumenta o número de
eventos registrados, começando a registrar também os eventos menos importantes.
Similarmente, um valor menor restringe os logs apenas aos eventos mais importantes. O
valor padrão 0 registra apenas eventos críticos.
Próximos passos
Leia sobre Arquitetura de Logs do Kubernetes
Leia sobre Logs Estruturados
Leia sobre Convenções sobre os níveis de logs
https://kubernetes.io/pt-br/docs/concepts/_print/ 162/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Métricas no Kubernetes
Na maioria dos casos, as métricas estão disponíveis no endpoint /metrics do servidor HTTP.
Para componentes que não expõem o endpoint por padrão, ele pode ser ativado usando a
flag --bind-address .
kube-controller-manager
kube-proxy
kube-apiserver
kube-scheduler
kubelet
Se o seu cluster usa RBAC, ler as métricas requer autorização por meio de um usuário, grupo
ou ServiceAccount com um ClusterRole que conceda o acesso ao /metrics .
Por exemplo:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- nonResourceURLs:
- "/metrics"
verbs:
- get
A métrica alfa não tem garantias de estabilidade. Essas métricas podem ser modificadas ou
deletadas a qualquer momento.
Métricas estáveis possuem a garantia de que não serão alteradas. Isso significa:
Uma métrica estável sem uma assinatura ultrapassada não será deletada ou
renomeada
O tipo de uma métrica estável não será modificado
As métricas ultrapassadas estão programadas para exclusão, mas ainda estão disponíveis
para uso.
Essas métricas incluem uma anotação sobre a versão em que se tornarão
ultrapassadas.
https://kubernetes.io/pt-br/docs/concepts/_print/ 163/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Por exemplo:
some_counter 0
some_counter 0
Métricas ocultas não são mais publicadas para extração, mas ainda estão disponíveis para
uso. Para usar uma métrica oculta, por favor consulte a seção mostrar métricas ocultas.
Métricas excluídas não estão mais disponíveis e não podem mais ser usadas.
A flag show-hidden-metrics-for-version usa uma versão para a qual você deseja mostrar
métricas ultrapassadas nessa versão. A versão é expressada como x.y, onde x é a versão
principal e y a versão secundária. A versão de patch não é necessária mesmo que uma
métrica possa ser descontinuada em uma versão de patch, o motivo é que a política de
descontinuação de métricas é executada na versão secundária.
A flag só pode usar a versão secundária anterior como seu valor. Todas as métricas ocultas
no anterior serão emitidas se os administradores definirem a versão anterior como show-
hidden-metrics-for-version . A versão muito antiga não é permitida porque viola a política
de métricas ultrapassadas.
Utilize a métrica A como exemplo, assumindo que A está obsoleto em 1.n. De acordo com a
política de métricas ultrapassadas, podemos chegar à seguinte conclusão:
Na versão 1.n , a métrica está ultrapassada, e pode ser emitida por padrão.
Na versão 1.n+1 , a métrica está oculta por padrão e pode ser emitida via linha de
comando show-hidden-metrics-for-version=1.n .
Na versão 1.n+2 , a métrica deve ser removida do código fonte. Não há mais escape
hatch.
Se você está atualizando da versão 1.12 para 1.13 , mas ainda depende da métrica A
ultrapassada em 1.12 , você deve definir métricas ocultas via linha de comando: --show-
hidden-metrics=1.12 e lembre-se de remover essa dependência de métrica antes de
atualizar para 1.14 .
Métricas de componentes
Métricas do kube-controller-manager
As métricas do controller manager fornecem informações importantes sobre o desempenho e
a integridade do controller manager.
Essas métricas incluem métricas comuns do agente de
execução da linguagem Go, tais como a quantidade de go_routine e métricas específicas do
controller, como latência de requisições etcd ou latência da API dos provedores de serviços de
nuvem (AWS, GCE, OpenStack), que podem ser usadas para medir a integridade de um
cluster.
Métricas do kube-scheduler
FEATURE STATE: Kubernetes v1.21 [beta]
namespace
nome do pod
o nó onde o pod está programado ou uma string vazia caso ainda não esteja
programado
prioridade
o scheduler atribuído para esse pod
o nome do recurso (por exemplo, cpu )
a unidade do recurso, se conhecida (por exemplo, cores )
Uma vez que o pod alcança um estado de conclusão (sua restartPolicy está como Never
ou onFailure e está na fase de Succeeded ou Failed , ou foi deletado e todos os
contêineres tem um estado de terminado), a série não é mais relatada já que o scheduler
agora está livre para agendar a execução de outros pods. As duas métricas são chamadas de
kube_pod_resource_request e kube_pod_resource_limit .
https://kubernetes.io/pt-br/docs/concepts/_print/ 165/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Desativando métricas
Você pode desativar explicitamente as métricas via linha de comando utilizando a flag --
disabled-metrics . Isso pode ser desejado se, por exemplo, uma métrica estiver causando
um problema de desempenho. A entrada é uma lista de métricas desabilitadas (ou seja, --
disabled-metrics=metric1,metric2 ).
No estágio alfa, a flag pode receber apenas uma série de mapeamentos como lista de
permissões de labels para uma métrica.
Cada mapeamento tem o formato <metric_name>,
<label_name>=<allowed_labels> onde <allowed_labels> é uma lista separada por vírgulas
de nomes aceitáveis para a label.
Por exemplo:
--allow-label-value number_count_metric,odd_number='1,3,5',
number_count_metric,even_number='2,4,6', date_gauge_metric,weekend='Saturday,Sunday'
Próximos passos
Leia sobre o formato de texto do Prometheus para métricas
Veja a lista de métricas estáveis do Kubernetes
Leia sobre a Política de suspensão de uso do Kubernetes
https://kubernetes.io/pt-br/docs/concepts/_print/ 166/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Coleta de imagens
O Kubernetes gerencia o ciclo de vida de todas as imagens através do imageManager, com a
cooperação do cadvisor.
Coleta de container
A política para o garbage collection de contêineres considera três variáveis definidas pelo
usuário. MinAge é a idade mínima em que um contêiner pode ser coletado.
MaxPerPodContainer é o número máximo de contêineres mortos que todo par de pod (UID,
container name) pode ter. MaxContainers é o número máximo de contêineres mortos totais.
Essas variáveis podem ser desabilitadas individualmente, definindo MinAge como zero e
definindo MaxPerPodContainer e MaxContainers respectivamente para menor que zero.
O Kubelet atuará em contêineres não identificados, excluídos ou fora dos limites definidos
pelos sinalizadores mencionados. Os contêineres mais antigos geralmente serão removidos
primeiro. MaxPerPodContainer e MaxContainer podem potencialmente conflitar entre si em
situações em que a retenção do número máximo de contêineres por pod
( MaxPerPodContainer ) estaria fora do intervalo permitido de contêineres globais mortos
( MaxContainers ). O MaxPerPodContainer seria ajustado nesta situação: O pior cenário seria
fazer o downgrade do MaxPerPodContainer para 1 e remover os contêineres mais antigos.
Além disso, os contêineres pertencentes a pods que foram excluídos são removidos assim
que se tornem mais antigos que MinAge .
Os contêineres que não são gerenciados pelo kubelet não estão sujeitos ao garbage
collection de contêiner.
Configurações do usuário
Os usuários podem ajustar os seguintes limites para ajustar o garbage collection da imagem
com os seguintes sinalizadores do kubelet:
Os contêineres podem ser potencialmente coletados como lixo antes que sua utilidade
expire. Esses contêineres podem conter logs e outros dados que podem ser úteis para
solucionar problemas. Um valor suficientemente grande para maximum-dead-containers-per-
container é altamente recomendado para permitir que pelo menos 1 contêiner morto seja
retido por contêiner esperado. Um valor maior para maximum-dead-containers também é
recomendados por um motivo semelhante.
Consulte esta issue para obter mais detalhes.
Descontinuado
Alguns recursos do Garbage Collection neste documento serão substituídos pelo kubelet
eviction no futuro.
Incluindo:
Próximos passos
Consulte Configurando a Manipulação de Recursos Insuficientes para mais detalhes.
https://kubernetes.io/pt-br/docs/concepts/_print/ 168/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Proxies
Existem vários tipos diferentes de proxies que você pode encontrar usando Kubernetes:
1. O kubectl proxy:
1. O apiserver proxy:
são fornecidos por algum provedor de nuvem (e.x AWS ELB, Google Cloud Load
Balancer)
são criados automaticamente quando o serviço de Kubernetes tem o tipo
LoadBalancer
Os usuários de Kubernetes geralmente não precisam se preocupar com outras coisas além
dos dois primeiros tipos. O
administrador do cluster tipicamente garante que os últimos tipos
serão configurados corretamente.
Redirecionamento de requisições
Os proxies substituíram as capacidades de redirecionamento. O redirecionamento foi
depreciado.
https://kubernetes.io/pt-br/docs/concepts/_print/ 169/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Esta página lista alguns dos complementos disponíveis e links com suas respectivas
instruções de instalação.
Descoberta de Serviço
CoreDNS é um servidor DNS flexível e extensível que pode ser instalado como o serviço
de DNS dentro do cluster para ser utilizado por pods.
Infraestrutura
KubeVirt é um complemento para executar máquinas virtuais no Kubernetes. É
geralmente executado em clusters em máquina física.
Complementos Legados
Existem vários outros complementos documentados no diretório cluster/addons que não são
mais utilizados.
Projetos bem mantidos devem ser listados aqui. PRs são bem-vindos!
https://kubernetes.io/pt-br/docs/concepts/_print/ 171/178
5/14/22, 11:16 AM Conceitos | Kubernetes
12 - Extendendo o Kubernetes
12.1 - Extendendo a API do Kubernetes
Camada de agregação
A camada de agregação executa em processo com o kube-apiserver.
Até que um recurso de
extensão seja registado, a camada de agregação
não fará nada. Para registar uma API, terá de
adicionar um objeto APIService
que irá "reclamar" o caminho URL na API do Kubernetes. Nesta
altura, a camada
de agregação procurará qualquer coisa enviada para esse caminho da API
(e.g. /apis/myextension.mycompany.io/v1/… ) para o APIService registado.
Latência da resposta
Servidores de extensão de APIs devem ter baixa latência de rede de e para o kube-apiserver.
Pedidos de descoberta são necessários que façam a ida e volta do kube-apiserver em 5
segundos ou menos.
Se o seu servidor de extensão da API não puder cumprir com o requisito de latência,
considere fazer alterações que permitam atingi-lo. Pode também definir
portal de
funcionalidade EnableAggregatedDiscoveryTimeout=false no kube-apiserver para desativar
a
restrição de intervalo. Esta portal de funcionalidade deprecado será removido
num
lançamento futuro.
Próximos passos
Para pôr o agregador a funcionar no seu ambiente, configure a camada de agregação.
De seguida, configura um api-server de extensão para funcionar com a camada de
agregação.
Também, aprenda como pode estender a API do Kubernetes através do use de
Definições de Recursos Personalizados.
Leia a especificação do APIService
https://kubernetes.io/pt-br/docs/concepts/_print/ 172/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Instalação
O kubelet possui um plugin único padrão, e um plugin padrão comum para todo o cluster.
Ele
verifica o plugin quando inicia, se lembra o que encontrou, e executa o plugin selecionado
em
momentos oportunos dentro do ciclo de vida de um Pod (isso é verdadeiro apenas com o
Docker,
uma vez que o CRI gerencia seus próprios plugins de CNI). Existem dois parâmetros
de linha de comando
no Kubelet para se ter em mente quando usando plugins:
Por padrão, se nenhum plugin de rede é configurado no kubelet, o plugin noop é utilizado,
que configura net/bridge/bridge-nf-call-iptables=1 para garantir que configurações
simples
(como Docker com bridge Linux) operem corretamente com o proxy iptables.
CNI
O plugin de CNI é selecionado utilizando-se da opção --network-plugin=cni no início do
Kubeket.
O Kubelet lê um arquivo do diretório especificado em --cni-conf-dir (padrão
/etc/cni/net.d )
e usa a configuração de CNI desse arquivo para configurar a rede de cada
Pod. O arquivo de
configuração do CNI deve usar a especificação de CNI,
e qualquer plugin
referenciado nesse arquivo deve estar presente no diretório
--cni-bin-dir (padrão
/opt/cni/bin ).
Suporte a hostPort
https://kubernetes.io/pt-br/docs/concepts/_print/ 173/178
5/14/22, 11:16 AM Conceitos | Kubernetes
O plugin de redes CNI suporta hostPort . Você pode utilizar o plugin oficial
portmap
ou usar
seu próprio plugin com a funcionalidade de portMapping.
"name": "k8s-pod-network",
"cniVersion": "0.3.0",
"plugins": [
{
"type": "calico",
"log_level": "info",
"datastore_type": "kubernetes",
"nodename": "127.0.0.1",
"ipam": {
"type": "host-local",
"subnet": "usePodCidr"
},
"policy": {
"type": "k8s"
},
"kubernetes": {
"kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
},
{
"type": "portmap",
}
]
Se você habilitar o suporte ao controle de banda, você deve adicionar o plugin bandwidth
no
seu arquivo de configuração de CNI (padrão /etc/cni/net.d ) e garantir que o programa
exista no diretório de binários do CNI (padrão /opt/cni/bin ).
"name": "k8s-pod-network",
"cniVersion": "0.3.0",
"plugins": [
{
"type": "calico",
"log_level": "info",
"datastore_type": "kubernetes",
"nodename": "127.0.0.1",
"ipam": {
"type": "host-local",
"subnet": "usePodCidr"
},
"policy": {
"type": "k8s"
},
"kubernetes": {
"kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
},
https://kubernetes.io/pt-br/docs/concepts/_print/ 174/178
5/14/22, 11:16 AM Conceitos | Kubernetes
"type": "bandwidth",
}
]
apiVersion: v1
kind: Pod
metadata:
annotations:
kubernetes.io/ingress-bandwidth: 1M
kubernetes.io/egress-bandwidth: 1M
...
kubenet
Kubenet é um plugin de rede muito simples, existente apenas no Linux. Ele não
implementa
funcionalidades mais avançadas, como rede entre nós ou políticas de rede.
Ele é geralmente
utilizado junto a um provedor de nuvem que configura as regras de
roteamento para
comunicação entre os nós, ou em ambientes com apenas um nó.
O Kubenet cria uma interface bridge no Linux chamada cbr0 e cria um par veth
para cada um
dos pods com o host como a outra ponta desse par, conectado à cbr0 .
Na interface no lado
do Pod um endereço IP é alocado de uma faixa associada ao nó,
sendo parte de alguma
configuração no nó ou pelo controller-manager. Na interface cbr0
é associado o MTU
equivalente ao menor MTU de uma interface de rede do host.
Sempre que necessário, você pode configurar explicitamente o MTU com a opção network-
plugin-mtu
no kubelet. Por exemplo, na AWS o MTU da eth0 geralmente é 9001 então você
deve
especificar --network-plugin-mtu=9001 . Se você estiver usando IPSEC você deve reduzir
o MTU para permitir o encapsulamento excedente; por exemplo: --network-plugin-
mtu=8773 .
Essa opção faz parte do plugin de rede. Atualmente apenas o kubenet suporta a
configuração
network-plugin-mtu .
https://kubernetes.io/pt-br/docs/concepts/_print/ 175/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Resumo de uso
--network-plugin=cni especifica que devemos usar o plugin de redes cni com os
binários do plugin localizados em --cni-bin-dir (padrão /opt/cni/bin ) e as
configurações do plugin localizadas em --cni-conf-dir (default /etc/cni/net.d ).
--network-plugin=kubenet especifica que iremos usar o plugin de rede kubenet
com
os plugins CNI bridge , lo e host-local localizados em /opt/cni/bin ou cni-bin-
dir .
Próximos passos
https://kubernetes.io/pt-br/docs/concepts/_print/ 176/178
5/14/22, 11:16 AM Conceitos | Kubernetes
Motivação
O padrão Operador tem como objetivo capturar o principal objetivo de um operador
humano
que gere um serviço ou um conjunto de serviços. Operadores humanos
responsáveis por
aplicações e serviços específicos têm um conhecimento
profundo da forma como o sistema é
suposto se comportar, como é instalado
e como deve reagir na ocorrência de problemas.
Operadores no Kubernetes
O Kubernetes é desenhado para automação. Out of the box, você tem bastante
automação
embutida no núcleo do Kubernetes. Pode usar
o Kubernetes para automatizar instalações e
executar cargas de trabalho,
e pode ainda automatizar a forma como o Kubernetes faz isso.
O conceito de controlador no
Kubernetes permite a extensão do comportamento sem
modificar o código do próprio
Kubernetes.
Operadores são clientes da API do Kubernetes que
atuam como controladores para
um dado Custom Resource
Exemplo de um Operador
Algumas das coisas que um operador pode ser usado para automatizar incluem:
Como deve um Operador parecer em mais detalhe? Aqui está um exemplo em mais
detalhe:
6. O operador também gere backups regulares da base de dados. Para cada recurso
SampleDB,
o operador determina quando deve criar um Pod que possa se conectar
à
base de dados e faça backups. Esses Pods dependeriam de um ConfigMap
e / ou um
Secret que possui detalhes e credenciais de conexão com à base de dados.
7. Como o Operador tem como objetivo fornecer automação robusta para o recurso
que
gere, haveria código de suporte adicional. Para este exemplo,
O código verifica se a base
de dados está a executar uma versão antiga e, se estiver,
cria objetos Job que o
atualizam para si.
Instalar Operadores
A forma mais comum de instalar um Operador é a de adicionar a
definição personalizada de
recurso (Custom Resource Definition) e
o seu Controlador associado ao seu cluster.
O
Controlador vai normalmente executar fora do
plano de controle,
como você faria com
qualquer aplicação containerizada.
Por exemplo, você pode executar o controlador no seu
cluster como um Deployment.
Usando um Operador
Uma vez que você tenha um Operador instalado, usaria-o adicionando, modificando
ou
apagando a espécie de recurso que o Operador usa. Seguindo o exemplo acima,
você
configuraria um Deployment para o próprio Operador, e depois:
Próximos passos
Aprenda mais sobre Recursos Personalizados
Encontre operadores prontos em OperatorHub.io para o seu caso de uso
Use ferramentes existentes para escrever os seus Operadores:
usando KUDO (Kubernetes Universal Declarative Operator)
usando kubebuilder
usando Metacontroller juntamente com WebHooks que
implementa você mesmo
usando o Operator Framework
Publique o seu operador para que outras pessoas o possam usar
Leia o artigo original da CoreOS que introduz o padrão Operador
Leia um artigo da Google Cloud sobre as melhores práticas para contruir Operadores
https://kubernetes.io/pt-br/docs/concepts/_print/ 178/178