Solía poder rizarme
https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1beta3/namespaces/default/
como mi URL base, pero en kubernetes 0.18.0 me da "no autorizado". Lo extraño es que si usé la dirección IP externa de la máquina API ( http://172.17.8.101:8080/api/v1beta3/namespaces/default/
), funciona bien.
kubernetes
tslater
fuente
fuente
$KUBERNETES_SERVICE_HOST
y$KUBERNETES_PORT_443_TCP_PORT
?Respuestas:
En la documentación oficial encontré esto:
https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod
Aparentemente, me faltaba un token de seguridad que no necesitaba en una versión anterior de Kubernetes. A partir de eso, ideé lo que creo que es una solución más simple que ejecutar un proxy o instalar golang en mi contenedor. Vea este ejemplo que obtiene la información, de la api, para el contenedor actual:
También utilizo incluir un binario simple, jq ( http://stedolan.github.io/jq/download/ ), para analizar el json para usarlo en scripts bash.
fuente
v1beta3
av1
--cacert
bandera a curl para que curl valide el certificado presentado por el apiserver.KUBERNETES_SERVICE_HOST=kubernetes.default
,$KUBERNETES_443_TCP_PORT=443
, NAMESPACE == $ (</ var / run / secretos / kubernetes.io / ServiceAccount / espacio de nombres). The URL was
kubernetes.default: 443 / API / v1 / espacios de nombres / $ NAMESPACE / vainas / ... `. Tenga en cuenta que la versión de API se establece en v1 en lugar de v1beta3 y el espacio de nombres predeterminado se reemplazó con $ NAMESPACE.Cada pod tiene una cuenta de servicio aplicada automáticamente que le permite acceder al apiserver. La cuenta de servicio proporciona tanto las credenciales del cliente, en forma de token de portador, como el certificado de la autoridad de certificación que se utilizó para firmar el certificado presentado por el apiserver. Con estos dos datos, puede crear una conexión segura y autenticada con el apisever sin usar
curl -k
(también conocido comocurl --insecure
):fuente
--root-ca-file=
argumento al controlador de replicación cuando se inicie. (esto se maneja automáticamente en la mayoría de los instaladores de kubernetes). Consulte la discusión aquí para obtener más detalles: github.com/kubernetes/kubernetes/issues/10265https://kubernetes.default/
como anfitriónkubernetes.default.svc
documentado en kubernetes.io/docs/tasks/access-application-cluster/…Usando el cliente Python kubernetes ...
fuente
versión wget:
fuente
El apéndice más importante a los detalles ya mencionados anteriormente es que el pod desde el que está intentando acceder al servidor API debe tener las capacidades RBAC para hacerlo.
Cada entidad en el sistema k8s se identifica mediante una cuenta de servicio (como la cuenta de usuario que se utiliza para los usuarios). Según las capacidades de RBAC, se completa el token de la cuenta de servicio (/var/run/secrets/kubernetes.io/serviceaccount/token). Los enlaces kube-api (por ejemplo, pykube) pueden tomar este token como entrada cuando se crea una conexión con los servidores kube-api. Si el pod tiene las capacidades de RBAC correctas, el pod podría establecer la conexión con el servidor kube-api.
fuente
Me encontré con este problema al intentar acceder a la API desde dentro de un pod usando Go Code. A continuación se muestra lo que implementé para que eso funcione, en caso de que alguien se encuentre con esta pregunta y quiera usar Go también.
El ejemplo usa un recurso de pod, para el cual debe usar la
client-go
biblioteca si está trabajando con objetos nativos de Kubernetes. El código es más útil para quienes trabajan con CustomResourceDefintions.fuente
Desde el interior del pod, se puede acceder al servidor de la API de kubernetes directamente en " https: //kubernetes.default ". De forma predeterminada, utiliza la "cuenta de servicio predeterminada" para acceder al servidor api.
Por lo tanto, también necesitamos pasar un "certificado de ca" y un "token de cuenta de servicio predeterminado" para autenticarnos con el servidor api.
El archivo de certificado se almacena en la siguiente ubicación dentro del pod: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
y el token de cuenta de servicio predeterminado en: /var/run/secrets/kubernetes.io/serviceaccount/token
Puede utilizar el cliente godaddy de nodejs kubbernetes .
fuente
Tuve un problema de autenticación similar en GKE donde los scripts de Python arrojaron excepciones repentinamente. La solución que funcionó para mí fue otorgar permiso a las vainas a través del rol
para obtener más información, ingrese la descripción del enlace aquí
fuente
Para quien esté usando Google Container Engine (con tecnología de Kubernetes):
Una simple llamada
https://kubernetes
desde dentro del clúster usando este cliente de kubernetes para Java funciona.fuente
Con RBAC habilitado, la cuenta de servicio predeterminada no tiene ningún permiso.
Mejor cree una cuenta de servicio separada para sus necesidades y úsela para crear su pod.
Está bien explicado aquí https://developer.ibm.com/recipes/tutorials/service-accounts-and-auditing-in-kubernetes/
fuente
Mi versión de k8s es 1.2.0, y en otras versiones se supone que también funciona ^ ^
fuente
This is from the
Kubernetes en acciónbook.
Debes encargarte de la autenticación . El servidor API en sí mismo dice que no está autorizado para acceder a él, porque no sabe quién es usted. .
Para autenticarse, necesita un token de autenticación. Afortunadamente, el token se proporciona a través del token secreto predeterminado mencionado anteriormente y se almacena en el archivo de token en el volumen secreto.
Vas a usar el token para acceder al servidor API . Primero, cargue el token en una variable de entorno:
El token ahora se almacena en la variable de entorno TOKEN . Puede usarlo al enviar solicitudes al servidor API:
fuente