
Tej nocy kolejna wersja Kubernetes — . Zgodnie z tradycją naszego bloga, opowiemy o kluczowych zmianach w nowej wersji tego wspaniałego produktu Open Source.
Informacje użyte do przygotowania tego materiału pochodzą z , i odpowiednich zgłoszeniach, pull requestach, propozycjach ulepszeń Kubernetes (KEP).
Zacznijmy od ważnego wprowadzenia od SIG cluster-lifecycle: dynamiczne klastry odporne na awarie Kubernetes (a mówiąc dokładniej, self-hosted HA deployments) można teraz za pomocą znanych (w kontekście klastrów z jednym węzłem) komend kubeadm (init i join). Krótko mówiąc, w tym celu:
- certyfikaty używane przez klaster są przenoszone do tajemnic;
- aby umożliwić korzystanie z klastru etcd wewnątrz klastra K8s (tj. pozbycie się dotychczasowej zewnętrznej zależności), wdrożono ;
- dokumentowane są zalecane ustawienia dla zewnętrznego load balancera, który zapewnia konfigurację odporną na awarie (w przyszłości planuje się możliwość rezygnacji z tej zależności, ale nie na tym etapie).

Architektura klastra HA Kubernetes, stworzonego z kubeadm
Szczegóły dotyczące wdrożenia można znaleźć w . Ta funkcja była naprawdę długo oczekiwana: wersja alfa była oczekiwana już w K8s 1.9, ale pojawiła się dopiero teraz.
API
Zespół apply i w ogóle deklaratywne zarządzanie obiektami z kubectl w apiserverze. Sami deweloperzy krótko wyjaśniają swoje rozwiązanie tym, że kubectl apply jest podstawowym elementem pracy z konfiguracjami w Kubernetes, jednak „jest pełne błędów i trudno poddaje się poprawkom”, dlatego tę funkcjonalność należy doprowadzić do porządku i przenieść do control plane. Proste i przejrzyste przykłady istniejących dzisiaj problemów:

Szczegóły dotyczące wdrożenia znajdują się w . Bieżąca gotowość — wersja alfa (promocja do bety planowana jest na następne wydanie Kubernetes).
W wersji alfa udostępniono użycie schemy OpenAPI v3 do tworzenia i publikowania dokumentacji OpenAPI dla CustomResources (CR), które są używane do walidacji (po stronie serwera) zasobów K8s definiowanych przez użytkownika (CustomResourceDefinition, CRD). Publikacja OpenAPI dla CRD pozwala klientom (na przykład, kubectl) przeprowadzać walidację po swojej stronie (w ramach kubectl create i kubectl apply) oraz dostarczać dokumentację dotyczącą schemy (kubectl explain). Szczegóły — w .
Istniejące wcześniej logi z flagą O_APPEND (a nie O_TRUNC) aby uniknąć utraty logów w niektórych sytuacjach oraz dla wygody truncowania logów za pomocą zewnętrznych narzędzi do rotacji.
W kontekście API Kubernetes można również zauważyć, że PodSandbox i PodSandboxStatus pole runtime_handler dla uwzględnienia informacji o RuntimeClass podzie (więcej na ten temat można przeczytać w tekście o , gdzie ta klasa została wprowadzona jako wersja alfa), a w Admission Webhooks istnieje możliwość określenia, które wersje AdmissionReview są wspierane. W końcu w zasadach Admission Webhooks można teraz zakres ich stosowania za pomocą namespace'ów i ram klastra.
Przechowalnie
, które miały status wersji beta od wydania , stabilnymi (GA): ta brama cechowa nie jest już wyłączana i zostanie usunięta w Kubernetes 1.17.
użycia zmiennych środowiskowych tzw. (na przykład, nazwy pod'a) do nazw katalogów montowanych jako , zyskała rozwój — w postaci nowego pola subPathExpr, za pomocą którego teraz określa się potrzebną nazwę katalogu. Ta funkcja pojawiła się pierwotnie w Kubernetes 1.11, ale pozostała w statusie wersji alfa dla 1.14.
Podobnie jak w poprzednim wydaniu Kubernetes, wprowadzono wiele znaczących zmian dla prężnie rozwijającego się CSI (Container Storage Interface):
CSI
Stała się dostępna (w ramach wersji alfa) zmiana rozmiaru dla woluminów CSI. Aby z niej skorzystać, trzeba włączyć bramę cechową pod nazwą ExpandCSIVolumes, a także zapewnić wsparcie tej operacji w konkretnym sterowniku CSI.
Jeszcze jedna funkcja dla CSI w wersji alfa — bezpośrednie odniesienie (czyli bez użycia PV/PVC) do woluminów CSI w specyfikacji pod'ów. To usuwa ograniczenie w stosowaniu CSI jako wyłącznie zdalnych przechowalni danych, otwierając przed nimi drzwi do świata . Aby z niej skorzystać () należy włączyć CSIInlineVolume bramę cechową.
Zauważono postęp także we „wnętrzach” Kubernetes, których zmiany dotyczące CSI nie są tak zauważalne dla ostatecznych użytkowników (administratorów systemów)… Obecnie programiści zmuszeni są utrzymywać dwie wersje każdej wtyczki przechowalni: jedna — „w starym stylu”, wewnątrz bazy kodu K8s (in-tree), a druga — w ramach nowego CSI (więcej na ten temat przeczytaj, na przykład, w ). To powoduje zrozumiałe niedogodności, które należy usunąć w miarę stabilizacji CSI jako całości. Po prostu ogłoszenie wewnętrznych (in-tree) API wtyczek jako przestarzałych (deprecated) nie jest możliwe z powodu .
Wszystko to doprowadziło do tego, że wersje alfa osiągnęły wewnętrznego kodu wtyczek, realizowanych jako in-tree, w wtyczkach CSI, dzięki czemu troski programistów będą ograniczone do wspierania jednej wersji ich wtyczek, a zgodność ze starymi interfejsami API zostanie zachowana i będą mogły być uznane za przestarzałe według normalnego scenariusza. Oczekuje się, że do następnej wersji Kubernetes (1.15) nastąpi migracja wszystkich wtyczek dostawców chmur, implementacja uzyska status wersji beta i zostanie aktywowana w instalacjach K8s domyślnie. Szczegóły w . Następstwem tej migracji było także zniesienie ograniczeń dla wolumenów określonych przez konkretne dostawców chmur (AWS, Azure, GCE, Cinder).
Ponadto, wsparcie dla urządzeń blokowych z CSI (CSIBlockVolume) do wersji beta.
Węzły / Kubelet
Zaprezentowano wersję alfa w Kubelet, przeznaczonego do przekazywania metryk dotyczących podstawowych zasobów. Ogólnie rzecz biorąc, jeśli wcześniej Kubelet otrzymywał statystyki dotyczące użycia kontenerów z cAdvisor, to teraz dane te pochodzą z środowiska wykonywalnego kontenera przez CRI (Container Runtime Interface), jednak zachowano również zgodność z wcześniejszymi wersjami Dockera. Statystyki zebrane w Kubelet były wcześniej przekazywane przez REST API, a teraz do tego celu używany jest endpoint zlokalizowany pod adresem /metrics/resource/v1alpha1. Długoterminową strategią programistów jest minimalizacja zestawu metryk, które Kubelet udostępnia. Notabene, te metryki nie «core metrics», ale «resource metrics», i opisują jako «pierwszorzędne zasoby, takie jak CPU i pamięć».
Bardzo ciekawy niuans: mimo wyraźnej przewagi wydajności endpointu gRPC w porównaniu z różnymi użyciami formatu Prometheus wynik jednego z benchmarkingów znajdziesz poniżej, autorzy preferowali tekstowy format Prometheus ze względu na wyraźne prowadzenie tego systemu monitorowania w społeczności.
«gRPC nie jest zgodny z głównymi pipeline'ami monitorowania. Endpoint ten będzie użyteczny tylko do dostarczania metryk do Metrics Server lub komponentów monitorowania, które integrują się bezpośrednio z nim. Przy użyciu pamięci podręcznej w Metrics Server wydajność tekstowego formatu Prometheus jest wystarczająco dobra abyśmy wybrali Prometheus zamiast gRPC, biorąc pod uwagę szeroką popularność Prometheus w społeczności. Gdy format OpenMetrics stanie się bardziej stabilny, będziemy mogli zbliżyć się do wydajności gRPC przy użyciu formatu opartego na proto.

Jednym z porównawczych testów wydajności korzystania z formatów gRPC i Prometheus w nowym endpoint’cie Kubelet do metryk. Więcej wykresów i innych szczegółów można znaleźć w .
Wśród innych zmian:
- Kubelet teraz (jednorazowo) kontenery w stanie nieznanym (unknown) przed operacjami restartu i usunięcia.
- Podczas korzystania z teraz init-kontenerowi ta sama informacja, co dla zwykłego kontenera.
- Kubelet
usageNanoCoresz dostawcy statystyk CRI, a dla węzłów i kontenerów w Windows statystyka sieciowa. - Informacja o systemie operacyjnym i architekturze jest teraz zapisywana w etykietach
kubernetes.io/osikubernetes.io/archobiektów Node (przeniesione z bety do GA). - Możliwość wskazania konkretnej grupy użytkowników systemu dla kontenerów w pod’zie (
RunAsGroup, została wprowadzona w ) do wersji beta (włączonej domyślnie). - du i find, używane w cAdvisor, na implementacje w Go.
CLI
W cli-runtime i kubectl flaga -k do integracji z (nawiasem mówiąc, jego rozwój jest teraz prowadzony w osobnym repozytorium), czyli do przetwarzania dodatkowych plików YAML z specjalnych katalogów kustomizacji (szczegóły dotyczące ich użycia w ):

Przykład prostego użycia pliku (możliwe jest też bardziej złożone zastosowanie kustomize w ramach )
Ponadto:
- nowa komenda
kubectl create cronjob, której nazwa mówi sama za siebie. - W
kubectl logsjest teraz możliwe flagi-f(--followdo strumieniowania logów) i-l(--selectordo zapytania o etykietę). - kubectl kopiować pliki wybierane za pomocą wild card.
- Do zespołu
kubectl waitflaga--alldo wybrania wszystkich zasobów w przestrzeni nazw określonego typu zasobów.
Inne
Stabilny (GA) status uzyskali następujące możliwości:
- , używany w specyfikacji pod’a do określenia dodatkowych warunków uwzględnianych w gotowości pod’a;
- Wsparcie dla dużych stron (feature gate o nazwie );
- ;
- PriorityClass API, .
Inne zmiany wprowadzone w Kubernetes 1.14:
- Domyślnie polityka RBAC nie daje już dostępu do API
discoveryiaccess-reviewużytkownikom bez uwierzytelnienia (unauthenticated). - Oficjalne wsparcie dla CoreDNS tylko dla systemów Linux, dlatego podczas używania kubeadm do jego (CoreDNS) wdrażania w klastrze węzły muszą działać tylko na Linuxie (do tego ograniczenia używane są nodeSelectors).
- Domyślna konfiguracja CoreDNS teraz zamiast proxy. Ponadto, w CoreDNS readinessProbe, zapobiegająca balansowaniu obciążenia na odpowiednich (nieprzygotowanych do obsługi) podach.
- W kubeadm, w fazach
initlubupload-certs, przesyłanie certyfikatów wymaganych do podłączenia nowego control-plane do sekretu kubeadm-certs (używany jest znacznik--experimental-upload-certs). - Dla instalacji Windows pojawiła się wersja alfa gMSA (Group Managed Service Account) — specjalne konta w Active Directory, które mogą być używane również przez kontenery.
- Dla GCE szyfrowanie mTLS między etcd a kube-apiserver.
- Aktualizacje w używanym/zależnym oprogramowaniu: Go 1.12.1, CSI 1.1, CoreDNS 1.3.1, wsparcie dla Dockera 18.09 w kubeadm, a minimalną wspieraną wersją Docker API stała się 1.26.
P.S.
Przeczytaj także na naszym blogu:
- «»;
- «»;
- «»;
- «».
Źródło: habr.com
