Adición de un token de autenticación de cuenta de servicio a un archivo Kubeconfig

Descubra cómo agregar un token de autenticación de cuenta de servicio al archivo kubeconfig de un cluster de Kubernetes que ha creado mediante Container Engine for Kubernetes (OKE).

Cuando se configura el archivo kubeconfig para un cluster, este contiene por defecto un comando de la CLI de Oracle Cloud Infrastructure para generar un token de autenticación específico del usuario, con ámbito de cluster y de corta duración. El token de autenticación generado por el comando de la CLI es adecuado para autenticar usuarios individuales que acceden al cluster mediante kubectl y el panel de control de Kubernetes.

Sin embargo, el token de autenticación generado no es adecuado para autenticar los procesos y las herramientas que acceden al cluster, como las herramientas de integración y entrega continuas (CI/CD). Para garantizar el acceso al cluster, dichas herramientas requieren tokens de autenticación no específicos de usuario de larga duración.

Una solución es utilizar una cuenta de servicio de Kubernetes, como se describe en este tema. Una vez creada una cuenta de servicio, puede enlazarla a un ClusterRoleBinding que tenga permisos de administración de cluster. Debe crear un token de autenticación para la cuenta de servicio, que se almacena como secreto de Kubernetes. A continuación, puede agregar la cuenta de servicio (y su token de autenticación de cuenta de servicio asociado) como una definición de usuario en el propio archivo kubeconfig. Posteriormente, otras herramientas pueden utilizar el token de autenticación de cuenta de servicio al acceder al cluster.

Tenga en cuenta que, para ejecutar los comandos de este tema, debe tener los permisos adecuados. Consulte Acerca de control de acceso y Container Engine for Kubernetes.

Para agregar un token de autenticación de cuenta de servicio a un archivo kubeconfig:

  1. Si todavía no lo ha hecho, siga los pasos para configurar el archivo de configuración kubeconfig del cluster y (si es necesario) defina la variable de entorno KUBECONFIG para que apunte al archivo. Tenga en cuenta que debe configurar su propio archivo kubeconfig. No puede acceder a un cluster utilizando un archivo kubeconfig que haya configurado un usuario diferente. Consulte Configuración del acceso a los clusters.
  2. En una ventana de terminal, cree una nueva cuenta de servicio en el espacio de nombre kube-system introduciendo el siguiente comando de kubectl:

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

    Por ejemplo, para crear una cuenta de servicio denominada kubeconfig- sa, introduzca:

    kubectl -n kube-system create serviceaccount kubeconfig-sa

    La salida del comando anterior confirma la creación de la cuenta de servicio. Por ejemplo:

    serviceaccount/kubeconfig-sa created

    Tenga en cuenta que la creación de la cuenta de servicio en el espacio de nombre kube-system es una práctica recomendada y que se asume en las instrucciones de este tema. Sin embargo, si lo prefiere, puede crear la cuenta de servicio en otro espacio de nombre al que tenga acceso.

  3. Cree un nuevo ClusterRoleBinding con permisos de administración de cluster y enlácelo a la cuenta de servicio que acaba de crear introduciendo el siguiente comando kubectl:

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

    Por ejemplo, para crear un ClusterRoleBinding denominado add-on-cluster-admin y enlazarlo a la cuenta de servicio kubeconfig-sa, introduzca:

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

    La salida del comando anterior confirma la creación del ClusterRoleBinding. Por ejemplo:

    clusterrolebinding.rbac.authorization.k8s.io/add-on-cluster-admin created
  4. Obtenga un token de autenticación para la cuenta de servicio kubeconfig-sa de la siguiente manera:
    1. En un editor de texto, cree un archivo (por ejemplo, denominado oke-kubeconfig-sa-token.yaml) para crear un secreto (por ejemplo, con el nombre oke-kubeconfig-sa-token) con el siguiente contenido:
      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. Cree el token de cuenta de servicio introduciendo:

      kubectl apply -f <filename>

      donde <filename> es el nombre del archivo creado anteriormente. Por ejemplo:

      kubectl apply -f oke-kubeconfig-sa-token.yaml
    3. Para ver detalles del secreto, introduzca:

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

      La salida del comando anterior incluye un token de autenticación (una cadena alfanumérica larga) como valor del elemento token:, como se muestra abajo:

      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

      En el ejemplo anterior, bxYk______rz15A ( abreviado para mejorar la legibilidad) es el token de autenticación.

  5. Obtenga el valor del token de autenticación de cuenta de servicio y asigne su valor (descodificado de base64) a una variable de entorno. En estas instrucciones se asume que se especifica TOKEN como el nombre de la variable de entorno. Los comandos que se deben introducir dependen del sistema operativo:

    • Para obtener el valor del token de autenticación de cuenta de servicio en un entorno MacOS, Linux o Unix, introduzca el siguiente comando:

      TOKEN=`kubectl -n kube-system get secret oke-kubeconfig-sa-token -o jsonpath='{.data.token}' | base64 --decode`
    • Para obtener el valor del token de autenticación de cuenta de servicio en un entorno Windows:

      1. Introduzca el siguiente comando:

        kubectl -n kube-system get secret oke-kubeconfig-sa-token -o jsonpath='{.data.token}'
      2. Copie la salida del comando anterior y péguela en un descodificador base64 (por ejemplo, https://www.base64decode.org, https://www.base64decode.net o similar).
      3. Copie la salida del decodificador base64.
      4. Introduzca el siguiente comando:

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

        donde <base64-decoded-output> es la salida que ha copiado del descodificador base64.

  6. Agregue la cuenta de servicio (y su token de autenticación) como una nueva definición de usuario en el archivo kubeconfig introduciendo el siguiente comando de kubectl:

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

    La cuenta de servicio (y su token de autenticación) se agrega a la lista de usuarios definidos en el archivo kubeconfig.

    Por ejemplo, para agregar la cuenta de servicio kubeconfig-sa y su token de autenticación al archivo kubeconfig, introduzca:

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

    La salida del comando anterior confirma que la cuenta de servicio se ha agregado al archivo kubeconfig. Por ejemplo:

    User "kubeconfig-sa" set.
  7. Defina el usuario especificado en el archivo kubeconfig del contexto actual para que sea el nuevo usuario de cuenta de servicio que ha creado introduciendo el siguiente comando de kubectl:

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

    Por ejemplo:

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

    La salida del comando anterior confirma que se ha cambiado el contexto actual. Por ejemplo:

    Context "context-ctdiztdhezd" modified.
  8. (Opcional) Para verificar que la autenticación funciona como se esperaba, ejecute un comando de kubectl para confirmar que el usuario de cuenta de servicio se puede autenticar correctamente mediante el token de autenticación de cuenta de servicio.

    Por ejemplo, si anteriormente ha desplegado una aplicación Nginx de ejemplo en el cluster (consulte Despliegue de una aplicación de Nginx de ejemplo en un cluster mediante Kubectl), introduzca el siguiente comando:

    kubectl get pods -n kube-system

    El resultado del comando anterior muestra los pods que se están ejecutando en el cluster. Si el comando se ejecuta correctamente, el usuario de cuenta de servicio del archivo kubeconfig se ha autenticado correctamente mediante el token de autenticación de cuenta de servicio.

  9. Distribuya el archivo kubeconfig según sea necesario para permitir que otros procesos y herramientas (como las herramientas de integración y entrega continuas [CI/CD]) accedan al cluster.
Nota

Si posteriormente desea eliminar el acceso al cluster desde la cuenta de servicio, suprima el secreto de Kubernetes que contiene el token de autenticación de cuenta de servicio introduciendo el siguiente comando:

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