Kiedyś potrafiłem się zwijać
https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1beta3/namespaces/default/
jako mój podstawowy adres URL, ale w kubernetes 0.18.0 daje mi to „nieautoryzowane”. Dziwne jest to, że jeśli użyłem zewnętrznego adresu IP maszyny API ( http://172.17.8.101:8080/api/v1beta3/namespaces/default/
), to działa dobrze.
kubernetes
tslater
źródło
źródło
$KUBERNETES_SERVICE_HOST
i$KUBERNETES_PORT_443_TCP_PORT
?Odpowiedzi:
W oficjalnej dokumentacji znalazłem to:
https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod
Najwyraźniej brakowało mi tokena bezpieczeństwa, którego nie potrzebowałem w poprzedniej wersji Kubernetes. Na tej podstawie wymyśliłem coś, co moim zdaniem jest prostsze niż uruchomienie serwera proxy lub zainstalowanie golanga na moim kontenerze. Zobacz ten przykład, który pobiera informacje z interfejsu API dla bieżącego kontenera:
Używam również prostego pliku binarnego jq ( http://stedolan.github.io/jq/download/ ), aby przeanalizować plik json do użycia w skryptach bash.
źródło
v1beta3
nav1
--cacert
flagę curl, aby funkcja curl zweryfikowała certyfikat przedstawiony przez apiserver.KUBERNETES_SERVICE_HOST=kubernetes.default
,$KUBERNETES_443_TCP_PORT=443
, NAMESPACE == $ (</ var / run / tajemnice / kubernetes.io / konto_usługi / namespace). The URL was
kubernetes.default: 443 / api / v1 / nazw / $ NAMESPACE / pods / ... `. Zauważ, że wersja API jest ustawiona na v1 zamiast v1beta3, a domyślna przestrzeń nazw została zastąpiona przez $ NAMESPACE.Każda kapsuła ma automatycznie stosowane konto usługi, które umożliwia jej dostęp do serwera apis. Konto usługi zapewnia zarówno poświadczenia klienta w postaci tokena okaziciela, jak i certyfikat urzędu certyfikacji, który został użyty do podpisania certyfikatu przedstawionego przez serwer apis. Dzięki tym dwóm informacjom możesz utworzyć bezpieczne, uwierzytelnione połączenie z apisever bez użycia
curl -k
(akacurl --insecure
):źródło
--root-ca-file=
argument podczas uruchamiania. (jest to obsługiwane automatycznie w większości instalatorów kubernetes). Zobacz dyskusję tutaj, aby uzyskać więcej informacji: github.com/kubernetes/kubernetes/issues/10265https://kubernetes.default/
jako hostakubernetes.default.svc
udokumentowany na kubernetes.io/docs/tasks/access-application-cluster/ ...Korzystanie z klienta Python kubernetes.
źródło
wersja wget:
źródło
Najważniejszym dodatkiem do szczegółów już wspomnianych powyżej jest to, że pod, z którego próbujesz uzyskać dostęp do serwera API, powinien mieć uprawnienia RBAC, aby to zrobić.
Każdy podmiot w systemie k8s jest identyfikowany przez konto usługi (jak konto użytkownika używane dla użytkowników). W oparciu o możliwości RBAC token konta usługi (/var/run/secrets/kubernetes.io/serviceaccount/token) jest wypełniany. Wiązania kube-api (np. Pykube) mogą przyjąć ten token jako dane wejściowe podczas tworzenia połączenia z serwerami kube-api. Jeśli moduł ma odpowiednie możliwości RBAC, będzie mógł nawiązać połączenie z serwerem kube-api.
źródło
Napotkałem ten problem, próbując uzyskać dostęp do API z wnętrza poda za pomocą Go Code. Poniżej przedstawiam, co wdrożyłem, aby to działało, gdyby ktoś napotkał to pytanie, chcąc również użyć Go.
W przykładzie użyto zasobu pod, dla którego należy używać
client-go
biblioteki, jeśli pracujesz z natywnymi obiektami Kubernetes. Kod jest bardziej przydatny dla osób pracujących z CustomResourceDefintions.źródło
Dostęp do serwera API kubernetes można uzyskać bezpośrednio pod adresem „ https: //kubernetes.default ”. Domyślnie używa „domyślnego konta usługi” do uzyskiwania dostępu do serwera API.
Dlatego też musimy przekazać „ca cert” i „domyślny token konta usługi” w celu uwierzytelnienia na serwerze API.
Plik certyfikatu jest przechowywany w następującej lokalizacji w pod: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
i domyślny token konta usługi pod adresem: /var/run/secrets/kubernetes.io/serviceaccount/token
Możesz użyć klienta GoDaddy nodejs kubbernetes .
źródło
Miałem podobny problem z uwierzytelnianiem w GKE, gdzie skrypty Pythona nagle rzucały wyjątki. Rozwiązaniem, które zadziałało dla mnie, było udzielenie zgody na pody poprzez rolę
aby uzyskać więcej informacji, wprowadź opis linku tutaj
źródło
Dla każdego, kto używa Google Container Engine (opartego na Kubernetes):
Proste wywołanie
https://kubernetes
z poziomu klastra przy użyciu tego klienta kubernetes dla języka Java .źródło
Po włączeniu RBAC domyślne konto usługi nie ma żadnych uprawnień.
Lepiej utwórz oddzielne konto usługi dla swoich potrzeb i użyj go do utworzenia kapsuły.
Dobrze wyjaśniono tutaj https://developer.ibm.com/recipes/tutorials/service-accounts-and-auditing-in-kubernetes/
źródło
Moja wersja k8s to 1.2.0, aw innych wersjach też ma działać ^ ^
źródło
This is from the
Kubernetes w akcjibook.
Musisz zadbać o uwierzytelnianie . Sam serwer API mówi, że nie masz do niego dostępu, ponieważ nie wie, kim jesteś .
Do uwierzytelnienia potrzebny jest token uwierzytelniania. Na szczęście token jest dostarczany za pośrednictwem wspomnianego wcześniej Secret tokena domyślnego i jest przechowywany w pliku tokenu w tajnym woluminie.
Zamierzasz użyć tokena, aby uzyskać dostęp do serwera API . Najpierw załaduj token do zmiennej środowiskowej:
Token jest teraz przechowywany w zmiennej środowiskowej TOKEN . Możesz go używać podczas wysyłania zapytań do serwera API:
źródło