Kubernetes 1.15: Visão geral dos destaques



A segunda-feira deveria ocorrer oficialmente ( mas até agora isso não aconteceu ... ATUALIZADO 20/06 : o anúncio apareceu no blog do K8s) O próximo lançamento do Kubernetes é a 1,15 . De acordo com a tradição que se desenvolveu para o nosso blog, falamos das mudanças mais significativas na nova versão.

As informações usadas para preparar este material são retiradas da tabela de rastreamento de aprimoramentos do Kubernetes , CHANGELOG-1.15 e questões relacionadas, solicitações pull, bem como das Propostas de aprimoramento do Kubernetes (KEP). Desde que a conferência KubeCon em Xangai será realizada na próxima semana, este lançamento teve um ciclo de 11 semanas mais curto (em vez de 12 semanas), o que, no entanto, não afetou significativamente o número de mudanças significativas. Então vamos lá ..

Data warehouses


Introduziu uma nova API ExecutionHook , que permite executar dinamicamente comandos do usuário em um pod / contêiner ou grupo de pods / contêineres e, com ele, o controlador correspondente ( ExecutionHookController ) que implementa o gerenciamento do ciclo de vida do gancho. A motivação para a aparência desse recurso foi o desejo de fornecer aos usuários a capacidade de criar / excluir snapshots de acordo com a lógica do aplicativo, ou seja, execute qualquer comando específico do aplicativo antes e depois de criar o instantâneo. Supõe-se que esses ganchos também possam ser úteis em outras situações - por exemplo, executando atualizações, depuração, atualização de arquivos de configuração, reiniciando o contêiner, preparando-se para outros eventos como migração de banco de dados. Status atual - versão alfa (com tradução para beta para o próximo lançamento), detalhes - no KEP .

No armazenamento efêmero , que permite diferenciar pods / contêineres específicos do volume de espaço compartilhado (armazenamento compartilhado) , foi adicionado suporte para cotas do sistema de arquivos. Esse novo mecanismo usa cotas de projeto (cotas de projeto ) disponíveis no XFS e ext4, fornecendo monitoramento do consumo de recursos e a imposição opcional de limites a eles. Status atual - versão alfa; os planos para versões futuras ainda não foram especificados.

Outro novo recurso introduzido pelo sig-storage é o uso de PVCs existentes como DataSource para criar novos PVCs. Em outras palavras, esta é uma implementação da função de clonagem de volume . Os clones devem ser diferenciados dos instantâneos, pois cada clone é um volume novo e "completo": é criado como uma cópia de um existente, mas segue completamente o ciclo de vida dos volumes comuns (diferente dos instantâneos, embora sejam cópias de volumes em um determinado momento, mas não independentes). volumes). Ilustração da oportunidade:

 kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-2 namespace: myns spec: capacity: storage: 10Gi dataSource: kind: PersistentVolumeClaim name: pvc-1 

Nesse caso, um novo PV / PVC independente ( pvc-2 ) será criado contendo os mesmos dados que no pvc-1 . É indicado que o novo PVC deve ter o mesmo espaço para nome que o original.

As limitações existentes são CLONE_VOLUME apenas pelo provisionador dinâmico e apenas pelos plug-ins CSI (eles devem ter o recurso CLONE_VOLUME ). Leia mais em KEP .

Os seguintes recursos "cresceram" para o status da versão beta (e, portanto, a ativação nas instalações padrão do Kubernetes):

  • Função de expansão de tamanho de volume persistente "online", ou seja, sem a necessidade de reiniciar o pod usando o PVC apropriado. Pela primeira vez (no status alfa), apareceu no K8s 1.11.
  • Suporte para variáveis ​​de ambiente para nomes de diretório montados como subPath , que foi introduzido pela primeira vez no K8s 1.11 e desenvolvido no passado 1.14.

Mas o processo de migração das partes internas dos plug-ins antigos para repositórios implementados dentro da base de código Kubernetes (na árvore) se arrastou a favor dos plug-ins para a nova interface CSI. Esperava-se que o lançamento da versão 1.15 concluísse a migração de todos os plug-ins dos provedores de nuvem, no entanto, foi decidido manter o status da versão alfa, pois o recurso depende das APIs introduzidas no K8s 1.15 e até agora implementadas apenas na versão alfa (em particular, estamos falando de melhorias no suporte do Azure: plug-ins de arquivo e disco do Azure no csi-translation-lib).

Planejador


Duas inovações notáveis ​​- ambas na forma alfa até agora - estão disponíveis no Kubernetes Scheduler.

A primeira é a estrutura de agendamento ( Kubernetes Scheduling Framework ), que é um novo conjunto de APIs para plug-ins que ampliam os recursos de um agendador existente. Os plug-ins são criados fora do repositório principal (fora da árvore), mas são incluídos no planejador durante a compilação. Assim, o núcleo funcional do agendador permanece o mais simples e conveniente de oferecer suporte, e recursos adicionais são implementados separadamente, sem as muitas restrições que a maneira atual de expandir os recursos do agendador "sofreu" com a ajuda dos webhooks.

Na nova estrutura, cada tentativa de agendamento de pod é dividida em dois estágios:

  • ciclo de agendamento - onde o nó do pod está selecionado,
  • e ligação (ciclo de ligação) - onde a solução selecionada é implementada dentro do cluster.

Em cada um desses estágios (juntos, eles também são chamados de contexto de agendamento ), existem muitos pontos de extensão , em cada um dos quais os plug-ins de estrutura podem ser chamados.


(Ciclo de vida para chamar plug-ins na Estrutura de agendamento.)

Como parte da versão alfa da estrutura, apenas pontos Reserve , Unreserve e Prebind são implementados . Leia mais sobre essa inovação massiva na KEP .

A segunda é a opção Non-Preempting para PriorityClasses .

As classes prioritárias receberam status estável (GA) na última versão do Kubernetes, o que afetou o planejamento e a seleção de pods: os pods são planejados de acordo com a prioridade e, se o pod não puder ser criado devido à falta de recursos, os pods prioridade mais baixa pode ser excluída para liberar o espaço necessário.

A nova opção - Preempting , definida como um booleano na estrutura PriorityClass , significa: se um pod estiver aguardando seu planejamento e tiver Preempting=false , a criação não impedirá outros pods. Este campo aparece no PodSpec durante o processo de admissão do pod (semelhante ao valor de PriorityClass ). Detalhes da implementação estão no KEP .

API Machinery


Para CustomResources , são apresentadas melhorias projetadas para implementar os dados armazenados dessa maneira (dentro da estrutura do JSON no CRD), um comportamento que melhor corresponde à API Kubernetes geralmente aceita (para objetos K8s "nativos"):

  • exclusão automática de campos não especificados nos esquemas de validação do OpenAPI - para obter detalhes, consulte KEP "Poding for Custom Resources ";
  • a capacidade de definir valores padrão para campos nos esquemas de validação do OpenAPI v3, o que é especialmente importante para manter a compatibilidade da API ao adicionar novos campos aos objetos. Para obter detalhes, consulte o KEP "Padrão para recursos personalizados ".

Ambos os recursos foram planejados originalmente para serem incluídos no lançamento do K8s 1.12, mas somente agora eles são apresentados em versões alfa.

As mudanças na DRC não se limitaram a isso:

  • Publicar o recurso CRAP OpenAPI - ou seja, a validação CustomResources do lado do servidor (usando o esquema OpenAPI v3) introduzida na última versão do Kubernetes - chegou à versão beta e agora está ativada por padrão;
  • O mecanismo de conversão de versão para recursos CRD baseado em webhooks externos também foi convertido para beta.

Outra inovação interessante é chamada de marcador de relógio . Sua essência se resume a adicionar um novo tipo de evento à API Watch - Bookmark . Esse tipo significa um rótulo que todos os objetos até uma certa resourceVersion já foram processados ​​pelo relógio. Esse mecanismo reduzirá a carga no kube-apiserver, reduzindo o número de eventos que precisam ser processados ​​toda vez que o relógio for reiniciado, além de reduzir o número de erros indesejados, como "versão do recurso muito antiga" . No Kubernetes 1.15, o recurso tem o status da versão alfa e seu aumento para beta é esperado para a próxima versão.

  Added EventType = "ADDED" Modified EventType = "MODIFIED" Deleted EventType = "DELETED" Error EventType = "ERROR" Bookmark EventType = "BOOKMARK" 

(Tipos de eventos possíveis na API do Watch.)

No Webhooks de Admissão:

  • Adicionado suporte para um seletor de objetos , além dos seletores de namespace existentes
  • implementou a capacidade de registrar uma versão específica de um recurso e chamar quando qualquer versão mais antiga desse recurso é modificada;
  • O campo Option foi adicionado à API AdmissionReview, opções de relatório para a operação que está sendo executada.

Rede


Uma inovação significativa na parte de rede do Kubernetes é a chamada " Finalizer Protection" para balanceadores de carga. Agora, antes de excluir os recursos do LoadBalancer, é verificado se o recurso de Serviço correspondente não foi completamente excluído. Para fazer isso, um chamado finalizador é anexado a cada serviço com o type=LoadBalancer : quando esse serviço é excluído, a exclusão real do recurso é bloqueada até que o finalizador seja excluído e o finalizador não é excluído até que a "eliminação" dos recursos do balanceador de carga correspondente seja concluída ( service.kubernetes.io/load-balancer-cleanup ). A versão atual da implementação é a versão alfa, e detalhes sobre isso podem ser encontrados no KEP .

Além disso:

  • O plug- in NodeLocal DNS Cache introduzido no Kubernetes 1.13 e melhorando o desempenho do DNS chegou à versão beta.
  • O Kube-proxy não remove mais automaticamente as regras de rede criadas como resultado de sua operação em outros modos (isso requer o lançamento explícito do kube-proxy --cleanup ).

CLI


Como sempre, havia algumas pequenas coisas agradáveis ​​nos comandos do console para trabalhar com os clusters do Kubernetes:

  • A transferência do kubectl get para receber dados do servidor (e não do cliente) para dar suporte total às extensões é declarada concluída (estável).
  • No kubectl top adicionada a opção --sort-by :

     $ kubectl --kubeconfig=kubectl.kubeconfig top pod --sort=memory NAME CPU(cores) MEMORY(bytes) elasticsearch-logging-v1-psc43 2m 2406Mi hadoop-journalnode-2 13m 362Mi hodor-v0.0.5-3204531036-fqb0q 23m 64Mi kubernetes-admin-mongo-... 5m 44Mi cauth-v0.0.5-2463911897-165m8 34m 10Mi test-1440672787-kvx8h 0m 1Mi 
  • Na kubectl rollout restart adicionado suporte para DaemonSets e StatefulSets.
  • Um novo comando do kubeadm upgrade node foi kubeadm upgrade node para atualizar os nós do cluster, substituindo (agora declarado obsoleto) a kubeadm upgrade node config kubeadm upgrade node experimental-control-plane e o kubeadm upgrade node experimental-control-plane .
  • Novos comandos de kubeadm alpha certs certificate-key (para gerar uma chave aleatória, que pode ser passada para kubeadm init --experimental-upload-certs ) e kubeadm alpha certs check-expiration (para verificar o período de validade dos certificados PKI locais).
  • O comando kubeadm config upload foi descontinuado porque sua substituição ( kubeadm init phase upload-config ) amadureceu.

Outros


Entre outras mudanças notáveis ​​no Kubernetes 1.15:

  • Foi adicionado suporte ao PDB (Pod Disruption Budget) para recursos / controladores baseados em CRD de terceiros (por exemplo: EtcdCluster, MySQLReplicaSet ...) usando o sub- recurso Scale . Até agora, esta é uma versão beta que ficará estável no próximo lançamento. Os detalhes estão no KEP .
  • Dois recursos para nós / Kubelet chegaram à versão beta: suporte para plug-ins de monitoramento de dispositivos de terceiros (para remover todo o conhecimento específico do dispositivo do Kubelet, ou seja, fora da árvore) e SupportNodePidsLimit (isolamento de PIDs do nó para o pods).
  • O suporte aos módulos Go foi adicionado e ativado por padrão para a base de código do Kubernetes (em vez do modo Godep e GOPATH, que está obsoleto).
  • O suporte ao AWS NLB (Network Load Balancer), introduzido pela primeira vez no K8s 1.9, atingiu o nível beta. Em particular, ela conseguiu configurar accessLogs , encerrar o TLS e LoadBalancerSourceRanges .
  • Implementou a capacidade de configurar o provedor de nuvem do Azure a partir dos segredos do Kubernetes (para isso, uma nova opção cloudConfigType foi cloudConfigType , uma das quais pode ser secret ). Além disso, o Kubelet no Azure agora pode funcionar sem a identidade do Azure ( useInstanceMetadata deve estar habilitado para isso).
  • No ciclo de vida do cluster, a possibilidade de criar clusters de HA usando o kubeadm foi trazida para a versão beta e eles também concluíram a próxima etapa (v1beta2) na reorganização do formato do arquivo de configuração do kubeadm.
  • O número de pods no status pendente em diferentes filas é adicionado às métricas do planejador e são adicionadas estatísticas sobre volumes através das métricas de volume kubelet da CSI.
  • Atualizações no software usado / dependente: Vá para 1.12.5, cri-tools 1.14.0, etcd 3.3.10 (a versão não foi alterada para o servidor, mas foi atualizada para o cliente) . As versões do CNI, CSI, CoreDNS não foram alteradas (em uma das versões alfa do Kubernetes 1.15, ela foi atualizada para a 1.5.0, mas depois revertida para a 1.3.1) , versões suportadas do Docker.

PS


Leia também em nosso blog:

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


All Articles