J'essaie de vous connecter à mon cluster KubeNettes Microk8s qui écoute sur le port 16443 avec le Python KuberNettes Client : si je définit aucun des champs si je spécifie le cert_file code>,
key_file code> ou
api_key code> de la configuration dans l'exemple, la connexion échoue en raison de p>
apié_key code> comme indiqué dans le code ci-dessus, je reçois p >
File "/home/richter/examples/kubernetes-python/kubernetes-python-port-ignored/venv/lib/python3.7/site-packages/urllib3/util/retry.py", line 399, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='localhost', port=16443): Max retries exceeded with url: /api/v1/pods?watch=False (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)')))
3 Réponses :
Votre vérification SSL échoue aux contrôles TLS. Le correctif le plus simple et le plus rapide consiste à définir votre configuration Kube pour ignorer TLS-Verify car vous utilisez un seul nœud.
Vous devez passer la trajectoire sur le fichier ca.crt à configuration.ssl_ca_cert = 'ca.crt' code>.
import kubernetes.client
<<<pay attention here next five lines of code>>>
configuration = kubernetes.client.Configuration()
configuration.ssl_ca_cert = 'ca.crt'
configuration.api_key['authorization'] = 'ZXXXXXXXXXXdw=='
configuration.api_key_prefix['authorization'] = 'Bearer'
configuration.host = 'https://aaaaaaaaaaaaaaa.gr7.us-east-1.eks.amazonaws.com'
api_instance = kubernetes.client.CoreV1Api(kubernetes.client.ApiClient(configuration))
api_response = api_instance.list_namespace()
for i in api_response.items:
print(i.metadata.name)
Une chose que je dois mentionner est jeton i> que vous utilisez à partir de par défaut i> l'utilisateur n'est peut-être pas suffisante pour fonctionner avec des espaces de noms. Créez un SVICEACCOUNT CODE> et donnez-lui suffisamment d'autorisations à l'aide de
CLUSTREROLEBINDING CODE>. Ensuite, utilisez ce Token ServiceAccount i> pour accéder aux espaces de noms. @Karlrichter
Ceci fonctionne pour AWS Eks Cluster:
import boto3 import kubernetes import os import base64 eks = boto3.client('eks') eks_cluster_name = os.environ['EKS_CLUSTER_NAME'] eks_api_key = os.environ['EKS_API_KEY'] eksresponse = eks.describe_cluster( name=eks_cluster_name ) ca_file = open("/tmp/ca.crt", "wb") n = ca_file.write(base64.b64decode(eksresponse['cluster']['certificateAuthority']['data'])) ca_file.close() configuration = kubernetes.client.Configuration() configuration.ssl_ca_cert = '/tmp/ca.crt' configuration.api_key['authorization'] = eks_api_key configuration.api_key_prefix['authorization'] = 'Bearer' configuration.host = eksresponse['cluster']['endpoint'] api_instance = kubernetes.client.CoreV1Api(kubernetes.client.ApiClient(configuration)) api_response = api_instance.list_pod_for_all_namespaces() for i in api_response.items: print(i.metadata.name)