Estoy buscando una forma ligera de acceder a la API de Kubernetes desde un Pod en una aplicación de C#.
Los documentos de Kubernetes mencionan dos formas de acceder a la API desde un pod :
- Ejecute el proxy kubectl en un contenedor sidecar en el pod, o como un proceso en segundo plano dentro del contenedor
Esto generalmente funciona y permite llegar fácilmente a un punto final de API con solo una o dos líneas de código, por ejemplo:
using System; using System.Net; namespace GetIngresses { class Program { static void Main(string[] args) { var apiBaseUrl = "http://127.0.0.1:8001"; // requires kubectl proxy Console.WriteLine((new WebClient()). DownloadString($"{apiBaseUrl}/apis/networking.k8s.io/v1/ingresses")); } } } Sin embargo, ahora hay un proceso de kubectl proxy en ejecución para monitorear, mantener, etc., esto no parece ideal para la producción.
- Use la biblioteca de cliente de Go y cree un cliente con las funciones rest.InClusterConfig() y kubernetes.NewForConfig(). Manejan la localización y la autenticación en el servidor ap.
Mi aplicación está escrita en C#, no en Go. Hay una biblioteca de cliente de C# que presumiblemente podría lograr lo mismo. Pero, ¿realmente tengo que traer una biblioteca de cliente completa a bordo solo para un simple GET a un único punto final?
Idealmente, me gustaría usar WebClient , como en el ejemplo anterior. La documentación menciona que
La forma recomendada de ubicar el servidor ap dentro del pod es con el nombre DNS kubernetes.default.svc, que se resuelve en una IP de servicio que, a su vez, se enrutará a un servidor ap.
Entonces, en el ejemplo anterior, ¿puedo hacer esto...?
var apiBaseUrl = "http://kubernetes.default.svc" ... y obtener WebClient para pasar las credenciales de cuenta de servicio requeridas? Si es así, ¿cómo?
Idealmente, me gustaría usar WebClient
Kubernetes es una API REST, por lo que funcionaría. Como se muestra en Acceder directamente a la API REST usando el proxy kubectl , es fácil explorar la API usando, por ejemplo, curl .
Ejemplo con curl y kubectl proxy : la respuesta está en formato json.
curl http://localhost:8080/api/v1/pods El factor de complicación es que probablemente necesite un paquete de certificados privados, y es una buena práctica validarlo correctamente por razones de seguridad. Al acceder a la API desde un pod, el certificado del cliente se encuentra en /var/run/secrets/kubernetes.io/serviceaccount/ca.crt y, además, debe autenticarse con el token ubicado en /var/run/secrets/kubernetes.io/serviceaccount/token
Pero, ¿realmente tengo que traer una biblioteca de cliente completa a bordo solo para un simple GET a un único punto final?
Lo que obtienes de una biblioteca cliente es:
El ejemplo dotnet-client muestra cómo se ve el "Acceso de cliente escrito", para "listar Pods en el espacio de nombres predeterminado" (veralternativas de autenticación ):
var config = KubernetesClientConfiguration.InClusterConfig() // auth from Pod IKubernetes client = new Kubernetes(config); Console.WriteLine("Starting Request!"); var list = client.ListNamespacedPod("default"); foreach (var item in list.Items) { Console.WriteLine(item.Metadata.Name); }