He estado usando la versión de la biblioteca del cliente Kubernetes .net durante un tiempo para acceder a la API de Kubernetes desde un contenedor. Hoy actualicé desde la versión 1.6.11 de la biblioteca del cliente a la 4.0.21, pero esto rompió parte de la autenticación del cliente.
Esta es la excepción que estoy recibiendo:
HttpRequestException. The SSL connection could not be established, see inner exception. at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Boolean async, Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken) (rest of the stack trace ommited)Con la excepción interna:
AuthenticationException. The remote certificate is invalid because of errors in the certificate chain: PartialChain. at System.Net.Security.SslStream.SendAuthResetSignal(ProtocolToken message, ExceptionDispatchInfo exception) at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](TIOAdapter adapter, Boolean receiveFirst, Byte[] reAuthenticationData, Boolean isApm) at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Boolean async, Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)Utilizo la configuración de clúster predeterminada para crear una instancia del cliente de Kubernetes:
KubernetesClientConfiguration config = KubernetesClientConfiguration.InClusterConfig(); Kubernetes client = new Kubernetes(config); Después de verificar que todavía podía hablar con la API a través de curl usando el token asociado con la cuenta de servicio del pod almacenada en /var/run/secrets/kubernetes.io/serviceaccount/ .
No estoy tan familiarizado con SSL, pero después de algunas dificultades encontré una solución al copiar el archivo ca.cert del directorio de la cuenta de servicio a /usr/local/share/ca-certificates/ y ejecutar update-ca-certificates pero yo Me pregunto qué ha cambiado para que ahora se requiera esta acción.
¿Hay alguna forma en que pueda configurar el cliente para que esto se haga automáticamente o se resuelva de alguna otra manera?
Desde el Github del cliente, encontré este problema que sugiere una solución mejor que la que encontré.
KubernetesClientConfiguration config = KubernetesClientConfiguration.InClusterConfig(); config.TcpKeepAlive = false; Kubernetes client = new Kubernetes(config);