Accediendo a la API de Kubernetes desde un Pod

Esta guía muestra como acceder a la API de Kubernetes desde de un Pod.

Antes de empezar

Debes tener un cluster Kubernetes a tu dispocición, y la herramienta de línea de comandos kubectl debe estar configurada. Si no tienes un cluster, puedes crear uno utilizando Minikube, o puedes utilizar una de las siguientes herramientas en línea:

Accediendo a la API desde un Pod

El acceder a la API desde un Pod, la ubicacion y autentication del servidor de la API es ligeramente diferente que en el caso de un cliente externo.

La forma más fácil de usar la API de Kubernetes desde un Pod es utilizando una de las bibliotecas de cliente oficiales. Estas bibliotecas pueden automáticamente descubrir el servidor de la API y autenticarse.

Usando Bibliotecas de Cliente Oficiales

Desde un Pod, las formas recomendadas de conectarse a la API de Kubernetes son:

En cada caso, las credenciales de la cuenta de servicio del Pod se utilizan para comunicarse de manera segura con el servidor de la API.

Accediendo directamente a la API REST

Al ejecutarse en un Pod, su contenedor puede crear una URL HTTPS para el servidor de la API de Kubernetes obteniendo las variables de entorno KUBERNETES_SERVICE_HOSTy KUBERNETES_SERVICE_PORT_HTTPS. La dirección del servidor de la API dentro del clúster también se publica en un Servicio llamado kubernetes en el namespace default, de modo que los pods pueden hacer referencia a kubernetes.default.svc como el nombre DNS para el servidor de la API local.

La forma recomendada para autenticarse con el servidor de la API es con una credencial de cuenta de servicio. Por defecto, un Pod esta asociado con una cuenta de servicio, esta asociado con una cuenta de servicio, y una credencial (token) para esa cuenta de servicio se coloca en el sistema de archivos de cada contenedor en ese Pod en la ruta /var/run/secrets/kubernetes.io/serviceaccount/token.

Si está disponible, un paquete de certificados se coloca en el sistema de archivos de cada contenedor en la ruta /var/run/secrets/kubernetes.io/serviceaccount/ca.crt, y debe usarse para verificar el certificado de servicio del servidor API.

Finalmente, el Namespace default puede ser utilizado en las operaciones de API con ámbito de espacio de nombres que se colocan en un archivo con la ruta /var/run/secrets/kubernetes.io/serviceaccount/namespace de cada contenedor

Usando kubectl proxy

Si deseas consultar la API sin una biblioteca de cliente oficial, puedes ejecutar kubectl proxy como el comando de un nuevo contenedor sidecar en el Pod. De esta manera, kubectl proxy se autenticará en la API y la expondrá en la interfaz localhost del Pod, para que otros contenedores en el Pod puedan usarla directamente.

Sin usar un proxy

Es posible evitar el uso del proxy de kubectl pasando el token de autenticación directamente al servidor de la API. El certificado interno asegura la conexión.

# Apuntar nombre de host del servidor API interno.
APISERVER=https://kubernetes.default.svc

# Ruta del token de ServiceAccount
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount

# Lectura del Namespace del Pod
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)

# Lectura del bearer token del ServiceAccount
TOKEN=$(cat ${SERVICEACCOUNT}/token)

# Referencia a la autoridad de certificación interna (CA)
CACERT=${SERVICEACCOUNT}/ca.crt

# Explora la API con TOKEN
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api

La salida será similar a esto:

{
  "kind": "APIVersions",
  "versions": ["v1"],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}
Última modificación November 06, 2024 at 4:07 PM PST: Apply suggestions from code review (d6e0289723)