J'étais capable de boucler
https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1beta3/namespaces/default/
comme URL de base, mais dans kubernetes 0.18.0, cela me donne "non autorisé". La chose étrange est que si j'ai utilisé l'adresse IP externe de la machine API ( http://172.17.8.101:8080/api/v1beta3/namespaces/default/
), cela fonctionne très bien.
kubernetes
Tslater
la source
la source
$KUBERNETES_SERVICE_HOST
et$KUBERNETES_PORT_443_TCP_PORT
?Réponses:
Dans la documentation officielle, j'ai trouvé ceci:
https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod
Apparemment, il me manquait un jeton de sécurité dont je n'avais pas besoin dans une version précédente de Kubernetes. À partir de là, j'ai conçu ce que je pense être une solution plus simple que d'exécuter un proxy ou d'installer golang sur mon conteneur. Voir cet exemple qui récupère les informations, à partir de l'API, pour le conteneur actuel:
J'utilise également include un simple binaire, jq ( http://stedolan.github.io/jq/download/ ), pour analyser le json à utiliser dans les scripts bash.
la source
v1beta3
pourv1
--cacert
drapeau à curl pour que curl valide le certificat présenté par l'apiserver.KUBERNETES_SERVICE_HOST=kubernetes.default
,$KUBERNETES_443_TCP_PORT=443
, NAMESPACE == $ (</ var / run / secrets / kubernetes.io / ServiceAccount / namespace). The URL was
kubernetes.default: 443 / api / v1 / namespaces / $ NAMESPACE / gousses / ... `. Notez que la version de l'API est définie sur v1 au lieu de v1beta3 et que l'espace de noms par défaut a été remplacé par $ NAMESPACE.Chaque pod a un compte de service automatiquement appliqué qui lui permet d'accéder à l'apiserver. Le compte de service fournit à la fois les informations d'identification du client, sous la forme d'un jeton de support, et le certificat d'autorité de certification qui a été utilisé pour signer le certificat présenté par l'apiserver. Avec ces deux informations, vous pouvez créer une connexion sécurisée et authentifiée à l'apisever sans utiliser
curl -k
(akacurl --insecure
):la source
--root-ca-file=
argument lors du démarrage. (ceci est géré automatiquement dans la plupart des programmes d'installation de kubernetes). Voir la discussion ici pour plus de détails: github.com/kubernetes/kubernetes/issues/10265https://kubernetes.default/
comme hôtekubernetes.default.svc
tel que documenté sur kubernetes.io/docs/tasks/access-application-cluster/…Utilisation du client Python kubernetes.
la source
version wget:
la source
L'addendum le plus important aux détails déjà mentionnés ci-dessus est que le pod à partir duquel vous essayez d'accéder au serveur API doit avoir les capacités RBAC pour le faire.
Chaque entité du système k8s est identifiée par un compte de service (comme le compte d'utilisateur utilisé pour les utilisateurs). En fonction des capacités RBAC, le jeton de compte de service (/var/run/secrets/kubernetes.io/serviceaccount/token) est renseigné. Les liaisons kube-api (par exemple pykube) peuvent prendre ce jeton comme entrée lors de la création de la connexion aux serveurs kube-api. Si le pod a les bonnes capacités RBAC, le pod pourra établir la connexion avec le serveur kube-api.
la source
J'ai rencontré ce problème en essayant d'accéder à l'API depuis l'intérieur d'un pod à l'aide de Go Code. Vous trouverez ci-dessous ce que j'ai mis en œuvre pour que cela fonctionne, si quelqu'un rencontre cette question qui souhaite également utiliser Go.
L'exemple utilise une ressource de pod, pour laquelle vous devez utiliser la
client-go
bibliothèque si vous travaillez avec des objets Kubernetes natifs. Le code est plus utile pour ceux qui travaillent avec CustomResourceDefintions.la source
Depuis l'intérieur du pod, le serveur api kubernetes peut être accessible directement sur " https: //kubernetes.default ". Par défaut, il utilise le "compte de service par défaut" pour accéder au serveur api.
Ainsi, nous devons également transmettre un «certificat ca» et un «jeton de compte de service par défaut» pour nous authentifier auprès du serveur api.
Le fichier de certificat est stocké à l'emplacement suivant dans le pod: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
et le jeton de compte de service par défaut à: /var/run/secrets/kubernetes.io/serviceaccount/token
Vous pouvez utiliser le client godaddy nodejs kubbernetes .
la source
J'ai eu un problème d'authentification similaire sur GKE où les scripts python ont soudainement jeté des exceptions. La solution qui a fonctionné pour moi était de donner la permission aux pods via le rôle
pour plus d'informations, entrez la description du lien ici
la source
Pour quiconque utilise Google Container Engine (optimisé par Kubernetes):
Un simple appel
https://kubernetes
depuis l'intérieur du cluster à l'aide de ce client kubernetes pour Java fonctionne.la source
Avec RBAC activé, le compte de service par défaut ne dispose d'aucune autorisation.
Mieux vaut créer un compte de service distinct pour vos besoins et l'utiliser pour créer votre pod.
C'est bien expliqué ici https://developer.ibm.com/recipes/tutorials/service-accounts-and-auditing-in-kubernetes/
la source
Ma version k8s est 1.2.0, et dans d'autres versions, elle est censée fonctionner aussi ^^
la source
This is from the
Kubernetes en actionbook.
Vous devez vous occuper de l' authentification . Le serveur API lui-même dit que vous n'êtes pas autorisé à y accéder, car il ne sait pas qui vous êtes .
Pour vous authentifier, vous avez besoin d'un jeton d'authentification. Heureusement, le jeton est fourni via le jeton secret par défaut mentionné précédemment et est stocké dans le fichier de jeton dans le volume secret.
Vous allez utiliser le jeton pour accéder au serveur API . Tout d'abord, chargez le jeton dans une variable d'environnement:
Le jeton est maintenant stocké dans la variable d' environnement TOKEN . Vous pouvez l'utiliser lors de l'envoi de requêtes au serveur API:
la source