Trabalhando com o complemento CoreDNS do Amazon EKS - Amazon EKS

Trabalhando com o complemento CoreDNS do Amazon EKS

O CoreDNS é um servidor DNS flexível e extensível que pode servir como DNS de cluster do Kubernetes. Quando você executa um cluster do Amazon EKS com pelo menos um nó, duas réplicas da imagem do CoreDNS são implantadas por padrão, independentemente do número de nós implantados em seu cluster. Os CoreDNS Pods fornecem resolução de nomes para todos os Pods no cluster. Os Pods do CoreDNS poderão ser implantados em nós do Fargate se o seu cluster incluir Perfil do AWS Fargate com um namespace correspondente ao namespace para a deployment do CoreDNS. Para obter mais informações sobre o CoreDNS, consulte Uso do CoreDNS para descoberta de serviço na documentação do Kubernetes.

A tabela a seguir lista a versão mais recente do tipo de complemento do Amazon EKS para cada versão do Kubernetes.

Versão do Kubernetes 1.29 1.28 1.27 1.26 1.25 1.24 1.23
v1.11.1-eksbuild.6 v1.10.1-eksbuild.7 v1.10.1-eksbuild.7 v1.9.3-eksbuild.11 v1.9.3-eksbuild.11 v1.9.3-eksbuild.11 v1.8.7-eksbuild.10
Importante

Se você estiver gerenciando esse complemento automaticamente, as versões na tabela podem não ser as mesmas que as versões autogerenciadas disponíveis. Para obter mais informações sobre como atualizar o tipo autogerenciado desse complemento, consulte Atualização do complemento autogerenciado.

Considerações importantes sobre o upgrade do CoreDNS

  • Para melhorar a estabilidade e a disponibilidade do CoreDNS Deployment, as versões v1.9.3-eksbuild.5 e posteriores e o v1.10.1-eksbuild.2 são implantados com um PodDisruptionBudget. Se você implantou um PodDisruptionBudget existente, sua atualização para essas versões pode falhar. Se a atualização falhar, concluir uma das seguintes tarefas deve resolver o problema:

    • Ao fazer a atualização do complemento do Amazon EKS, opte por substituir as configurações existentes como sua opção de resolução de conflitos. Se você fez outras configurações personalizadas no Deployment, certifique-se de fazer backup de suas configurações antes de atualizar para poder reaplicar as demais configurações personalizadas após a atualização.

    • Remova o PodDisruptionBudget existente e tente fazer a atualização novamente.

  • Nas versões complementares do EKS v1.9.3-eksbuild.3 e posteriores v1.10.1-eksbuild.6 e posteriores, ele CoreDNS Deployment define o readinessProbe para usar o /ready endpoint. Esse endpoint está habilitado no Corefile arquivo de configuração do CoreDNS.

    Se você usar um personalizadoCorefile, deverá adicionar o ready plug-in à configuração, para que o /ready endpoint fique ativo CoreDNS para o teste ser usado.

  • Nas versões complementares do EKS v1.9.3-eksbuild.7 e posteriores e v1.10.1-eksbuild.4 e posteriores, você pode alterar o PodDisruptionBudget. Você pode editar o complemento e alterar essas configurações nas configurações opcionais usando os campos no exemplo a seguir. Este exemplo mostra o padrão PodDisruptionBudget.

    { "podDisruptionBudget": { "enabled": true, "maxUnavailable": 1 } }

    Você pode definir maxUnavailable ou minAvailable, mas não pode definir os dois em um único PodDisruptionBudget. Para obter mais informações sobre PodDisruptionBudgets, consulte ReplicaSetPodDisruptionBudget na Kubernetes documentação.

    Observe que se você definir enabled como false, o PodDisruptionBudget não será removido. Depois de definir esse campo como false, você deve excluir o PodDisruptionBudget objeto. Da mesma forma, se você editar o complemento para usar uma versão mais antiga do complemento (rebaixar o complemento) depois de atualizar para uma versão com um PodDisruptionBudget, o não será removido PodDisruptionBudget. Para excluir o PodDisruptionBudget, você pode executar o comando a seguir:

    kubectl delete poddisruptionbudget coredns -n kube-system
  • No complemento do EKS versão v1.10.1-eksbuild.5 e posteriores, altere a tolerância padrão de node-role.kubernetes.io/master:NoSchedule para node-role.kubernetes.io/control-plane:NoSchedule para manter a conformidade com o KEP 2067. Para obter mais informações sobre o KEP 2067, consulte KEP-2067: renomear o rótulo "master" e taint kubeadm nas Propostas de aprimoramento do Kubernetes (KEPs) no GitHub.

    No complemento do EKS versão v1.8.7-eksbuild.8 e posteriores e v1.9.3-eksbuild.9 e posteriores, ambas as tolerâncias são configuradas para serem compatíveis com todas as versões do Kubernetes.

  • No complemento do EKS versão v1.9.3-eksbuild.11 e v1.10.1-eksbuild.7 e posteriores, o CoreDNS Deployment define um valor padrão para topologySpreadConstraints. O valor padrão garante que os Pods do CoreDNS estejam espalhados pelas zonas de disponibilidade se houver nós em várias zonas de disponibilidade disponíveis. Você pode definir um valor personalizado que será usado em vez do valor padrão. O valor padrão é:

    topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: k8s-app: kube-dns

Considerações sobre upgrade do CoreDNS v1.11

  • No complemento do EKS versão v1.11.1-eksbuild.4 e posteriores, a imagem de contêiner é baseada em uma imagem de base mínima mantida pelo Amazon EKS Distro, que contém pacotes mínimos e não tem shells. Para obter mais informações, consulte Amazon EKS Distro. O uso e a solução de problemas da imagem do CoreDNS permanecem os mesmos.

Criar o complemento do Amazon EKS

Crie o tipo do Amazon EKS do complemento. Verificar

Pré-requisitos
  1. Veja qual versão do complemento está atualmente instalada no cluster.

    kubectl describe deployment coredns --namespace kube-system | grep coredns: | cut -d : -f 3

    Veja um exemplo de saída abaixo.

    v1.10.1-eksbuild.7
  2. Veja qual tipo de complemento está atualmente instalado no cluster. Dependendo da ferramenta com a qual você criou o cluster, talvez você não tenha o tipo de complemento do Amazon EKS instalado em seu cluster atualmente. Substitua my-cluster pelo nome do cluster.

    aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query addon.addonVersion --output text

    Se um número de versão for retornado, você tem o tipo de complemento do Amazon EKS instalado no cluster, e não precisa completar as etapas restantes deste procedimento. Se um erro for retornado, você não tem o tipo de complemento do Amazon EKS instalado no cluster. Conclua as etapas restantes desse procedimento para instalá-lo.

  3. Salve a configuração do complemento instalado atualmente.

    kubectl get deployment coredns -n kube-system -o yaml > aws-k8s-coredns-old.yaml
  4. Crie o complemento usando o AWS CLI. Se você quiser usar o AWS Management Console ou eksctl para criar o complemento, consulte Criar um complemento e especifique coredns como o nome do complemento. Copie o conteúdo a seguir no seu dispositivo. Faça as seguintes modificações no comando, conforme necessário, e execute o comando modificado.

    • Substitua o my-cluster pelo nome do cluster.

    • Substitua v1.11.1-eksbuild.6 pela versão mais recente listada na tabela das versões mais recentes da versão do seu cluster.

    aws eks create-addon --cluster-name my-cluster --addon-name coredns --addon-version v1.11.1-eksbuild.6

    Se você aplicou configurações personalizadas ao seu complemento atual que entrem em conflito com as configurações padrão do complemento Amazon EKS, a criação poderá falhar. Se a criação falhar, você receberá um erro que poderá ajudar a resolver o problema. Como alternativa, você pode adicionar --resolve-conflicts OVERWRITE ao comando anterior. Isso permite que o complemento substitua todas as configurações personalizadas existentes. Depois de criar o complemento, você pode atualizá-lo com suas configurações personalizadas.

  5. Confirme se a versão mais recente do complemento para a versão Kubernetes do seu cluster foi adicionada ao cluster. Substitua o my-cluster pelo nome do cluster.

    aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query addon.addonVersion --output text

    Pode levar alguns segundos para que a criação do complemento seja concluída.

    Veja um exemplo de saída abaixo.

    v1.11.1-eksbuild.6
  6. Se você fez configurações personalizadas no complemento original, antes de criar o complemento Amazon EKS, use a configuração que você salvou em uma etapa anterior para atualizar o complemento Amazon EKS com as configurações personalizadas.

Atualizar o complemento do Amazon EKS

Atualize o tipo do Amazon EKS do complemento. Se você não adicionou o tipo Amazon EKS do complemento ao cluster, adicione-o ou consulte Atualização do complemento autogerenciado, em vez de concluir esse procedimento.

  1. Veja qual versão do complemento está atualmente instalada no cluster. Substitua my-cluster pelo nome do cluster.

    aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query "addon.addonVersion" --output text

    Veja um exemplo de saída abaixo.

    v1.10.1-eksbuild.7

    Se a versão retornada for a mesma da versão do Kubernetes do cluster na tabela de versões mais recente, você já tem a versão mais recente instalada no cluster e não precisa concluir o restante desse procedimento. Se você receber um erro, em vez de um número de versão no resultado, você não tem o tipo Amazon EKS do complemento instalado no cluster. Você precisa criar o complemento antes de poder atualizá-lo com este procedimento.

  2. Salve a configuração do complemento instalado atualmente.

    kubectl get deployment coredns -n kube-system -o yaml > aws-k8s-coredns-old.yaml
  3. Atualize o complemento usando a AWS CLI. Se você quiser usar o AWS Management Console ou eksctl para atualizar o complemento, consulte Atualizar um complemento. Copie o conteúdo a seguir no seu dispositivo. Faça as seguintes modificações no comando, conforme necessário, e execute o comando modificado.

    • Substitua o my-cluster pelo nome do cluster.

    • Substitua v1.11.1-eksbuild.6 pela versão mais recente listada na tabela das versões mais recentes da versão do seu cluster.

    • A opção PRESERVE de --resolve-conflicts mantém os valores de configuração existentes para o complemento. Se você definiu valores personalizados para as configurações do complemento e não usar essa opção, o Amazon EKS sobrescreverá seus valores pelos valores padrão. Se você usar essa opção, recomendamos testar qualquer alteração de campo e valor em um cluster que não seja de produção antes de atualizar o complemento no cluster de produção. Se você alterar esse valor para OVERWRITE, todas as configurações serão alteradas para os valores padrão do Amazon EKS. Se você definiu valores personalizados para qualquer configuração, eles poderão ser sobrescritos pelos valores padrão do Amazon EKS. Se você alterar esse valor para none, o Amazon EKS não alterará o valor de nenhuma configuração, mas a atualização poderá falhar. Se a atualização falhar, você receberá uma mensagem de erro para ajudar a resolver o conflito.

    • Se você não estiver atualizando uma configuração, remova --configuration-values '{"replicaCount":3}' do comando. Se você estiver atualizando uma definição de configuração, substitua "replicaCount":3 pela definição que deseja definir. Neste exemplo, o número de réplicas de CoreDNS é definido como 3. O valor que você especificar deve ser válido para o esquema da configuração. Se não souber qual é o esquema de configuração, execute aws eks describe-addon-configuration --addon-name coredns --addon-version v1.11.1-eksbuild.6, substituindo v1.11.1-eksbuild.6 pelo número da versão do complemento cuja configuração você deseja ver. O esquema é retornado na saída. Se você tiver alguma configuração personalizada existente que deseja remover e definir os valores de todas as configurações de volta aos padrões do Amazon EKS, remova "replicaCount":3 do comando para que você tenha arquivos vazios {}. Para obter mais informações sobre as configurações do CoreDNS, consulte Personalizando o Serviço DNS na documentação do Kubernetes.

      aws eks update-addon --cluster-name my-cluster --addon-name coredns --addon-version v1.11.1-eksbuild.6 \ --resolve-conflicts PRESERVE --configuration-values '{"replicaCount":3}'

      Pode levar alguns segundos para que a atualização seja concluída.

  4. Confirme se a versão do complemento foi atualizada. Substitua o my-cluster pelo nome do cluster.

    aws eks describe-addon --cluster-name my-cluster --addon-name coredns

    Pode levar alguns segundos para que a atualização seja concluída.

    Veja um exemplo de saída abaixo.

    { "addon": { "addonName": "coredns", "clusterName": "my-cluster", "status": "ACTIVE", "addonVersion": "v1.11.1-eksbuild.6", "health": { "issues": [] }, "addonArn": "arn:aws:eks:region:111122223333:addon/my-cluster/coredns/d2c34f06-1111-2222-1eb0-24f64ce37fa4", "createdAt": "2023-03-01T16:41:32.442000+00:00", "modifiedAt": "2023-03-01T18:16:54.332000+00:00", "tags": {}, "configurationValues": "{\"replicaCount\":3}" } }

Atualização do complemento autogerenciado

Importante

Recomendamos adicionar o tipo Amazon EKS do complemento ao seu cluster em vez de usar o tipo autogerenciado do complemento. Se você não estiver familiarizado com a diferença entre os tipos, consulte Complementos do Amazon EKS. Para obter mais informações sobre como adicionar um complemento do Amazon EKS ao cluster, consulte Criar um complemento. Se você não conseguir usar o complemento do Amazon EKS, recomendamos que você envie um problema sobre o motivo pelo qual não pode usar o repositório GitHub para roteiro de contêineres.

  1. Confirme que tem o tipo autogerenciado de complemento instalado em seu cluster. Substitua my-cluster pelo nome do cluster.

    aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query addon.addonVersion --output text

    Se receber uma mensagem de erro, você tem o tipo autogerenciado do complemento instalado no cluster. Conclua as etapas restantes neste procedimento. Se receber um número de versão, você tem o tipo de complemento do Amazon EKS instalado no cluster. Para atualizar o tipo de complemento do Amazon EKS, use o procedimento em Atualizar o complemento do Amazon EKS, em vez de usar este procedimento. Se não estiver familiarizado com a diferença entre os tipos de complemento, consulte Complementos do Amazon EKS.

  2. Veja qual versão da imagem do contêiner está atualmente instalada em seu cluster.

    kubectl describe deployment coredns -n kube-system | grep Image | cut -d ":" -f 3

    Veja um exemplo de saída abaixo.

    v1.8.7-eksbuild.2
  3. Se a versão atual do CoreDNS for v1.5.0 ou superior, mas anterior à versão listada na tabela Versões do CoreDNS, ignore esta etapa. Se a sua versão atual for anterior à 1.5.0, você precisa modificar o ConfigMap para que o CoreDNS use o complemento de encaminhamento, em vez do complemento de proxy.

    1. Abra o arquivo configmap com o seguinte comando.

      kubectl edit configmap coredns -n kube-system
    2. Substitua proxy na linha a seguir pelo forward. Salve o arquivo e saia do editor.

      proxy . /etc/resolv.conf
  4. Se você implantou originalmente o cluster no Kubernetes 1.17 ou anterior, talvez seja necessário remover uma linha descontinuada do manifesto do CoreDNS.

    Importante

    Você deve concluir essa etapa antes de atualizar para o CoreDNS versão 1.7.0, mas é recomendável concluir essa etapa mesmo se estiver atualizando para uma versão anterior.

    1. Verifique se o manifesto do CoreDNS tem a linha.

      kubectl get configmap coredns -n kube-system -o jsonpath='{$.data.Corefile}' | grep upstream

      Se nenhum resultado for retornado, o manifesto não terá a linha e você poderá prosseguir para a próxima etapa para atualizar o CoreDNS. Se um resultado for retornado, você precisará remover a linha.

    2. Edite o ConfigMap com o comando a seguir, removendo a linha no arquivo que inclui a palavra upstream em seu nome. Não altere mais nada no arquivo. Depois que a linha for removida, salve as alterações.

      kubectl edit configmap coredns -n kube-system -o yaml
  5. Recupere a imagem atual do CoreDNS:

    kubectl describe deployment coredns -n kube-system | grep Image

    Veja um exemplo de saída abaixo.

    602401143452.dkr.ecr.region-code.amazonaws.com/eks/coredns:v1.8.7-eksbuild.2
  6. Se você estiver atualizando para o CoreDNS 1.8.3 ou posterior, será necessário adicionar a permissão de endpointslices à clusterrole do system:coredns do Kubernetes.

    kubectl edit clusterrole system:coredns -n kube-system

    Adicione as linhas a seguir abaixo das linhas de permissões existentes na seção rules do arquivo.

    [...] - apiGroups: - discovery.k8s.io resources: - endpointslices verbs: - list - watch [...]
  7. Atualize o complemento CoreDNS substituindo 602401143452 e region-code pelos valores da saída retornados em uma etapa anterior. Substitua v1.11.1-eksbuild.6 pela versão do CoreDNS listada na tabela de versões mais recentes para sua versão do Kubernetes.

    kubectl set image deployment.apps/coredns -n kube-system coredns=602401143452.dkr.ecr.region-code.amazonaws.com/eks/coredns:v1.11.1-eksbuild.6

    Veja um exemplo de saída abaixo.

    deployment.apps/coredns image updated
  8. Verifique a versão da imagem do contêiner novamente para confirmar que ela foi atualizada para a versão que você especificou na etapa anterior.

    kubectl describe deployment coredns -n kube-system | grep Image | cut -d ":" -f 3

    Veja um exemplo de saída abaixo.

    v1.11.1-eksbuild.6