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:
-
Para un cliente de Go, utilice la biblioteca oficial del cliente de Go. La función
rest.InClusterConfig()
maneja automáticamente el descubrimiento del host de la API y la autenticación. Vea un ejemplo aqui. -
Para un cliente de Python, utilice la biblioteca oficial del cliente de Python. La función
config.load_incluster_config()
maneja automáticamente el descubrimiento del host de la API y la autenticación. Vea un ejemplo aqui. -
Existen varias bibliotecas disponibles, por favor consulte la página de Bibliotecas de Clientes.
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_HOST
y 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.
Nota:
Kubernetes no garantiza que el servidor de API tenga un certificado válido para el nombre de hostkubernetes.default.svc
;
Sin embargo, se espera que el plano de control presente un certificado válido para
el nombre de host o la dirección IP que representa $KUBERNETES_SERVICE_HOST
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"
}
]
}