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)