Früher konnte ich mich kräuseln
https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1beta3/namespaces/default/
als meine Basis-URL, aber in kubernetes 0.18.0 gibt es mir "nicht autorisiert". Das Seltsame ist, dass wenn ich die externe IP-Adresse des API-Rechners ( http://172.17.8.101:8080/api/v1beta3/namespaces/default/
) verwende, es gut funktioniert.
kubernetes
später
quelle
quelle
$KUBERNETES_SERVICE_HOST
und$KUBERNETES_PORT_443_TCP_PORT
kommen Variablen aus?Antworten:
In der offiziellen Dokumentation fand ich Folgendes:
https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod
Anscheinend fehlte mir ein Sicherheitstoken, das ich in einer früheren Version von Kubernetes nicht benötigte. Daraus entwickelte ich eine meiner Meinung nach einfachere Lösung als das Ausführen eines Proxys oder das Installieren von Golang auf meinem Container. In diesem Beispiel werden die Informationen für den aktuellen Container von der API abgerufen:
Ich verwende auch eine einfache Binärdatei, jq ( http://stedolan.github.io/jq/download/ ), um den json für die Verwendung in Bash-Skripten zu analysieren.
quelle
v1beta3
zuv1
--cacert
Flag an curl übergeben, damit curl das vom Apiserver vorgelegte Zertifikat validiert.KUBERNETES_SERVICE_HOST=kubernetes.default
,$KUBERNETES_443_TCP_PORT=443
Namespaces == $ (</ var / run / Geheimnisse / kubernetes.io / serviceaccount / Namespace). The URL was
kubernetes.default: 443 / api / v1 / Namespaces / $ namespace / Hülsen / ... `. Beachten Sie, dass die API-Version auf v1 anstelle von v1beta3 festgelegt ist und der Standard-Namespace durch $ NAMESPACE ersetzt wurde.Auf jeden Pod wird automatisch ein Dienstkonto angewendet, mit dem er auf den Apiserver zugreifen kann. Das Dienstkonto stellt sowohl Client-Anmeldeinformationen in Form eines Inhaber-Tokens als auch das Zertifikat der Zertifizierungsstelle bereit, mit dem das vom Apiserver vorgelegte Zertifikat signiert wurde. Mit diesen beiden Informationen können Sie eine sichere, authentifizierte Verbindung zum Apisever herstellen, ohne
curl -k
(akacurl --insecure
) zu verwenden:quelle
--root-ca-file=
beim Start ein Argument erhalten muss, damit sowohl das Cacert als auch das Token im Dienstkonto vorhanden sind . (Dies wird in den meisten Kubernetes-Installationsprogrammen automatisch behandelt.) Siehe Diskussion hier für weitere Details: github.com/kubernetes/kubernetes/issues/10265https://kubernetes.default/
als Hostkubernetes.default.svc
wie unter kubernetes.io/docs/tasks/access-application-cluster/…Verwenden des Python-Kubernetes-Clients.
quelle
wget version:
quelle
Der wichtigste Zusatz zu den oben bereits erwähnten Details ist, dass der Pod, von dem aus Sie auf den API-Server zugreifen möchten, über die RBAC-Funktionen verfügen sollte.
Jede Entität im k8s-System wird durch ein Dienstkonto identifiziert (wie das Benutzerkonto, das für Benutzer verwendet wird). Basierend auf den RBAC-Funktionen wird das Dienstkontotoken (/var/run/secrets/kubernetes.io/serviceaccount/token) ausgefüllt. Die kube-api-Bindungen (z. B. pykube) können dieses Token als Eingabe verwenden, wenn eine Verbindung zu den kube-api-Servern hergestellt wird. Wenn der Pod über die richtigen RBAC-Funktionen verfügt, kann der Pod die Verbindung zum kube-api-Server herstellen.
quelle
Ich bin auf dieses Problem gestoßen, als ich versucht habe, mit Go Code aus einem Pod heraus auf die API zuzugreifen. Im Folgenden ist aufgeführt, was ich implementiert habe, damit dies funktioniert, falls jemand auf diese Frage stößt und auch Go verwenden möchte.
In diesem Beispiel wird eine Pod-Ressource verwendet, für die Sie die
client-go
Bibliothek verwenden sollten, wenn Sie mit nativen Kubernetes-Objekten arbeiten. Der Code ist hilfreicher für Benutzer von CustomResourceDefintions.quelle
Auf den Kubernetes-API-Server kann innerhalb des Pods direkt unter " https: //kubernetes.default " zugegriffen werden . Standardmäßig wird das "Standarddienstkonto" für den Zugriff auf den API-Server verwendet.
Daher müssen wir auch ein "ca cert" und ein "default service account token" übergeben, um sich beim API-Server zu authentifizieren.
Die Zertifikatdatei wird an der folgenden Stelle im Pod gespeichert: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
und das Standard-Dienstkonto-Token unter: /var/run/secrets/kubernetes.io/serviceaccount/token
Sie können den nodejs kubbernetes godaddy client verwenden .
quelle
Ich hatte ein ähnliches Authentifizierungsproblem bei GKE, bei dem Python-Skripte plötzlich Ausnahmen auslösten. Die Lösung, die für mich funktioniert hat, bestand darin, den Pods die Erlaubnis durch die Rolle zu geben
Für weitere Informationen geben Sie hier die Linkbeschreibung ein
quelle
Für alle, die Google Container Engine (unterstützt von Kubernetes) verwenden:
Ein einfacher Aufruf
https://kubernetes
aus dem Cluster mit diesem kubernetes-Client für Java funktioniert.quelle
Wenn RBAC aktiviert ist, hat das Standarddienstkonto keine Berechtigungen.
Erstellen Sie besser ein separates Dienstkonto für Ihre Anforderungen und erstellen Sie damit Ihren Pod.
Es wird hier gut erklärt https://developer.ibm.com/recipes/tutorials/service-accounts-and-auditing-in-kubernetes/
quelle
Meine k8s-Version ist 1.2.0 und in anderen Versionen soll es auch funktionieren ^^
quelle
This is from the
Kubernetes in Aktionbook.
Sie müssen sich um die Authentifizierung kümmern . Der API-Server selbst gibt an, dass Sie nicht berechtigt sind, darauf zuzugreifen, da er nicht weiß, wer Sie sind .
Zur Authentifizierung benötigen Sie ein Authentifizierungstoken. Glücklicherweise wird das Token über das Standard-Token-Geheimnis bereitgestellt zuvor erwähnte und in der Token-Datei auf dem geheimen Volume gespeichert.
Sie werden das Token verwenden, um auf den API-Server zuzugreifen . Laden Sie zunächst das Token in eine Umgebungsvariable:
Das Token wird jetzt in der gespeicherten TOKEN Umgebung variabel . Sie können es verwenden, wenn Sie Anforderungen an den API-Server senden:
quelle