Adicionando um Token de Autenticação de Conta de Serviço a um Arquivo Kubeconfig

Descubra como adicionar um token de autenticação de conta de serviço ao arquivo kubeconfig de um cluster do Kubernetes que você criou usando o Kubernetes Engine (OKE).

Quando você configura o arquivo kubeconfig para um cluster, por padrão, ele contém um comando da CLI do Oracle Cloud Infrastructure para gerar um token de autenticação de curta duração, com escopo baseado no cluster e específico do usuário. O token de autenticação gerado pelo comando da CLI é apropriado para autenticar usuários individuais que acessam o cluster por meio do kubectl e do Painel de Controle do Kubernetes.

No entanto, o token de autenticação gerado não é apropriado para autenticar processos e ferramentas que acessam o cluster, como ferramentas de integração contínua e entrega contínua (CI/CD). Para garantir o acesso ao cluster, essas ferramentas requerem tokens de autenticação de longa duração e não específicos do usuário.

Uma solução é usar uma conta de serviço do Kubernetes, conforme descrito neste tópico. Depois de criar uma conta de serviço, você a vincula a um clusterrolebinding que tenha permissões de administração de cluster. Você cria um token de autenticação para a conta de serviço, que é armazenado como um segredo do Kubernetes. Então, você pode adicionar a conta de serviço (e o token de autenticação da conta de serviço associada) como uma definição de usuário no próprio arquivo kubeconfig. Outras ferramentas podem usar o token de autenticação da conta de serviço ao acessar o cluster.

Observe que para executar os comandos neste tópico, você deve ter as permissões apropriadas. Consulte Sobre o Controle de Acesso e o Serviço Kubernetes Engine (OKE).

Para adicionar um token de autenticação da conta de serviço a um arquivo kubeconfig:

  1. Se você ainda não tiver feito isso, siga as etapas para configurar o arquivo de configuração kubeconfig do cluster e (se necessário) defina a variável de ambiente KUBECONFIG para apontar para o arquivo. Observe que você deve configurar seu próprio arquivo kubeconfig. Não é possível acessar um cluster usando um arquivo kubeconfig que outro usuário tenha configurado. Consulte Configurando o Acesso ao Cluster.
  2. Em uma janela de terminal, crie uma nova conta de serviço no namespace kube-system informando o seguinte comando do kubectl:

    kubectl -n kube-system create serviceaccount <service-account-name>

    Por exemplo, para criar uma conta de serviço chamada kubeconfig-sa, informe:

    kubectl -n kube-system create serviceaccount kubeconfig-sa

    A saída do comando acima confirma a criação da conta de serviço. Por exemplo:

    serviceaccount/kubeconfig-sa created

    Observe que a criação da conta de serviço no namespace kube-system é uma boa prática recomendada e é presumida nas instruções deste tópico. No entanto, se preferir, você poderá criar a conta de serviço em outro namespace ao qual tenha acesso.

  3. Crie um novo clusterrolebinding com permissões de administração de cluster e vincule-o à conta de serviço que você acabou de criar, informando o seguinte comando do kubectl:

    kubectl create clusterrolebinding <binding-name> --clusterrole=cluster-admin --serviceaccount=kube-system:<service-account-name>

    Por exemplo, para criar um clusterrolebinding chamado add-on-cluster-admin e vinculá-lo à conta de serviço kubeconfig-sa, informe:

    kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:kubeconfig-sa

    A saída do comando acima confirma a criação do clusterrolebinding. Por exemplo:

    clusterrolebinding.rbac.authorization.k8s.io/add-on-cluster-admin created
  4. Obtenha um token de autenticação para a conta de serviço kubeconfig-sa da seguinte forma:
    1. Em um editor de texto, crie um arquivo (por exemplo, chamado oke-kubeconfig-sa-token.yaml) para criar um segredo (por exemplo, chamado oke-kubeconfig-sa-token) com o seguinte conteúdo:
      apiVersion: v1
      kind: Secret
      metadata:
        name: oke-kubeconfig-sa-token
        namespace: kube-system
        annotations:
          kubernetes.io/service-account.name: kubeconfig-sa
      type: kubernetes.io/service-account-token
    2. Crie o token da conta de serviço digitando:

      kubectl apply -f <filename>

      em que <filename> corresponde ao nome do arquivo criado anteriormente. Por exemplo:

      kubectl apply -f oke-kubeconfig-sa-token.yaml
    3. Exiba os detalhes do segredo digitando:

      kubectl describe secrets oke-kubeconfig-sa-token -n kube-system

      A saída do comando acima inclui um token de autenticação (uma longa cadeia alfanumérica) como o valor do elemento token:, conforme mostrado abaixo:

      Name:         oke-kubeconfig-sa-token
      Namespace:    kube-system
      Labels:       <none>
      Annotations:  kubernetes.io/service-account.name: kubeconfig-sa
      kubernetes.io/service-account.uid: 6d0fda1c-b456-44b3-25fd-4a824bef1936
      Type:  kubernetes.io/service-account-token
      Data
      ====
      ca.crt:     1289 bytes
      namespace:  11 bytes
      token:      bxYk______rz15A

      No exemplo acima, bxYk______rz15A ( abreviado para melhor leitura) é o token de autenticação.

  5. Obtenha o valor do token de autenticação da conta de serviço e designe seu valor (decodificado de base64) a uma variável de ambiente. Estas instruções presumem a especificação de TOKEN como o nome da variável de ambiente. Os comandos a serem informados dependem do sistema operacional:

    • Para obter o valor do token de autenticação da conta de serviço em um ambiente MacOS, Linux ou Unix, informe o seguinte comando:

      TOKEN=`kubectl -n kube-system get secret oke-kubeconfig-sa-token -o jsonpath='{.data.token}' | base64 --decode`
    • Para obter o valor do token de autenticação da conta de serviço em um ambiente Windows:

      1. Informe o seguinte comando:

        kubectl -n kube-system get secret oke-kubeconfig-sa-token -o jsonpath='{.data.token}'
      2. Copie a saída do comando acima e cole-a em um decodificador base64 (por exemplo, https://www.base64decode.org, https://www.base64decode.net ou semelhante).
      3. Copie a saída do decodificador base64.
      4. Informe o seguinte comando:

        TOKEN=`[<base64-decoded-output>]`

        em que <base64-decoded-output> é a saída que você copiou do decodificador base64.

  6. Adicione a conta de serviço (e seu token de autenticação) como uma nova definição de usuário no arquivo kubeconfig informando o seguinte comando kubectl:

    kubectl config set-credentials <service-account-name> --token=$TOKEN

    A conta de serviço (e seu token de autenticação) é adicionada à lista de usuários definidos no arquivo kubeconfig.

    Por exemplo, para adicionar a conta de serviço kubeconfig-sa e seu token de autenticação ao arquivo kubeconfig, informe:

    kubectl config set-credentials kubeconfig-sa --token=$TOKEN

    A saída do comando acima confirma que a conta de serviço foi adicionada ao arquivo kubeconfig. Por exemplo:

    User "kubeconfig-sa" set.
  7. Defina o usuário especificado no arquivo kubeconfig para o contexto atual como o novo usuário da conta de serviço que você criou, informando o seguinte comando kubectl:

    kubectl config set-context --current --user=<service-account-name>

    Por exemplo:

    kubectl config set-context --current --user=kubeconfig-sa

    A saída do comando acima confirma que o contexto atual foi alterado. Por exemplo:

    Context "context-ctdiztdhezd" modified.
  8. (Opcional) Para verificar se a autenticação funciona conforme o esperado, execute um comando kubectl para confirmar se o usuário da conta de serviço pode ser autenticado com sucesso usando o token de autenticação da conta de serviço.

    Por exemplo, se você tiver implantado anteriormente um aplicativo Nginx de amostra no cluster (consulte Implantando uma Amostra de Aplicativo Nginx em um Cluster com o kubectl), informe o seguinte comando:

    kubectl get pods -n kube-system

    A saída do comando acima mostra os pods em execução no cluster. Se o comando for executado com sucesso, o usuário da conta de serviço no arquivo kubeconfig foi autenticado com sucesso usando o token de autenticação da conta de serviço.

  9. Distribua o arquivo kubeconfig conforme necessário para ativar outros processos e ferramentas (como integração contínua e entrega contínua (CI/CD)) para acessar o cluster.
Observação

Se você quiser remover o acesso ao cluster da conta de serviço posteriormente, exclua o segredo do Kubernetes que contém o token de autenticação da conta de serviço informando o seguinte comando:

kubectl -n kube-system delete secret <secret-name>