Kubernetes 1.13: Visão geral das principais inovações



No início desta semana , ocorreu o próximo lançamento do Kubernetes, que foi apelidado de "angelical", 1,13 . Este nome está associado ao número 113, que é considerado "angelical" e, de acordo com os desenvolvedores do Kubernetes, simboliza "novos começos, transformação e o fim de um capítulo antes de abrir novos". Sem entrar em uma análise mais aprofundada do simbolismo do que está acontecendo, de acordo com a tradição já estabelecida em nosso blog, relataremos pela sétima vez as principais mudanças na nova versão do Kubernetes, projetada para agradar os engenheiros do DevOps- / SRE que trabalham com este produto.

Como fontes de informação, operamos os dados do rastreamento de aprimoramentos do Kubernetes , da tabela CHANGELOG -1.13 e questões relacionadas, solicitações pull, propostas de aprimoramento do Kubernetes (KEP).

GA para kubeadm


Um dos principais eventos da versão Kubernetes 1.13 foi o anúncio de um status estável (Disponibilidade Geral, GA) para o utilitário do console kubeadm . O blog do K8s até dedicou uma publicação separada a isso . Como muitas pessoas sabem, o kubeadm é uma ferramenta para criar clusters do Kubernetes de acordo com as melhores práticas do projeto, bem como com o suporte mínimo adicional. Uma característica distintiva é que os desenvolvedores se esforçam para mantê-lo compacto e independente do provedor / infraestrutura, sem incluir soluções para problemas como infra-estruturas de provisionamento, soluções de rede de terceiros, complementos (monitoramento, registro etc.), integrações específicas com a nuvem fornecedores.

O status do GA marcou a maturidade do kubeadm nas seguintes áreas:

  • interface estável do console que segue a política de obsolescência do Kubernetes: os comandos e sinalizadores apresentados no release do GA devem ser suportados por pelo menos um ano após serem preteridos;
  • implementação estável "oculta" devido ao fato de que o cluster é criado por métodos que não serão alterados no futuro próximo: o plano de controle é iniciado com muitos pods estáticos, tokens de autoinicialização são usados ​​para kubeadm join e ComponentConfig é usado para configurar o kubelet;
  • esquema de configuração com uma nova API (v1beta1), que permite descrever declarativamente quase todos os componentes do cluster (o GitOps é possível para clusters criados com o kubeadm) - uma atualização para a versão v1 é planejada sem alterações mínimas;
  • as chamadas fases (ou interface da caixa de ferramentas ) no kubeadm ( kubeadm init phase ), permitindo escolher quais procedimentos de inicialização serão executados;
  • kubeadm upgrade equipe de kubeadm upgrade garante atualizações de cluster entre as versões 1.10.x, 1.11.x, 1.12.xe 1.13.x (atualizações etcd, API Server, Controller Manager e Scheduler);
  • instalação segura do etcd por padrão (ele usa TLS em qualquer lugar) com a capacidade de expandir para o cluster HA, se necessário.

Também é possível observar que o kubeadm agora reconhece corretamente o Docker 18.09.0 e suas versões mais recentes. Por fim, os desenvolvedores solicitam aos usuários do kubeadm que façam uma pequena pesquisa on-line na qual possam expressar seus desejos sobre o uso e o desenvolvimento do projeto.

CoreDNS por padrão


O CoreDNS, que recebeu status estável na versão Kubernetes 1.11 , foi ainda mais longe e se tornou o servidor DNS padrão nos K8s (em vez do kube-dns usado até agora). Foi planejado que isso acontecesse a partir da versão 1.12, mas os desenvolvedores se depararam com a necessidade de otimizações adicionais na escalabilidade e no consumo de memória, que foram concluídas apenas na versão atual.



O suporte ao kube-dns continuará "por pelo menos uma próxima versão", mas os desenvolvedores estão falando sobre a necessidade de começar a migrar para uma solução atualizada agora.

Das alterações relacionadas ao tópico CoreDNS no Kubernetes 1.13, o plug- in NodeLocal DNS Cache também pode ser observado para melhorar o desempenho do DNS. A melhoria é obtida executando um agente nos nós do cluster para o cache DNS, que será acessado diretamente pelos pods desse nó. Por padrão, a função está desativada e, para ativá-la, você deve definir KUBE_ENABLE_NODELOCAL_DNS=true .

Instalações de armazenamento


Muita atenção nas versões recentes do Kubernetes é dedicada ao trabalho com a Container Storage Interface (CSI), que começou com a versão alfa do CSI no K8s 1.9 e continuou com a versão beta na 1.10 ... No entanto, já escrevemos sobre isso mais de uma vez . Um novo marco significativo foi alcançado no K8s 1.13: o suporte ao CSI é declarado estável (GA).

imagem
(Diagrama do artigo " Entendendo a interface de armazenamento de contêiner ")

Junto com isso, o suporte para a especificação CSI v1.0.0 apareceu e o suporte para versões mais antigas do padrão (0.3 e anterior) foi preterido. Isso significa que os drivers CSI mais antigos exigirão a atualização para o CSI 1.0 (e a mudança para o novo diretório de registro de plug-in do Kubelet) para funcionar no Kubernetes 1.15 e versões anteriores. A propósito, dos próprios drivers, vale a pena observar a aparência da versão alfa da interface CSI para gerenciar o ciclo de vida dos volumes do AWS EBS (Elastic Block Store).

Uma nova adição ao gerenciador de complementos agora instala automaticamente o CRI a partir do CSI se pelo menos um dos dois portões de recursos estiver ativado: CSIDriverRegistry e CSINodeInfo . Ele tem o status da versão alfa, mas na verdade é apenas uma solução temporária para o problema, descrita em detalhes como um mecanismo de instalação do CRD .

O planejamento de volume com base na topologia ( Topology Aware Volume Scheduling ), sobre o qual falamos no contexto da versão 1.10 do Kubernetes , tornou- se estável . Em resumo, o planejador em seu trabalho leva em consideração as limitações da topologia do volume do pod (por exemplo, sua zona e nó).

A oportunidade introduzida no Kubernetes 1.9 de usar dispositivos brutos de bloco (não de rede) como Volumes Persistentes foi traduzida para beta e agora está ativada por padrão.

Concluímos o tópico de armazenamento com o fato de que o suporte ao GCERegionalPersistentDisk é declarado estável.

Nós de cluster


A versão alfa do suporte para plug-ins de monitoramento de dispositivos de terceiros foi introduzida. A idéia por trás dessa iniciativa é trazer para a árvore o conhecimento específico do dispositivo da Kubelet. Os administradores de cluster receberão métricas relatadas pelos plug-ins de dispositivos no nível do contêiner, e os fabricantes poderão criar essas métricas sem precisar fazer alterações no núcleo do Kubernetes. Detalhes da implementação podem ser encontrados na proposta, chamada API Kubelet Metadata .

Declarado estável, o Kubelet Plugin Watcher (também conhecido como Kubelet Device Plugin Registration) permite que plug-ins no nível do nó (plug-ins de dispositivo, CSI e CNI) se comuniquem com o Kubelet sobre si mesmos.

Um novo recurso no status alfa é o NodeLease . Se anteriormente a "pulsação" de um nó fosse determinada pelo NodeStatus, com um novo recurso, cada nó kube-node-lease um objeto Lease associado a ele (no espaço de nome kube-node-lease ), que é atualizado periodicamente pelo nó. “Pulse” agora é definido pelos dois parâmetros: o antigo NodeStatus, que é relatado ao mestre apenas em caso de alterações ou por um tempo limite fixo (por padrão, é uma vez por minuto) e um novo objeto (é atualizado com freqüência). Como esse objeto é muito pequeno, ele aprimora muito a escalabilidade e o desempenho. Os autores começaram a criar um novo "pulso" depois de testar clusters com um tamanho superior a 2.000 nós, que durante o trabalho poderiam estar contra os limites do etcd, para obter mais detalhes, consulte KEP-0009 .

 type Lease struct { metav1.TypeMeta `json:",inline"` // Standard object's metadata. // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata // +optional ObjectMeta metav1.ObjectMeta `json:"metadata,omitempty"` // Specification of the Lease. // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status // +optional Spec LeaseSpec `json:"spec,omitempty"` } type LeaseSpec struct { HolderIdentity string `json:"holderIdentity"` LeaseDurationSeconds int32 `json:"leaseDurationSeconds"` AcquireTime metav1.MicroTime `json:"acquireTime"` RenewTime metav1.MicroTime `json:"renewTime"` LeaseTransitions int32 `json:"leaseTransitions"` } 

(A especificação compacta do novo objeto para representar o "pulso" do nó - Lease - é idêntica ao LeaderElectionRecord )

Segurança


A versão alfa do Dynamic Audit Control segue as idéias do Dynamic Admission Control e fornece uma configuração dinâmica de recursos avançados de auditoria - para isso, agora você pode registrar (dinamicamente) um webhook que receberá um fluxo de eventos. A necessidade desse recurso é explicada pelo fato de a auditoria do Kubernetes oferecer recursos muito poderosos, mas eles são difíceis de configurar e todas as alterações na configuração ainda exigem uma reinicialização do apiserver.

A criptografia de dados no etcd (consulte a documentação oficial ) foi transferida do status experimental para o beta.

 kind: EncryptionConfiguration apiVersion: apiserver.config.k8s.io/v1 resources: - resources: - secrets providers: - identity: {} - aesgcm: keys: - name: key1 secret: c2VjcmV0IGlzIHNlY3VyZQ== - name: key2 secret: dGhpcyBpcyBwYXNzd29yZA== - aescbc: keys: - name: key1 secret: c2VjcmV0IGlzIHNlY3VyZQ== - name: key2 secret: dGhpcyBpcyBwYXNzd29yZA== - secretbox: keys: - name: key1 secret: YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY= 

(Um exemplo de configuração com dados criptografados é obtido da documentação .)

Entre as inovações menos significativas nesta categoria:

  • Agora o apiserver pode ser configurado para recusar solicitações que não podem entrar nos logs de auditoria.
  • PodSecurityPolicy objetos PodSecurityPolicy adicionados com suporte à regra MayRunAs para as opções fsGroup e supplementalGroups , que permite definir o intervalo de identificadores de grupo permitidos (GIDs) para pods / containers sem forçar o GID padrão. Além disso, com o PodSecurityPolicy , a estratégia RunAsGroup agora é possível na especificação de RunAsGroup , ou seja, Você pode controlar o GID principal para contêineres.
  • Para o kube-scheduler, substituímos a porta insegura anterior (10251) pela nova porta segura (10259) e a ativamos por padrão. Se nenhum sinalizador adicional for especificado, após o carregamento, certificados autoassinados serão criados para ele na memória.

CLI


O kubectl diff , mostrando a diferença entre a configuração local e a descrição atual do objeto de trabalho (funciona e recursivamente para diretórios com configurações), recebeu o status beta.

De fato, o diff "prediz" as alterações que serão feitas com o kubectl apply , e outro novo recurso é usado - o APIServer DryRun . Sua essência - início inativo - deve ser clara a partir do nome, e uma descrição mais detalhada está disponível na documentação do Kubernetes . A propósito, na versão 1.13, a função DryRun também foi "atualizada" para a versão beta e ativada por padrão.

E outro avanço para a versão beta no mundo dos console do Kubernetes afetou o novo mecanismo de plug-in . No caminho, eles corrigiram a ordem de saída dos plugins ( kubectl plugin list de plugins do kubectl plugin list ), removendo a classificação adicional de lá.

Além disso, a saída dos recursos de armazenamento efêmero usados ​​foi adicionada ao kubectl describe node e os volumes do tipo projetado foram adicionados ao kubectl describe pod .

Outras mudanças


A função do agendador de Despejo Baseado em Taint foi convertida para o status beta e é ativada por padrão após uma longa pausa no desenvolvimento. Seu objetivo é adicionar automaticamente taints aos nós (via NodeController ou kubelet) após a ocorrência de determinadas condições, como, por exemplo, node.kubernetes.io/not-ready , que corresponde ao valor NodeCondition em Ready=False .

Uma anotação de pods críticos para a operação do cluster - critical-pod - foi descontinuada. Em vez disso, propõe-se usar prioridades (em versão beta com o Kubernetes 1.11) .

Para a AWS pela primeira vez (como parte das versões alfa), o seguinte ficou disponível:

  • integração do AWS ALB (Application Load Balancer) com os recursos do Kubernetes Ingress - aws-alb-ingress-controller (o projeto foi originalmente criado pelo Ticketmaster e CoreOS para migrar o primeiro para a nuvem da AWS);
  • O CCM (Cloud Controller Manager) externo da AWS - cloud-provider-aws , responsável por iniciar os controladores com a funcionalidade de provedor específico de nuvem (AWS).

O SIG Azure implementou suporte adicional ao Disco do Azure (Ultra SSD, SSD padrão e arquivos Premium do Azure) e promoveu os nós do grupo de recursos cruzados para beta. Além disso, os plugins CNI para Windows agora têm a capacidade de configurar o DNS em um contêiner.

Compatibilidade


  • A versão etcd é 3.2.24 (não mudou desde o Kubernetes 1.12).
  • As versões verificadas do Docker - 1.11.1, 1.12.1, 1.13.1, 17.03, 17.06, 17.09, 18.06 (também não foram alteradas).
  • Ir versão - 1.11.2, coincide com o mínimo suportado.
  • A versão CNI é 0.6.0.
  • A versão CSI é 1.0.0.
  • A versão CoreDNS é 1.2.6.

PS


Leia também em nosso blog:

Source: https://habr.com/ru/post/pt432208/


All Articles