Kubernetes - szybki przewodnik

Kubernetes w narzędziu do zarządzania kontenerami typu open source obsługiwanym przez Cloud Native Computing Foundation (CNCF). Jest to również znane jako ulepszona wersja Borg, która została opracowana w Google do zarządzania zarówno długotrwałymi procesami, jak i zadaniami wsadowymi, które wcześniej były obsługiwane przez oddzielne systemy.

Kubernetes oferuje możliwość automatyzacji wdrażania, skalowania aplikacji i operacji na kontenerach aplikacji w klastrach. Jest w stanie stworzyć infrastrukturę zorientowaną na kontener.

Funkcje Kubernetes

Oto niektóre z ważnych funkcji Kubernetes.

  • Kontynuuje rozwój, integrację i wdrażanie

  • Infrastruktura kontenerowa

  • Zarządzanie ukierunkowane na aplikacje

  • Infrastruktura skalowalna automatycznie

  • Spójność środowiska w testowaniu i produkcji

  • Infrastruktura luźno powiązana, w której każdy komponent może działać jako oddzielna jednostka

  • Większa gęstość wykorzystania zasobów

  • Przewidywalna infrastruktura, która zostanie stworzona

Jednym z kluczowych elementów Kubernetes jest to, że może uruchamiać aplikacje na klastrach infrastruktury maszyn fizycznych i wirtualnych. Ma również możliwość uruchamiania aplikacji w chmurze.It helps in moving from host-centric infrastructure to container-centric infrastructure.

W tym rozdziale omówimy podstawową architekturę Kubernetes.

Kubernetes - architektura klastra

Jak widać na poniższym diagramie, Kubernetes jest zgodny z architekturą klient-serwer. W tym przypadku mamy master zainstalowany na jednej maszynie, a węzeł na osobnych maszynach Linux.

Kluczowe komponenty master i node są zdefiniowane w następnej sekcji.

Kubernetes - główne komponenty maszyn

Poniżej znajdują się komponenty Kubernetes Master Machine.

etcd

Przechowuje informacje o konfiguracji, które mogą być używane przez każdy z węzłów w klastrze. Jest to magazyn wartości kluczy o wysokiej dostępności, który można rozdzielić na wiele węzłów. Jest dostępny tylko dla serwera Kubernetes API, ponieważ może zawierać poufne informacje. Jest to rozproszony magazyn wartości kluczy, dostępny dla wszystkich.

Serwer API

Kubernetes to serwer API, który zapewnia całą operację na klastrze za pomocą API. Serwer API implementuje interfejs, co oznacza, że ​​różne narzędzia i biblioteki mogą się z nim łatwo komunikować.Kubeconfigto pakiet wraz z narzędziami po stronie serwera, których można używać do komunikacji. Udostępnia Kubernetes API.

Kierownik Kontrolera

Ten komponent jest odpowiedzialny za większość kolektorów, które regulują stan klastra i wykonują zadanie. Ogólnie można go uznać za demona działającego w pętli nie kończącej się i odpowiedzialnego za zbieranie i wysyłanie informacji do serwera API. Działa w kierunku uzyskania udostępnionego stanu klastra, a następnie wprowadzenia zmian w celu przywrócenia bieżącego stanu serwera do pożądanego stanu. Kluczowymi kontrolerami są kontroler replikacji, kontroler punktu końcowego, kontroler przestrzeni nazw i kontroler konta usługi. Menedżer kontrolera obsługuje różnego rodzaju kontrolery do obsługi węzłów, punktów końcowych itp.

Planista

Jest to jeden z kluczowych elementów mastera Kubernetes. Jest to usługa master odpowiedzialna za dystrybucję obciążenia. Odpowiada za śledzenie wykorzystania obciążenia roboczego w węzłach klastra, a następnie umieszczanie obciążenia, na którym zasoby są dostępne, i akceptowanie obciążenia. Innymi słowy, jest to mechanizm odpowiedzialny za przydzielanie zasobników do dostępnych węzłów. Harmonogram jest odpowiedzialny za wykorzystanie obciążenia i przydzielanie pod do nowego węzła.

Kubernetes - składniki węzłów

Poniżej znajdują się kluczowe komponenty serwera Node, które są niezbędne do komunikacji z masterem Kubernetes.

Doker

Pierwszym wymaganiem każdego węzła jest Docker, który pomaga w uruchamianiu hermetyzowanych kontenerów aplikacji w stosunkowo izolowanym, ale lekkim środowisku operacyjnym.

Usługa Kubelet

Jest to niewielka usługa w każdym węźle odpowiedzialna za przekazywanie informacji do i z usługi płaszczyzny kontroli. Współdziała zetcdstore, aby odczytać szczegóły konfiguracji i wartości wright. To komunikuje się z głównym komponentem w celu otrzymywania poleceń i pracy. Plikkubeletproces przejmuje wtedy odpowiedzialność za utrzymanie stanu pracy i serwera węzła. Zarządza regułami sieciowymi, przekierowaniem portów itp.

Usługa proxy Kubernetes

Jest to usługa proxy, która działa na każdym węźle i pomaga w udostępnianiu usług hostowi zewnętrznemu. Pomaga w przekazywaniu żądania do poprawnych kontenerów i jest w stanie wykonać podstawowe równoważenie obciążenia. Daje pewność, że środowisko sieciowe jest przewidywalne i dostępne, a jednocześnie jest izolowane. Zarządza podami w węźle, woluminach, sekretach, tworzy kontrolę stanu nowych kontenerów itp.

Kubernetes - struktura główna i węzłowa

Poniższe ilustracje przedstawiają strukturę Kubernetes Master i Node.

Ważne jest, aby skonfigurować wirtualne centrum danych (vDC) przed skonfigurowaniem Kubernetes. Można to uznać za zestaw maszyn, na których mogą komunikować się ze sobą za pośrednictwem sieci. Aby uzyskać praktyczne podejście, możesz ustawić vDC naPROFITBRICKS jeśli nie masz skonfigurowanej infrastruktury fizycznej lub chmury.

Po zakończeniu konfiguracji IaaS w dowolnej chmurze należy skonfigurować Master i Node.

Note- Konfiguracja jest pokazana dla maszyn Ubuntu. To samo można skonfigurować również na innych komputerach z systemem Linux.

Wymagania wstępne

Installing Docker- Docker jest wymagany we wszystkich wystąpieniach Kubernetes. Poniżej przedstawiono kroki, aby zainstalować Docker.

Step 1 - Zaloguj się do komputera za pomocą konta użytkownika root.

Step 2- Zaktualizuj informacje o pakiecie. Upewnij się, że pakiet apt działa.

Step 3 - Uruchom następujące polecenia.

$ sudo apt-get update $ sudo apt-get install apt-transport-https ca-certificates

Step 4 - Dodaj nowy klucz GPG.

$ sudo apt-key adv \ --keyserver hkp://ha.pool.sks-keyservers.net:80 \ --recv-keys 58118E89F3A912897C070ADBF76221572C52609D $ echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee
/etc/apt/sources.list.d/docker.list

Step 5 - Zaktualizuj obraz pakietu interfejsu API.

$ sudo apt-get update

Po wykonaniu wszystkich powyższych zadań można rozpocząć właściwą instalację silnika Docker. Jednak zanim to nastąpi, musisz sprawdzić, czy wersja jądra, której używasz, jest poprawna.

Zainstaluj silnik platformy Docker

Uruchom następujące polecenia, aby zainstalować aparat Docker.

Step 1 - Zaloguj się do komputera.

Step 2 - Zaktualizuj indeks pakietu.

$ sudo apt-get update

Step 3 - Zainstaluj aparat Docker za pomocą następującego polecenia.

$ sudo apt-get install docker-engine

Step 4 - Uruchom demona Dockera.

$ sudo apt-get install docker-engine

Step 5 - Aby bardzo, jeśli Docker jest zainstalowany, użyj następującego polecenia.

$ sudo docker run hello-world

Zainstaluj etcd 2.0

Należy to zainstalować na Kubernetes Master Machine. Aby go zainstalować, uruchom następujące polecenia.

$ curl -L https://github.com/coreos/etcd/releases/download/v2.0.0/etcd
-v2.0.0-linux-amd64.tar.gz -o etcd-v2.0.0-linux-amd64.tar.gz ->1
$ tar xzvf etcd-v2.0.0-linux-amd64.tar.gz ------>2 $ cd etcd-v2.0.0-linux-amd64 ------------>3
$ mkdir /opt/bin ------------->4 $ cp etcd* /opt/bin ----------->5

W powyższym zestawie poleceń -

  • Najpierw pobieramy plik etcd. Zapisz to pod określoną nazwą.
  • Następnie musimy odtarować pakiet tar.
  • Robimy reż. wewnątrz / opt o nazwie bin.
  • Skopiuj wyodrębniony plik do lokalizacji docelowej.

Teraz jesteśmy gotowi do budowy Kubernetes. Musimy zainstalować Kubernetes na wszystkich komputerach w klastrze.

$ git clone https://github.com/GoogleCloudPlatform/kubernetes.git $ cd kubernetes
$ make release

Powyższe polecenie utworzy plik _outputdir w katalogu głównym folderu kubernetes. Następnie możemy wyodrębnić katalog do dowolnego wybranego przez nas katalogu / opt / bin itp.

Następnie przychodzi część dotycząca sieci, w której musimy zacząć od konfiguracji mastera i węzła Kubernetes. W tym celu dokonamy wpisu w pliku hosta, który można wykonać na komputerze węzła.

$ echo "<IP address of master machine> kube-master
< IP address of Node Machine>" >> /etc/hosts

Poniżej będzie wynik powyższego polecenia.

Teraz zaczniemy od rzeczywistej konfiguracji w Kubernetes Master.

Najpierw zaczniemy kopiować wszystkie pliki konfiguracyjne do ich właściwej lokalizacji.

$ cp <Current dir. location>/kube-apiserver /opt/bin/ $ cp <Current dir. location>/kube-controller-manager /opt/bin/
$ cp <Current dir. location>/kube-kube-scheduler /opt/bin/ $ cp <Current dir. location>/kubecfg /opt/bin/
$ cp <Current dir. location>/kubectl /opt/bin/ $ cp <Current dir. location>/kubernetes /opt/bin/

Powyższe polecenie skopiuje wszystkie pliki konfiguracyjne do wymaganej lokalizacji. Teraz wrócimy do tego samego katalogu, w którym zbudowaliśmy folder Kubernetes.

$ cp kubernetes/cluster/ubuntu/init_conf/kube-apiserver.conf /etc/init/ $ cp kubernetes/cluster/ubuntu/init_conf/kube-controller-manager.conf /etc/init/
$ cp kubernetes/cluster/ubuntu/init_conf/kube-kube-scheduler.conf /etc/init/ $ cp kubernetes/cluster/ubuntu/initd_scripts/kube-apiserver /etc/init.d/
$ cp kubernetes/cluster/ubuntu/initd_scripts/kube-controller-manager /etc/init.d/ $ cp kubernetes/cluster/ubuntu/initd_scripts/kube-kube-scheduler /etc/init.d/

$ cp kubernetes/cluster/ubuntu/default_scripts/kubelet /etc/default/ $ cp kubernetes/cluster/ubuntu/default_scripts/kube-proxy /etc/default/
$ cp kubernetes/cluster/ubuntu/default_scripts/kubelet /etc/default/

Następnym krokiem jest aktualizacja skopiowanego pliku konfiguracyjnego w / etc. reż.

Skonfiguruj etcd na urządzeniu głównym za pomocą następującego polecenia.

$ ETCD_OPTS = "-listen-client-urls = http://kube-master:4001"

Skonfiguruj kube-apiserver

W tym celu na wzorcu musimy edytować plik /etc/default/kube-apiserver plik, który skopiowaliśmy wcześniej.

$ KUBE_APISERVER_OPTS = "--address = 0.0.0.0 \
--port = 8080 \
--etcd_servers = <The path that is configured in ETCD_OPTS> \
--portal_net = 11.1.1.0/24 \
--allow_privileged = false \
--kubelet_port = < Port you want to configure> \
--v = 0"

Skonfiguruj menedżera kontrolera kube

Musimy dodać następującą zawartość w /etc/default/kube-controller-manager.

$ KUBE_CONTROLLER_MANAGER_OPTS = "--address = 0.0.0.0 \
--master = 127.0.0.1:8080 \
--machines = kube-minion \ -----> #this is the kubernatics node
--v = 0

Następnie skonfiguruj harmonogram Kube w odpowiednim pliku.

$ KUBE_SCHEDULER_OPTS = "--address = 0.0.0.0 \
--master = 127.0.0.1:8080 \
--v = 0"

Gdy wszystkie powyższe zadania zostaną ukończone, możemy przejść dalej i przywołać Kubernetes Master. Aby to zrobić, zrestartujemy Dockera.

$ service docker restart

Konfiguracja węzła Kubernetes

Węzeł Kubernetes będzie uruchamiał dwie usługi kubelet and the kube-proxy. Zanim przejdziemy dalej, musimy skopiować pliki binarne, które pobraliśmy do ich wymaganych folderów, w których chcemy skonfigurować węzeł kubernetes.

Użyj tej samej metody kopiowania plików, którą zrobiliśmy dla wzorca kubernetes. Ponieważ będzie uruchamiać tylko kubelet i kube-proxy, skonfigurujemy je.

$ cp <Path of the extracted file>/kubelet /opt/bin/ $ cp <Path of the extracted file>/kube-proxy /opt/bin/
$ cp <Path of the extracted file>/kubecfg /opt/bin/ $ cp <Path of the extracted file>/kubectl /opt/bin/
$ cp <Path of the extracted file>/kubernetes /opt/bin/

Teraz skopiujemy treść do odpowiedniego katalogu.

$ cp kubernetes/cluster/ubuntu/init_conf/kubelet.conf /etc/init/
$ cp kubernetes/cluster/ubuntu/init_conf/kube-proxy.conf /etc/init/ $ cp kubernetes/cluster/ubuntu/initd_scripts/kubelet /etc/init.d/
$ cp kubernetes/cluster/ubuntu/initd_scripts/kube-proxy /etc/init.d/ $ cp kubernetes/cluster/ubuntu/default_scripts/kubelet /etc/default/
$ cp kubernetes/cluster/ubuntu/default_scripts/kube-proxy /etc/default/

Skonfigurujemy kubelet i kube-proxy conf akta.

Skonfigurujemy /etc/init/kubelet.conf.

$ KUBELET_OPTS = "--address = 0.0.0.0 \
--port = 10250 \
--hostname_override = kube-minion \
--etcd_servers = http://kube-master:4001 \
--enable_server = true
--v = 0"
/

W przypadku kube-proxy skonfigurujemy za pomocą następującego polecenia.

$ KUBE_PROXY_OPTS = "--etcd_servers = http://kube-master:4001 \
--v = 0"
/etc/init/kube-proxy.conf

Na koniec zrestartujemy usługę Docker.

$ service docker restart

Teraz skończyliśmy konfigurację. Możesz to sprawdzić, uruchamiając następujące polecenia.

$ /opt/bin/kubectl get minions

Obrazy Kubernetes (Docker) są kluczowymi elementami składowymi infrastruktury kontenerowej. Na razie obsługujemy Kubernetes tylko do obsługi obrazów Dockera. Każdy kontener w kapsule ma w sobie uruchomiony obraz Dockera.

Kiedy konfigurujemy pod, właściwość obrazu w pliku konfiguracyjnym ma taką samą składnię jak polecenie Docker. Plik konfiguracyjny zawiera pole do zdefiniowania nazwy obrazu, który planujemy pobrać z rejestru.

Poniżej znajduje się wspólna struktura konfiguracji, która pobierze obraz z rejestru Docker i wdroży go do kontenera Kubernetes.

apiVersion: v1
kind: pod
metadata:
   name: Tesing_for_Image_pull -----------> 1
   spec:
      containers:
         - name: neo4j-server ------------------------> 2
         image: <Name of the Docker image>----------> 3
         imagePullPolicy: Always ------------->4
         command: ["echo", "SUCCESS"] ------------------->

W powyższym kodzie zdefiniowaliśmy -

  • name: Tesing_for_Image_pull - Ta nazwa ma na celu zidentyfikowanie i sprawdzenie nazwy kontenera, który zostałby utworzony po ściągnięciu obrazów z rejestru Docker.

  • name: neo4j-server- To jest nazwa nadana kontenerowi, który próbujemy utworzyć. Tak jak daliśmy neo4j-server.

  • image: <Name of the Docker image>- To jest nazwa obrazu, który próbujemy pobrać z Dockera lub wewnętrznego rejestru obrazów. Musimy zdefiniować pełną ścieżkę rejestru wraz z nazwą obrazu, który próbujemy pobrać.

  • imagePullPolicy - Zawsze - ta zasada pobierania obrazu określa, że ​​za każdym razem, gdy uruchomimy ten plik w celu utworzenia kontenera, ponownie pobierze on tę samą nazwę.

  • command: [“echo”, “SUCCESS”] - Dzięki temu, gdy utworzymy kontener i jeśli wszystko pójdzie dobrze, wyświetli się komunikat, gdy uzyskamy dostęp do kontenera.

Aby pobrać obraz i utworzyć kontener, uruchomimy następujące polecenie.

$ kubectl create –f Tesing_for_Image_pull

Po pobraniu dziennika otrzymamy wynik jako pomyślny.

$ kubectl log Tesing_for_Image_pull

Powyższe polecenie zakończy się sukcesem lub otrzymamy wynik jako niepowodzenie.

Note - Zaleca się samodzielne wypróbowanie wszystkich poleceń.

Główną funkcją zadania jest stworzenie jednej lub więcej kapsuły i śledzenie sukcesu strąków. Zapewniają pomyślne ukończenie określonej liczby zasobników. Po zakończeniu określonej liczby pomyślnych uruchomień zasobników zadanie jest uznawane za zakończone.

Tworzenie pracy

Użyj następującego polecenia, aby utworzyć zadanie -

apiVersion: v1
kind: Job ------------------------> 1
metadata:
   name: py
   spec:
   template:
      metadata
      name: py -------> 2
      spec:
         containers:
            - name: py ------------------------> 3
            image: python----------> 4
            command: ["python", "SUCCESS"]
            restartPocliy: Never --------> 5

W powyższym kodzie zdefiniowaliśmy -

  • kind: Job → Zdefiniowaliśmy ten rodzaj jako Hiob, który powie kubectl że yaml używany plik służy do tworzenia pod typu zadania.

  • Name:py → To jest nazwa szablonu, którego używamy, a specyfikacja definiuje szablon.

  • name: py → nadaliśmy nazwę jako py pod specyfikacją kontenera, która pomaga zidentyfikować Pod, który zostanie z niego utworzony.

  • Image: python → obraz, który będziemy ciągnąć, aby stworzyć pojemnik, który będzie działał wewnątrz kapsuły.

  • restartPolicy: Never →Ten warunek ponownego uruchomienia obrazu jest podawany jako nigdy, co oznacza, że ​​jeśli kontener zostanie zabity lub jeśli jest fałszywy, nie uruchomi się ponownie.

Utworzymy zadanie za pomocą następującego polecenia z yaml, który jest zapisywany pod nazwą py.yaml.

$ kubectl create –f py.yaml

Powyższe polecenie utworzy zadanie. Jeśli chcesz sprawdzić stan zadania, użyj następującego polecenia.

$ kubectl describe jobs/py

Powyższe polecenie utworzy zadanie. Jeśli chcesz sprawdzić stan zadania, użyj następującego polecenia.

Zaplanowana praca

Zaplanowane zadanie w Kubernetes używa Cronetes, który przyjmuje zadanie Kubernetes i uruchamia je w klastrze Kubernetes.

  • Planowanie zadania spowoduje uruchomienie zasobnika w określonym momencie.
  • Tworzy się dla niego parodystyczną pracę, która wywołuje się automatycznie.

Note - Funkcja zaplanowanego zadania jest obsługiwana przez wersję 1.4, a API betch / v2alpha 1 jest włączane po przejściu –runtime-config=batch/v2alpha1 podczas uruchamiania serwera API.

Użyjemy tego samego yamla, którego użyliśmy do utworzenia zadania i ustawimy je jako zaplanowane.

apiVersion: v1
kind: Job
metadata:
   name: py
spec:
   schedule: h/30 * * * * ? -------------------> 1
   template:
      metadata
         name: py
      spec:
         containers:
         - name: py
         image: python
         args:
/bin/sh -------> 2
-c
ps –eaf ------------> 3
restartPocliy: OnFailure

W powyższym kodzie zdefiniowaliśmy -

  • schedule: h/30 * * * * ? → Aby zaplanować uruchamianie zadania co 30 minut.

  • /bin/sh: To wejdzie do kontenera z / bin / sh

  • ps –eaf → Uruchomi polecenie ps -eaf na komputerze i wyświetli listę wszystkich uruchomionych procesów wewnątrz kontenera.

Ta koncepcja zaplanowanego zadania jest przydatna, gdy próbujemy zbudować i uruchomić zestaw zadań w określonym momencie, a następnie zakończyć proces.

Etykiety

Etykiety to pary klucz-wartość, które są dołączone do podów, kontrolera replikacji i usług. Są używane jako atrybuty identyfikujące obiekty, takie jak pody i kontroler replikacji. Można je dodawać do obiektu w czasie tworzenia i można je dodawać lub modyfikować w czasie wykonywania.

Selektory

Etykiety nie zapewniają wyjątkowości. Ogólnie można powiedzieć, że wiele obiektów może mieć takie same etykiety. Selektor etykiet to podstawowy element grupujący w Kubernetes. Są używane przez użytkowników do wybierania zbioru obiektów.

Kubernetes API obsługuje obecnie dwa typy selektorów -

  • Selektory oparte na równości
  • Selektory oparte na zestawie

Selektory oparte na równości

Umożliwiają filtrowanie według klucza i wartości. Pasujące obiekty powinny spełniać wszystkie określone etykiety.

Selektory oparte na zestawie

Selektory oparte na zbiorach umożliwiają filtrowanie kluczy według zestawu wartości.

apiVersion: v1
kind: Service
metadata:
   name: sp-neo4j-standalone
spec:
   ports:
      - port: 7474
      name: neo4j
   type: NodePort
   selector:
      app: salesplatform ---------> 1
      component: neo4j -----------> 2

W powyższym kodzie używamy selektora etykiet jako app: salesplatform i komponent jak component: neo4j.

Po uruchomieniu pliku przy użyciu rozszerzenia kubectl polecenie, utworzy usługę o nazwie sp-neo4j-standalone który będzie komunikował się na porcie 7474. Ype to NodePort z nowym selektorem etykiet jako app: salesplatform i component: neo4j.

Przestrzeń nazw zapewnia dodatkową kwalifikację do nazwy zasobu. Jest to pomocne, gdy wiele zespołów korzysta z tego samego klastra i istnieje możliwość kolizji nazw. Może to być wirtualna ściana między wieloma klastrami.

Funkcjonalność przestrzeni nazw

Oto niektóre z ważnych funkcji przestrzeni nazw w Kubernetes -

  • Przestrzenie nazw ułatwiają komunikację między podami przy użyciu tej samej przestrzeni nazw.

  • Przestrzenie nazw to wirtualne klastry, które mogą znajdować się na szczycie tego samego klastra fizycznego.

  • Zapewniają logiczne oddzielenie zespołów i ich środowisk.

Utwórz przestrzeń nazw

Następujące polecenie służy do tworzenia przestrzeni nazw.

apiVersion: v1
kind: Namespce
metadata
   name: elk

Kontroluj przestrzeń nazw

Następujące polecenie służy do sterowania przestrzenią nazw.

$ kubectl create –f namespace.yml ---------> 1
$ kubectl get namespace -----------------> 2 $ kubectl get namespace <Namespace name> ------->3
$ kubectl describe namespace <Namespace name> ---->4 $ kubectl delete namespace <Namespace name>

W powyższym kodzie

  • Używamy polecenia, aby utworzyć przestrzeń nazw.
  • Spowoduje to wyświetlenie wszystkich dostępnych przestrzeni nazw.
  • Spowoduje to uzyskanie określonej przestrzeni nazw, której nazwa jest określona w poleceniu.
  • W tym miejscu zostaną opisane wszystkie szczegóły dotyczące usługi.
  • Spowoduje to usunięcie określonej przestrzeni nazw obecnej w klastrze.

Korzystanie z przestrzeni nazw w usłudze - przykład

Poniżej znajduje się przykładowy plik dotyczący używania przestrzeni nazw w usłudze.

apiVersion: v1
kind: Service
metadata:
   name: elasticsearch
   namespace: elk
   labels:
      component: elasticsearch
spec:
   type: LoadBalancer
   selector:
      component: elasticsearch
   ports:
   - name: http
      port: 9200
      protocol: TCP
   - name: transport
      port: 9300
      protocol: TCP

W powyższym kodzie używamy tej samej przestrzeni nazw w metadanych usługi o nazwie elk.

Węzeł to działająca maszyna w klastrze Kubernetes, znana również jako stronnik. Są to jednostki robocze, które mogą być instancjami fizycznymi, wirtualnymi lub chmurowymi.

Każdy węzeł ma całą wymaganą konfigurację wymaganą do uruchomienia na nim platformy, takiej jak usługa proxy i usługa kubelet wraz z platformą Docker, która jest używana do uruchamiania kontenerów platformy Docker w pod utworzonym w węźle.

Nie są tworzone przez Kubernetes, ale są tworzone zewnętrznie przez dostawcę usług w chmurze lub menedżera klastra Kubernetes na maszynach fizycznych lub maszynach wirtualnych.

Kluczowym elementem Kubernetes do obsługi wielu węzłów jest menedżer kontrolerów, który obsługuje wiele rodzajów kontrolerów do zarządzania węzłami. Aby zarządzać węzłami, Kubernetes tworzy obiekt typu węzeł, który potwierdzi, że utworzony obiekt jest prawidłowym węzłem.

Serwis z Selektorem

apiVersion: v1
kind: node
metadata:
   name: < ip address of the node>
   labels:
      name: <lable name>

W formacie JSON tworzony jest rzeczywisty obiekt, który wygląda następująco -

{
   Kind: node
   apiVersion: v1
   "metadata": 
   {
      "name": "10.01.1.10",
      "labels"
      {
         "name": "cluster 1 node"
      }
   }
}

Kontroler węzła

Są zbiorem usług, które działają w Kubernetes master i na bieżąco monitorują węzeł w klastrze na podstawie metadata.name. Jeśli wszystkie wymagane usługi są uruchomione, węzeł jest sprawdzany, a nowo utworzony pod zostanie przypisany do tego węzła przez kontroler. Jeśli nie jest ważny, master nie przypisze do niego żadnego strąka i będzie czekał, aż stanie się ważny.

Mistrz Kubernetes automatycznie rejestruje węzeł, jeśli –register-node flaga jest prawdziwa.

–register-node = true

Jeśli jednak administrator klastra chce zarządzać nim ręcznie, można to zrobić, obracając mieszkanie o -

–register-node = false

Usługę można zdefiniować jako logiczny zestaw zasobników. Można go zdefiniować jako abstrakcję w górnej części kapsuły, która zapewnia pojedynczy adres IP i nazwę DNS, za pomocą której można uzyskać dostęp do zasobników. Dzięki usłudze bardzo łatwo jest zarządzać konfiguracją równoważenia obciążenia. Pomaga strąkom w bardzo łatwym skalowaniu.

Usługa to obiekt REST w Kubernetes, którego definicję można przesłać do Kubernetes apiServer na serwerze głównym Kubernetes w celu utworzenia nowej instancji.

Usługa bez selektora

apiVersion: v1
kind: Service
metadata:
   name: Tutorial_point_service
spec:
   ports:
   - port: 8080
   targetPort: 31999

Powyższa konfiguracja utworzy usługę o nazwie Tutorial_point_service.

Plik konfiguracji usługi z selektorem

apiVersion: v1
kind: Service
metadata:
   name: Tutorial_point_service
spec:
   selector:
      application: "My Application" -------------------> (Selector)
   ports:
   - port: 8080
   targetPort: 31999

W tym przykładzie mamy selektor; więc aby przenieść ruch, musimy ręcznie utworzyć punkt końcowy.

apiVersion: v1
kind: Endpoints
metadata:
   name: Tutorial_point_service
subnets:
   address:
      "ip": "192.168.168.40" -------------------> (Selector)
   ports:
      - port: 8080

W powyższym kodzie utworzyliśmy punkt końcowy, który będzie kierował ruch do punktu końcowego zdefiniowanego jako „192.168.168.40:8080”.

Tworzenie usług wieloportowych

apiVersion: v1
kind: Service
metadata:
   name: Tutorial_point_service
spec:
   selector:
      application: “My Application” -------------------> (Selector)
   ClusterIP: 10.3.0.12
   ports:
      -name: http
      protocol: TCP
      port: 80
      targetPort: 31999
   -name:https
      Protocol: TCP
      Port: 443
      targetPort: 31998

Rodzaje usług

ClusterIP- Pomaga to w ograniczaniu usługi w klastrze. Ujawnia usługę w ramach zdefiniowanego klastra Kubernetes.

spec:
   type: NodePort
   ports:
   - port: 8080
      nodePort: 31999
      name: NodeportService

NodePort- Ujawni usługę na statycznym porcie we wdrożonym węźle. ZAClusterIP usługa, do której NodePortusługa będzie kierować, jest tworzony automatycznie. Dostęp do usługi można uzyskać spoza klastra za pomocąNodeIP:nodePort.

spec:
   ports:
   - port: 8080
      nodePort: 31999
      name: NodeportService
      clusterIP: 10.20.30.40

Load Balancer - Wykorzystuje system równoważenia obciążenia dostawców usług w chmurze. NodePort i ClusterIP usługi są tworzone automatycznie, do których będzie kierować zewnętrzny moduł równoważenia obciążenia.

Pełna obsługa yamlplik z typem usługi jako Port węzła. Spróbuj sam go stworzyć.

apiVersion: v1
kind: Service
metadata:
   name: appname
   labels:
      k8s-app: appname
spec:
   type: NodePort
   ports:
   - port: 8080
      nodePort: 31999
      name: omninginx
   selector:
      k8s-app: appname
      component: nginx
      env: env_name

Pod to zbiór kontenerów i ich miejsca przechowywania w węźle klastra Kubernetes. Możliwe jest utworzenie kapsuły z wieloma kontenerami w środku. Na przykład przechowywanie kontenera bazy danych i kontenera danych w tym samym pod.

Rodzaje strąków

Istnieją dwa rodzaje strąków -

  • Jeden pojemnik na pojemnik
  • Pojemnik na wiele pojemników

Pojedyncza kapsuła kontenerowa

Można je po prostu utworzyć za pomocą polecenia kubctl run, w którym masz zdefiniowany obraz w rejestrze Dockera, który pobierzemy podczas tworzenia poda.

$ kubectl run <name of pod> --image=<name of the image from registry>

Example - Stworzymy kapsułę z obrazem kocura, który jest dostępny w hubie Docker.

$ kubectl run tomcat --image = tomcat:8.0

Można to również zrobić, tworząc plik yaml plik, a następnie uruchom plik kubectl create Komenda.

apiVersion: v1
kind: Pod
metadata:
   name: Tomcat
spec:
   containers:
   - name: Tomcat
    image: tomcat: 8.0
    ports:
containerPort: 7500
   imagePullPolicy: Always

Kiedyś powyżej yaml plik zostanie utworzony, zapiszemy plik pod nazwą tomcat.yml i uruchom polecenie create, aby uruchomić dokument.

$ kubectl create –f tomcat.yml

Stworzy kapsułę z imieniem kocur. Możemy użyć polecenia opisz razem zkubectl opisać kapsułę.

Pojemnik na wiele pojemników

Wiele kontenerów jest tworzonych przy użyciu yaml mail z definicją pojemników.

apiVersion: v1
kind: Pod
metadata:
   name: Tomcat
spec:
   containers:
   - name: Tomcat
    image: tomcat: 8.0
    ports:
containerPort: 7500
   imagePullPolicy: Always
   -name: Database
   Image: mongoDB
   Ports:
containerPort: 7501
   imagePullPolicy: Always

W powyższym kodzie utworzyliśmy jeden kapsułę z dwoma kontenerami wewnątrz, jeden dla tomcat, a drugi dla MongoDB.

Kontroler replikacji to jedna z kluczowych funkcji Kubernetes, która jest odpowiedzialna za zarządzanie cyklem życia poda. Jest odpowiedzialny za upewnienie się, że określona liczba replik pod jest uruchomiona w dowolnym momencie. Jest używany w czasie, gdy chce się upewnić, że określona liczba kapsułek lub co najmniej jeden jest uruchomiony. Ma możliwość podniesienia lub zmniejszenia określonej liczby strąków.

Najlepszą praktyką jest używanie kontrolera replikacji do zarządzania cyklem życia kapsuły zamiast wielokrotnego tworzenia kapsuły.

apiVersion: v1
kind: ReplicationController --------------------------> 1
metadata:
   name: Tomcat-ReplicationController --------------------------> 2
spec:
   replicas: 3 ------------------------> 3
   template:
      metadata:
         name: Tomcat-ReplicationController
      labels:
         app: App
         component: neo4j
      spec:
         containers:
         - name: Tomcat- -----------------------> 4
         image: tomcat: 8.0
         ports:
            - containerPort: 7474 ------------------------> 5

Szczegóły konfiguracji

  • Kind: ReplicationController → W powyższym kodzie zdefiniowaliśmy rodzaj jako kontroler replikacji, który informuje plik kubectl że yaml plik zostanie użyty do utworzenia kontrolera replikacji.

  • name: Tomcat-ReplicationController→ Pomaga to w identyfikacji nazwy, pod którą zostanie utworzony kontroler replikacji. Jeśli uruchomimy kubctl, pobierzrc < Tomcat-ReplicationController > pokaże szczegóły kontrolera replikacji.

  • replicas: 3 → Pomaga to kontrolerowi replikacji zrozumieć, że musi utrzymywać trzy repliki kapsuły w dowolnym momencie cyklu życia kapsuły.

  • name: Tomcat → W sekcji specyfikacji zdefiniowaliśmy nazwę jako tomcat, która powie kontrolerowi replikacji, że kontener znajdujący się w zasobnikach to tomcat.

  • containerPort: 7474 → Pomaga to w upewnieniu się, że wszystkie węzły w klastrze, w których jest uruchomiony kontener wewnątrz kapsuły, będą widoczne na tym samym porcie 7474.

Tutaj usługa Kubernetes działa jako moduł równoważenia obciążenia dla trzech replik tomcat.

Zestaw replik zapewnia, ile replik zasobnika powinno być uruchomionych. Można to uznać za zamiennik kontrolera replikacji. Kluczowa różnica między zestawem replik a kontrolerem replikacji polega na tym, że kontroler replikacji obsługuje tylko selektor oparty na równości, podczas gdy zestaw replik obsługuje selektor oparty na zestawie.

apiVersion: extensions/v1beta1 --------------------->1
kind: ReplicaSet --------------------------> 2
metadata:
   name: Tomcat-ReplicaSet
spec:
   replicas: 3
   selector:
      matchLables:
         tier: Backend ------------------> 3
      matchExpression:
{ key: tier, operation: In, values: [Backend]} --------------> 4
template:
   metadata:
      lables:
         app: Tomcat-ReplicaSet
         tier: Backend
      labels:
         app: App
         component: neo4j
   spec:
      containers:
      - name: Tomcat
      image: tomcat: 8.0
      ports:
      - containerPort: 7474

Szczegóły konfiguracji

  • apiVersion: extensions/v1beta1 → W powyższym kodzie wersja API to zaawansowana wersja beta Kubernetes, która obsługuje koncepcję zestawu replik.

  • kind: ReplicaSet → Zdefiniowaliśmy rodzaj jako zestaw replik, który pomaga kubectl zrozumieć, że plik jest używany do tworzenia zestawu replik.

  • tier: Backend → Zdefiniowaliśmy warstwę etykiet jako zaplecze, które tworzy pasujący selektor.

  • {key: tier, operation: In, values: [Backend]} → To pomoże matchExpression aby zrozumieć warunek dopasowania, który zdefiniowaliśmy, oraz w operacji używanej przez matchlabel aby znaleźć szczegóły.

Uruchom powyższy plik za pomocą kubectl i utwórz zestaw replik zaplecza z podaną definicją w yaml plik.

Wdrożenia są uaktualnione i nowsza wersja kontrolera replikacji. Zarządzają wdrażaniem zestawów replik, które są również ulepszoną wersją kontrolera replikacji. Mają możliwość aktualizacji zestawu replik, a także przywracania poprzedniej wersji.

Zapewniają wiele zaktualizowanych funkcji matchLabels i selectors. Mamy nowy kontroler w master Kubernetes zwany kontrolerem wdrażania, który to umożliwia. Ma możliwość zmiany rozmieszczenia w połowie.

Zmiana stanowiska

Updating- Użytkownik może zaktualizować trwające wdrożenie przed jego zakończeniem. W tym przypadku istniejące wdrożenie zostanie rozliczone i zostanie utworzone nowe wdrożenie.

Deleting- Użytkownik może wstrzymać / anulować wdrożenie, usuwając je przed jego zakończeniem. Ponowne odtworzenie tego samego wdrożenia spowoduje jego wznowienie.

Rollback- Możemy cofnąć wdrażanie lub wdrażanie w toku. Użytkownik może utworzyć lub zaktualizować wdrożenie przy użyciuDeploymentSpec.PodTemplateSpec = oldRC.PodTemplateSpec.

Strategie wdrażania

Strategie wdrażania pomagają zdefiniować, w jaki sposób nowy RC powinien zastąpić istniejący RC.

Recreate- Ta funkcja zabije wszystkie istniejące RC, a następnie uruchomi nowe. Powoduje to szybkie rozmieszczenie, jednak spowoduje to przestój, gdy stare zasobniki nie działają, a nowe nie pojawiły się.

Rolling Update- Ta funkcja stopniowo obniża stary RC i wyświetla nowy. Powoduje to powolne wdrażanie, jednak nie ma wdrażania. Przez cały czas dostępnych jest kilka starych i kilka nowych.

Plik konfiguracyjny Deployment wygląda następująco.

apiVersion: extensions/v1beta1 --------------------->1
kind: Deployment --------------------------> 2
metadata:
   name: Tomcat-ReplicaSet
spec:
   replicas: 3
   template:
      metadata:
         lables:
            app: Tomcat-ReplicaSet
            tier: Backend
   spec:
      containers:
         - name: Tomcatimage:
            tomcat: 8.0
            ports:
               - containerPort: 7474

W powyższym kodzie jedyną rzeczą, która różni się od zestawu replik, jest to, że zdefiniowaliśmy ten rodzaj jako wdrożenie.

Utwórz stanowisko

$ kubectl create –f Deployment.yaml -–record
deployment "Deployment" created Successfully.

Pobierz wdrożenie

$ kubectl get deployments
NAME           DESIRED     CURRENT     UP-TO-DATE     AVILABLE    AGE
Deployment        3           3           3              3        20s

Sprawdź stan wdrożenia

$ kubectl rollout status deployment/Deployment

Aktualizowanie wdrożenia

$ kubectl set image deployment/Deployment tomcat=tomcat:6.0

Cofam się do poprzedniego wdrożenia

$ kubectl rollout undo deployment/Deployment –to-revision=2

W Kubernetes wolumin można traktować jako katalog, który jest dostępny dla kontenerów w pod. W Kubernetes mamy różne typy wolumenów, a typ określa sposób tworzenia wolumenu i jego zawartość.

Koncepcja głośności była obecna w Dockerze, jednak jedynym problemem było to, że głośność była bardzo ograniczona do określonej kapsuły. Gdy tylko życie kapsuły dobiegło końca, objętość również została utracona.

Z drugiej strony woluminy tworzone za pośrednictwem Kubernetes nie są ograniczone do żadnego kontenera. Obsługuje dowolny lub wszystkie kontenery wdrożone wewnątrz platformy Kubernetes. Kluczową zaletą wolumenu Kubernetes jest to, że obsługuje on różne rodzaje pamięci, w których kapsuła może korzystać z wielu z nich w tym samym czasie.

Typy woluminów Kubernetes

Oto lista niektórych popularnych tomów Kubernetes -

  • emptyDir- Jest to rodzaj wolumenu, który jest tworzony, gdy pod jest po raz pierwszy przypisany do węzła. Pozostaje aktywny tak długo, jak długo Pod działa w tym węźle. Wolumin jest początkowo pusty, a kontenery w kapsule mogą odczytywać i zapisywać pliki w woluminie emptyDir. Po usunięciu Poda z węzła dane w emptyDir zostaną usunięte.

  • hostPath - Ten typ woluminu montuje plik lub katalog z systemu plików węzła hosta do twojego poda.

  • gcePersistentDisk- Ten typ wolumenu montuje dysk stały Google Compute Engine (GCE) w Twoim Pod. Dane wgcePersistentDisk pozostaje nienaruszony, gdy Pod zostanie usunięty z węzła.

  • awsElasticBlockStore- Ten typ wolumenu montuje Amazon Web Services (AWS) Elastic Block Store w Twoim Pod. Tak jakgcePersistentDisk, dane w pliku awsElasticBlockStore pozostaje nienaruszony, gdy Pod zostanie usunięty z węzła.

  • nfs - An nfsvolume pozwala na zamontowanie istniejącego NFS (Network File System) w twoim pod. Dane w plikunfswolumin nie jest kasowany po usunięciu Poda z węzła. Wolumen jest tylko odmontowany.

  • iscsi - An iscsi wolumin pozwala na zamontowanie istniejącego wolumenu iSCSI (SCSI przez IP) w kapsule.

  • flocker- Jest to klastrowy menedżer ilości danych kontenera typu open source. Służy do zarządzania wolumenami danych. ZAflockervolume pozwala na zamontowanie zbioru danych Flocker w pod. Jeśli zbiór danych nie istnieje we Flockerze, najpierw musisz go utworzyć za pomocą interfejsu API Flockera.

  • glusterfs- Glusterfs to sieciowy system plików typu open source. Głośność glusterfs umożliwia zamontowanie woluminu glusterfs w kapsuły.

  • rbd- RBD oznacza Rados Block Device. Narbdvolume pozwala na zamontowanie woluminu Rados Block Device w twoim kapsuły. Dane pozostają zachowane po usunięciu Poda z węzła.

  • cephfs - A cephfsvolume pozwala na zamontowanie istniejącego woluminu CephFS w twoim pod. Dane pozostają nienaruszone po usunięciu Poda z węzła.

  • gitRepo - A gitRepo wolumin montuje pusty katalog i klonuje plik git repozytorium do niego, aby twój kapsuła mogła użyć.

  • secret - A secret volume służy do przekazywania poufnych informacji, takich jak hasła, do podów.

  • persistentVolumeClaim - A persistentVolumeClaimvolume służy do zamontowania PersistentVolume w pod. PersistentVolumes to sposób, w jaki użytkownicy mogą „ubiegać się” o trwałą pamięć masową (taką jak GCE PersistentDisk lub wolumin iSCSI) bez znajomości szczegółów konkretnego środowiska chmurowego.

  • downwardAPI - A downwardAPIwolumen jest używany do udostępniania aplikacji w dół danych API. Montuje katalog i zapisuje żądane dane w zwykłych plikach tekstowych.

  • azureDiskVolume - An AzureDiskVolume służy do montowania dysku danych Microsoft Azure w pod.

Trwały wolumen i trwałe oświadczenie dotyczące wolumenu

Persistent Volume (PV)- To część sieciowej pamięci masowej, która została udostępniona przez administratora. Jest to zasób w klastrze, który jest niezależny od dowolnego zasobnika korzystającego z PV.

Persistent Volume Claim (PVC)- Magazyn żądany przez Kubernetes dla jego podów jest znany jako PVC. Użytkownik nie musi znać podstawowej obsługi administracyjnej. Oświadczenia muszą zostać utworzone w tej samej przestrzeni nazw, w której jest tworzony pod.

Tworzenie trwałego woluminu

kind: PersistentVolume ---------> 1
apiVersion: v1
metadata:
   name: pv0001 ------------------> 2
   labels:
      type: local
spec:
   capacity: -----------------------> 3
      storage: 10Gi ----------------------> 4
   accessModes:
      - ReadWriteOnce -------------------> 5
      hostPath:
         path: "/tmp/data01" --------------------------> 6

W powyższym kodzie zdefiniowaliśmy -

  • kind: PersistentVolume → Zdefiniowaliśmy rodzaj jako PersistentVolume, który informuje kubernetes, że używany plik yaml służy do tworzenia trwałego woluminu.

  • name: pv0001 → Nazwa PersistentVolume, którą tworzymy.

  • capacity: → Ta specyfikacja określi pojemność PV, którą próbujemy stworzyć.

  • storage: 10Gi → To mówi podstawowej infrastrukturze, że próbujemy zająć miejsce 10Gi na zdefiniowanej ścieżce.

  • ReadWriteOnce → Informuje o prawach dostępu do wolumenu, który tworzymy.

  • path: "/tmp/data01" → Ta definicja mówi maszynie, że próbujemy utworzyć wolumen pod tą ścieżką w podstawowej infrastrukturze.

Tworzenie PV

$ kubectl create –f local-01.yaml
persistentvolume "pv0001" created

Sprawdzanie PV

$ kubectl get pv
NAME        CAPACITY      ACCESSMODES       STATUS       CLAIM      REASON     AGE
pv0001        10Gi            RWO         Available                            14s

Opisywanie PV

$ kubectl describe pv pv0001

Tworzenie trwałego oświadczenia woluminu

kind: PersistentVolumeClaim --------------> 1
apiVersion: v1
metadata:
   name: myclaim-1 --------------------> 2
spec:
   accessModes:
      - ReadWriteOnce ------------------------> 3
   resources:
      requests:
         storage: 3Gi ---------------------> 4

W powyższym kodzie zdefiniowaliśmy -

  • kind: PersistentVolumeClaim → Instruuje bazową infrastrukturę, że próbujemy zająć określoną ilość miejsca.

  • name: myclaim-1 → Nazwa roszczenia, które próbujemy utworzyć.

  • ReadWriteOnce → To określa tryb roszczenia, które próbujemy utworzyć.

  • storage: 3Gi → To powie kubernetes o ilości miejsca, które staramy się zająć.

Tworzenie PVC

$ kubectl create –f myclaim-1
persistentvolumeclaim "myclaim-1" created

Pobieranie szczegółowych informacji na temat PVC

$ kubectl get pvc
NAME        STATUS   VOLUME   CAPACITY   ACCESSMODES   AGE
myclaim-1   Bound    pv0001     10Gi         RWO       7s

Opisz PCV

$ kubectl describe pv pv0001

Używanie PV i PVC z POD

kind: Pod
apiVersion: v1
metadata:
   name: mypod
   labels:
      name: frontendhttp
spec:
   containers:
   - name: myfrontend
      image: nginx
      ports:
      - containerPort: 80
         name: "http-server"
      volumeMounts: ----------------------------> 1
      - mountPath: "/usr/share/tomcat/html"
         name: mypd
   volumes: -----------------------> 2
      - name: mypd
         persistentVolumeClaim: ------------------------->3
         claimName: myclaim-1

W powyższym kodzie zdefiniowaliśmy -

  • volumeMounts: → To jest ścieżka w kontenerze, na której nastąpi montaż.

  • Volume: → Ta definicja definiuje definicję objętości, o którą będziemy się ubiegać.

  • persistentVolumeClaim: → Pod tym określamy nazwę wolumenu, którego będziemy używać w zdefiniowanej kapsule.

Sekrety można zdefiniować jako obiekty Kubernetes używane do przechowywania poufnych danych, takich jak nazwa użytkownika i hasła z szyfrowaniem.

Istnieje wiele sposobów tworzenia sekretów w Kubernetes.

  • Tworzenie z plików txt.
  • Tworzenie z pliku yaml.

Tworzenie z pliku tekstowego

Aby utworzyć sekrety z pliku tekstowego, takie jak nazwa użytkownika i hasło, najpierw musimy zapisać je w pliku txt i użyć następującego polecenia.

$ kubectl create secret generic tomcat-passwd –-from-file = ./username.txt –fromfile = ./.
password.txt

Tworzenie z pliku Yaml

apiVersion: v1
kind: Secret
metadata:
name: tomcat-pass
type: Opaque
data:
   password: <User Password>
   username: <User Name>

Tworzenie sekretu

$ kubectl create –f Secret.yaml
secrets/tomcat-pass

Korzystanie z Secrets

Po utworzeniu sekretów można je wykorzystać w kapsule lub kontrolerze replikacji jako -

  • Zmienna środowiskowa
  • Volume

Zmienna środowiskowa

Aby użyć sekretu jako zmiennej środowiskowej, użyjemy env w sekcji specyfikacji pliku pod yaml.

env:
- name: SECRET_USERNAME
   valueFrom:
      secretKeyRef:
         name: mysecret
         key: tomcat-pass

Jak Tom

spec:
   volumes:
      - name: "secretstest"
         secret:
            secretName: tomcat-pass
   containers:
      - image: tomcat:7.0
         name: awebserver
         volumeMounts:
            - mountPath: "/tmp/mysec"
            name: "secretstest"

Tajna konfiguracja jako zmienna środowiskowa

apiVersion: v1
kind: ReplicationController
metadata:
   name: appname
spec:
replicas: replica_count
template:
   metadata:
      name: appname
   spec:
      nodeSelector:
         resource-group:
      containers:
         - name: appname
            image:
            imagePullPolicy: Always
            ports:
            - containerPort: 3000
            env: -----------------------------> 1
               - name: ENV
                  valueFrom:
                     configMapKeyRef:
                        name: appname
                        key: tomcat-secrets

W powyższym kodzie, pod env definicji używamy sekretów jako zmiennej środowiskowej w kontrolerze replikacji.

Sekrety jako mocowanie wolumenu

apiVersion: v1
kind: pod
metadata:
   name: appname
spec:
   metadata:
      name: appname
   spec:
   volumes:
      - name: "secretstest"
         secret:
            secretName: tomcat-pass
   containers:
      - image: tomcat: 8.0
         name: awebserver
         volumeMounts:
            - mountPath: "/tmp/mysec"
            name: "secretstest"

Zasady sieciowe definiują sposób, w jaki zasobniki w tej samej przestrzeni nazw będą komunikować się ze sobą i z punktem końcowym sieci. To wymagaextensions/v1beta1/networkpoliciesdo włączenia w konfiguracji środowiska wykonawczego na serwerze API. Jego zasoby używają etykiet do wybierania zasobników i definiowania reguł zezwalających na ruch do określonego zasobnika, oprócz tego, który jest zdefiniowany w przestrzeni nazw.

Najpierw musimy skonfigurować zasady izolacji przestrzeni nazw. Zasadniczo tego rodzaju zasady sieciowe są wymagane w modułach równoważenia obciążenia.

kind: Namespace
apiVersion: v1
metadata:
   annotations:
      net.beta.kubernetes.io/network-policy: |
      {
         "ingress": 
         {
            "isolation": "DefaultDeny"
         }
      }
$ kubectl annotate ns <namespace> "net.beta.kubernetes.io/network-policy = 
{\"ingress\": {\"isolation\": \"DefaultDeny\"}}"

Po utworzeniu przestrzeni nazw musimy utworzyć zasady sieciowe.

Polityka sieciowa Yaml

kind: NetworkPolicy
apiVersion: extensions/v1beta1
metadata:
   name: allow-frontend
   namespace: myns
spec:
   podSelector:
      matchLabels:
         role: backend
   ingress:
   - from:
      - podSelector:
         matchLabels:
            role: frontend
   ports:
      - protocol: TCP
         port: 6379

Kubernetes API służy jako podstawa dla deklaratywnego schematu konfiguracji systemu. KubectlNarzędzie wiersza poleceń może służyć do tworzenia, aktualizowania, usuwania i pobierania obiektu API. Kubernetes API działa jako komunikator między różnymi komponentami Kubernetes.

Dodawanie API do Kubernetes

Dodanie nowego API do Kubernetes doda nowe funkcje do Kubernetes, co zwiększy funkcjonalność Kubernetes. Jednak oprócz tego zwiększy również koszt i łatwość konserwacji systemu. Aby uzyskać równowagę między kosztem a złożonością, zdefiniowano kilka zestawów.

Dodawane API powinno być przydatne dla ponad 50% użytkowników. Nie ma innego sposobu na zaimplementowanie tej funkcjonalności w Kubernetes. Wyjątkowe okoliczności są omawiane na spotkaniu społeczności Kubernetes, a następnie dodawane jest API.

Zmiany API

Aby zwiększyć możliwości Kubernetes, system na bieżąco wprowadza zmiany. Robi to zespół Kubernetes, aby dodać funkcjonalność do Kubernetes bez usuwania lub wpływu na istniejącą funkcjonalność systemu.

Aby zademonstrować ogólny proces, oto (hipotetyczny) przykład -

  • Użytkownik POST wysyła obiekt Poda do /api/v7beta1/...

  • JSON nie jest przekształcany w plik v7beta1.Pod Struktura

  • Wartości domyślne są stosowane do v7beta1.Pod

  • Plik v7beta1.Pod jest konwertowany na api.Pod Struktura

  • Plik api.Pod jest sprawdzany, a wszelkie błędy są zwracane do użytkownika

  • Plik api.Pod jest konwertowany na v6.Pod (ponieważ v6 jest najnowszą stabilną wersją)

  • Plik v6.Pod jest kierowany do JSON i zapisywany do etcd

Teraz, gdy mamy już przechowywany obiekt Pod, użytkownik może pobrać ten obiekt w dowolnej obsługiwanej wersji interfejsu API. Na przykład -

  • Użytkownik pobiera kapsułę /api/v5/...

  • JSON jest odczytywany z etcd i unmarshalled do v6.Pod Struktura

  • Wartości domyślne są stosowane do v6.Pod

  • Plik v6.Pod jest konwertowany na strukturę api.Pod

  • Plik api.Pod jest konwertowany na v5.Pod Struktura

  • Plik v5.Pod jest kierowany do formatu JSON i wysyłany do użytkownika

Konsekwencją tego procesu jest to, że zmiany API muszą być dokonywane ostrożnie i wstecz.

Wersjonowanie API

Aby ułatwić obsługę wielu struktur, Kubernetes obsługuje wiele wersji API, z których każda znajduje się w innej ścieżce API, takiej jak /api/v1 lub /apsi/extensions/v1beta1

Standardy wersjonowania w Kubernetes są zdefiniowane w wielu standardach.

Poziom alfa

  • Ta wersja zawiera alfa (np. V1alpha1)

  • Ta wersja może zawierać błędy; włączona wersja może zawierać błędy

  • Wsparcie dla błędów można zrezygnować w dowolnym momencie.

  • Zalecane do użytku tylko w krótkoterminowych testach, ponieważ wsparcie może nie być obecne przez cały czas.

Poziom Beta

  • Nazwa wersji zawiera wersję beta (np. V2beta3)

  • Kod jest w pełni przetestowany, a włączona wersja ma być stabilna.

  • Wsparcie tej funkcji nie zostanie porzucone; mogą wystąpić drobne zmiany.

  • Zalecane tylko do zastosowań, które nie mają krytycznego znaczenia biznesowego ze względu na możliwość niekompatybilnych zmian w kolejnych wersjach.

Stabilny poziom

  • Nazwa wersji to vX gdzie X jest liczbą całkowitą.

  • Stabilne wersje funkcji pojawią się w wydanym oprogramowaniu dla wielu kolejnych wersji.

Kubectl to narzędzie wiersza poleceń do interakcji z Kubernetes API. Jest to interfejs używany do komunikacji i zarządzania podami w klastrze Kubernetes.

Aby współdziałać z klastrem Kubernetes, należy ustawić kubectl na lokalny.

Ustawianie Kubectl

Pobierz plik wykonywalny na lokalną stację roboczą za pomocą polecenia curl.

W systemie Linux

$ curl -O https://storage.googleapis.com/kubernetesrelease/
release/v1.5.2/bin/linux/amd64/kubectl

Na stacji roboczej OS X.

$ curl -O https://storage.googleapis.com/kubernetesrelease/
release/v1.5.2/bin/darwin/amd64/kubectl

Po zakończeniu pobierania przenieś pliki binarne w ścieżce systemu.

$ chmod +x kubectl
$ mv kubectl /usr/local/bin/kubectl

Konfiguracja Kubectl

Poniżej przedstawiono kroki, aby wykonać operację konfiguracji.

$ kubectl config set-cluster default-cluster --server = https://${MASTER_HOST} -- certificate-authority = ${CA_CERT}

$ kubectl config set-credentials default-admin --certificateauthority = ${
CA_CERT} --client-key = ${ADMIN_KEY} --clientcertificate = ${
ADMIN_CERT}

$ kubectl config set-context default-system --cluster = default-cluster -- user = default-admin $ kubectl config use-context default-system
  • Zastąpić ${MASTER_HOST} z adresem węzła głównego lub nazwą używaną w poprzednich krokach.

  • Zastąpić ${CA_CERT} z absolutną ścieżką do ca.pem utworzone w poprzednich krokach.

  • Zastąpić ${ADMIN_KEY} z absolutną ścieżką do admin-key.pem utworzone w poprzednich krokach.

  • Zastąpić ${ADMIN_CERT} z absolutną ścieżką do admin.pem utworzone w poprzednich krokach.

Weryfikacja konfiguracji

Aby sprawdzić, czy kubectl działa dobrze, czy nie, sprawdź, czy klient Kubernetes jest poprawnie skonfigurowany.

$ kubectl get nodes

NAME       LABELS                                     STATUS
Vipin.com  Kubernetes.io/hostname = vipin.mishra.com    Ready

Kubectlkontroluje klaster Kubernetes. Jest to jeden z kluczowych komponentów Kubernetes, który działa na stacji roboczej na dowolnej maszynie po zakończeniu konfiguracji. Ma możliwość zarządzania węzłami w klastrze.

Kubectlpolecenia są używane do interakcji i zarządzania obiektami Kubernetes i klastrem. W tym rozdziale omówimy kilka poleceń używanych w Kubernetes za pośrednictwem kubectl.

kubectl annotate - Aktualizuje adnotację w zasobie.

$kubectl annotate [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ...
KEY_N = VAL_N [--resource-version = version]

Na przykład,

kubectl annotate pods tomcat description = 'my frontend'

kubectl api-versions - Wyświetla obsługiwane wersje interfejsu API w klastrze.

$ kubectl api-version;

kubectl apply - Ma możliwość konfigurowania zasobu według pliku lub standardowego wejścia.

$ kubectl apply –f <filename>

kubectl attach - To przywiązuje rzeczy do działającego kontenera.

$ kubectl attach <pod> –c <container> $ kubectl attach 123456-7890 -c tomcat-conatiner

kubectl autoscale - Służy do automatycznego skalowania zasobników, które są zdefiniowane, takie jak wdrożenie, zestaw replik, kontroler replikacji.

$ kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min = MINPODS] -- max = MAXPODS [--cpu-percent = CPU] [flags] $ kubectl autoscale deployment foo --min = 2 --max = 10

kubectl cluster-info - Wyświetla informacje o klastrze.

$ kubectl cluster-info

kubectl cluster-info dump - Zrzuca istotne informacje dotyczące klastra w celu debugowania i diagnostyki.

$ kubectl cluster-info dump
$ kubectl cluster-info dump --output-directory = /path/to/cluster-state

kubectl config - Modyfikuje plik kubeconfig.

$ kubectl config <SUBCOMMAD>
$ kubectl config –-kubeconfig <String of File name>

kubectl config current-context - Wyświetla aktualny kontekst.

$ kubectl config current-context
#deploys the current context

kubectl config delete-cluster - usuwa określony klaster z kubeconfig.

$ kubectl config delete-cluster <Cluster Name>

kubectl config delete-context - usuwa określony kontekst z kubeconfig.

$ kubectl config delete-context <Context Name>

kubectl config get-clusters - Wyświetla klaster zdefiniowany w pliku kubeconfig.

$ kubectl config get-cluster $ kubectl config get-cluster <Cluser Name>

kubectl config get-contexts - Opisuje jeden lub wiele kontekstów.

$ kubectl config get-context <Context Name>

kubectl config set-cluster - Ustawia wpis klastra w Kubernetes.

$ kubectl config set-cluster NAME [--server = server] [--certificateauthority =
path/to/certificate/authority] [--insecure-skip-tls-verify = true]

kubectl config set-context - Ustawia wpis kontekstu w punkcie wejścia kubernetes.

$ kubectl config set-context NAME [--cluster = cluster_nickname] [-- user = user_nickname] [--namespace = namespace] $ kubectl config set-context prod –user = vipin-mishra

kubectl config set-credentials - Ustawia wpis użytkownika w kubeconfig.

$ kubectl config set-credentials cluster-admin --username = vipin --
password = uXFGweU9l35qcif

kubectl config set - Ustawia indywidualną wartość w pliku kubeconfig.

$ kubectl config set PROPERTY_NAME PROPERTY_VALUE

kubectl config unset - Cofa określony komponent w kubectl.

$ kubectl config unset PROPERTY_NAME PROPERTY_VALUE

kubectl config use-context - Ustawia bieżący kontekst w pliku kubectl.

$ kubectl config use-context <Context Name>

kubectl config view

$ kubectl config view $ kubectl config view –o jsonpath='{.users[?(@.name == "e2e")].user.password}'

kubectl cp - Kopiuj pliki i katalogi do iz kontenerów.

$ kubectl cp <Files from source> <Files to Destinatiion> $ kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container>

kubectl create- Aby utworzyć zasób według nazwy pliku lub stdin. Aby to zrobić, akceptowane są formaty JSON lub YAML.

$ kubectl create –f <File Name> $ cat <file name> | kubectl create –f -

W ten sam sposób możemy utworzyć wiele rzeczy wymienionych przy użyciu rozszerzenia create polecenie wraz z kubectl.

  • deployment
  • namespace
  • quota
  • tajny rejestr docker
  • secret
  • tajny rodzajowy
  • tajne tls
  • serviceaccount
  • service clusterip
  • usługa loadbalancer
  • usługa nodeport

kubectl delete - Usuwa zasoby według nazwy pliku, standardowego wejścia, zasobu i nazw.

$ kubectl delete –f ([-f FILENAME] | TYPE [(NAME | -l label | --all)])

kubectl describe- Opisuje dowolny zasób w Kubernetes. Wyświetla szczegóły zasobu lub grupy zasobów.

$ kubectl describe <type> <type name>
$ kubectl describe pod tomcat

kubectl drain- Służy do opróżniania węzła w celach konserwacyjnych. Przygotowuje węzeł do konserwacji. Spowoduje to oznaczenie węzła jako niedostępnego, aby nie był przypisywany nowy kontener, który zostanie utworzony.

$ kubectl drain tomcat –force

kubectl edit- Służy do zakończenia zasobów na serwerze. Pozwala to na bezpośrednią edycję zasobu, który można otrzymać za pomocą narzędzia wiersza poleceń.

$ kubectl edit <Resource/Name | File Name) Ex. $ kubectl edit rc/tomcat

kubectl exec - Pomaga to wykonać polecenie w kontenerze.

$ kubectl exec POD <-c CONTAINER > -- COMMAND < args...> $ kubectl exec tomcat 123-5-456 date

kubectl expose- Służy do ujawniania obiektów Kubernetes, takich jak pod, kontroler replikacji i usługa, jako nowej usługi Kubernetes. Ma to możliwość ujawnienia go za pośrednictwem działającego kontenera lub z plikuyaml plik.

$ kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol = TCP|UDP] [--target-port = number-or-name] [--name = name] [--external-ip = external-ip-ofservice] [--type = type] $ kubectl expose rc tomcat –-port=80 –target-port = 30000
$ kubectl expose –f tomcat.yaml –port = 80 –target-port =

kubectl get - To polecenie może pobierać dane z klastra dotyczące zasobów Kubernetes.

$ kubectl get [(-o|--output=)json|yaml|wide|custom-columns=...|custom-columnsfile=...|
go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...]
(TYPE [NAME | -l label] | TYPE/NAME ...) [flags]

Na przykład,

$ kubectl get pod <pod name> $ kubectl get service <Service name>

kubectl logs- Służą do umieszczania kłód kontenera w kapsule. Drukowanie dzienników może oznaczać zdefiniowanie nazwy kontenera w kapsule. Jeśli POD ma tylko jeden pojemnik, nie ma potrzeby definiowania jego nazwy.

$ kubectl logs [-f] [-p] POD [-c CONTAINER] Example $ kubectl logs tomcat.
$ kubectl logs –p –c tomcat.8

kubectl port-forward - Są używane do przekazywania jednego lub więcej portów lokalnych do strąków.

$ kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT
[...[LOCAL_PORT_N:]REMOTE_PORT_N]
$ kubectl port-forward tomcat 3000 4000 $ kubectl port-forward tomcat 3000:5000

kubectl replace - Możliwość zastępowania zasobu według nazwy pliku lub stdin.

$ kubectl replace -f FILENAME $ kubectl replace –f tomcat.yml
$ cat tomcat.yml | kubectl replace –f -

kubectl rolling-update- Wykonuje aktualizację kroczącą na kontrolerze replikacji. Zastępuje określony kontroler replikacji nowym kontrolerem replikacji, aktualizując jednocześnie POD.

$ kubectl rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] --
image = NEW_CONTAINER_IMAGE | -f NEW_CONTROLLER_SPEC)
$ kubectl rolling-update frontend-v1 –f freontend-v2.yaml

kubectl rollout - Jest w stanie zarządzać wdrażaniem wdrożenia.

$ Kubectl rollout <Sub Command>
$ kubectl rollout undo deployment/tomcat

Oprócz powyższego możemy wykonać wiele zadań za pomocą rolloutu, takich jak -

  • historia wdrażania
  • wstrzymanie wdrażania
  • wznowienie wdrażania
  • stan wdrożenia
  • wdrożenie cofnij

kubectl run - Polecenie Uruchom ma możliwość uruchomienia obrazu w klastrze Kubernetes.

$ kubectl run NAME --image = image [--env = "key = value"] [--port = port] [--
replicas = replicas] [--dry-run = bool] [--overrides = inline-json] [--command] --
[COMMAND] [args...]
$ kubectl run tomcat --image = tomcat:7.0 $ kubectl run tomcat –-image = tomcat:7.0 –port = 5000

kubectl scale - Skaluje rozmiar wdrożeń Kubernetes, zestawu replik, kontrolera replikacji lub zadania.

$ kubectl scale [--resource-version = version] [--current-replicas = count] -- replicas = COUNT (-f FILENAME | TYPE NAME ) $ kubectl scale –-replica = 3 rs/tomcat
$ kubectl scale –replica = 3 tomcat.yaml

kubectl set image - Aktualizuje obraz szablonu pod.

$ kubectl set image (-f FILENAME | TYPE NAME)
CONTAINER_NAME_1 = CONTAINER_IMAGE_1 ... CONTAINER_NAME_N = CONTAINER_IMAGE_N
$ kubectl set image deployment/tomcat busybox = busybox ngnix = ngnix:1.9.1 $ kubectl set image deployments, rc tomcat = tomcat6.0 --all

kubectl set resources- Służy do ustawiania zawartości zasobu. Aktualizuje zasoby / limity obiektu za pomocą szablonu pod.

$ kubectl set resources (-f FILENAME | TYPE NAME) ([--limits = LIMITS & -- requests = REQUESTS] $ kubectl set resources deployment tomcat -c = tomcat --
limits = cpu = 200m,memory = 512Mi

kubectl top node- Wyświetla użycie procesora / pamięci / pamięci. Górne polecenie pozwala zobaczyć zużycie zasobów dla węzłów.

$ kubectl top node [node Name]

Tego samego polecenia można również użyć w przypadku kapsuły.

Aby stworzyć aplikację do wdrożenia Kubernetes, musimy najpierw stworzyć aplikację na Dockerze. Można to zrobić na dwa sposoby -

  • Pobierając
  • Z pliku Docker

Pobierając

Istniejący obraz można pobrać z centrum Docker i przechowywać w lokalnym rejestrze platformy Docker.

Aby to zrobić, uruchom Docker pull Komenda.

$ docker pull --help
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Pull an image or a repository from the registry
   -a, --all-tags = false     Download all tagged images in the repository
   --help = false             Print usage

Poniżej zostanie wyświetlony wynik powyższego kodu.

Powyższy zrzut ekranu przedstawia zestaw obrazów, które są przechowywane w naszym lokalnym rejestrze Docker.

Jeśli z obrazu chcemy zbudować kontener składający się z aplikacji do przetestowania, możemy to zrobić za pomocą polecenia Docker run.

$ docker run –i –t unbunt /bin/bash

Z pliku Docker

Aby stworzyć aplikację z pliku Docker, musimy najpierw stworzyć plik Docker.

Poniżej znajduje się przykład pliku Jenkins Docker.

FROM ubuntu:14.04
MAINTAINER [email protected]
ENV REFRESHED_AT 2017-01-15
RUN apt-get update -qq && apt-get install -qqy curl
RUN curl https://get.docker.io/gpg | apt-key add -
RUN echo deb http://get.docker.io/ubuntu docker main > /etc/apt/↩
sources.list.d/docker.list
RUN apt-get update -qq && apt-get install -qqy iptables ca-↩
certificates lxc openjdk-6-jdk git-core lxc-docker
ENV JENKINS_HOME /opt/jenkins/data
ENV JENKINS_MIRROR http://mirrors.jenkins-ci.org
RUN mkdir -p $JENKINS_HOME/plugins
RUN curl -sf -o /opt/jenkins/jenkins.war -L $JENKINS_MIRROR/war-↩ stable/latest/jenkins.war RUN for plugin in chucknorris greenballs scm-api git-client git ↩ ws-cleanup ;\ do curl -sf -o $JENKINS_HOME/plugins/${plugin}.hpi \ -L $JENKINS_MIRROR/plugins/${plugin}/latest/${plugin}.hpi ↩
; done
ADD ./dockerjenkins.sh /usr/local/bin/dockerjenkins.sh
RUN chmod +x /usr/local/bin/dockerjenkins.sh
VOLUME /var/lib/docker
EXPOSE 8080
ENTRYPOINT [ "/usr/local/bin/dockerjenkins.sh" ]

Po utworzeniu powyższego pliku zapisz go pod nazwą Dockerfile i cd do ścieżki pliku. Następnie uruchom następujące polecenie.

$ sudo docker build -t jamtur01/Jenkins .

Po utworzeniu obrazu możemy sprawdzić, czy obraz działa dobrze i czy można go przekonwertować na kontener.

$ docker run –i –t jamtur01/Jenkins /bin/bash

Wdrożenie to metoda konwertowania obrazów na kontenery, a następnie przydzielania tych obrazów do podów w klastrze Kubernetes. Pomaga to również w skonfigurowaniu klastra aplikacji, który obejmuje wdrożenie usługi, pod, kontrolera replikacji i zestawu replik. Klaster można skonfigurować w taki sposób, aby aplikacje wdrożone na kapsuły mogły się ze sobą komunikować.

W tej konfiguracji możemy mieć ustawienie modułu równoważenia obciążenia na górze jednej aplikacji kierującej ruch do zestawu podów, a później komunikują się z podami zaplecza. Komunikacja między podami odbywa się za pośrednictwem obiektu usługi zbudowanego w Kubernetes.

Ngnix Load Balancer Yaml File

apiVersion: v1
kind: Service
metadata:
   name: oppv-dev-nginx
      labels:
         k8s-app: omni-ppv-api
spec:
   type: NodePort
   ports:
   - port: 8080
      nodePort: 31999
      name: omninginx
   selector:
      k8s-app: appname
      component: nginx
      env: dev

Kontroler replikacji Ngnix Yaml

apiVersion: v1
kind: ReplicationController
metadata:
   name: appname
spec:
   replicas: replica_count
   template:
      metadata:
         name: appname
         labels:
            k8s-app: appname
            component: nginx
               env: env_name
spec:
   nodeSelector:
      resource-group: oppv
   containers:
      - name: appname
      image: IMAGE_TEMPLATE
      imagePullPolicy: Always
      ports:
         - containerPort: 8080
         resources:
            requests:
               memory: "request_mem"
               cpu: "request_cpu"
            limits:
               memory: "limit_mem"
               cpu: "limit_cpu"
            env:
            - name: BACKEND_HOST
               value: oppv-env_name-node:3000

Frontend Service Yaml File

apiVersion: v1
kind: Service
metadata:
   name: appname
   labels:
      k8s-app: appname
spec:
   type: NodePort
   ports:
   - name: http
      port: 3000
      protocol: TCP
      targetPort: 3000
   selector:
      k8s-app: appname
      component: nodejs
      env: dev

Kontroler replikacji frontendu Yaml File

apiVersion: v1
kind: ReplicationController
metadata:
   name: Frontend
spec:
   replicas: 3
   template:
      metadata:
         name: frontend
         labels:
            k8s-app: Frontend
            component: nodejs
            env: Dev
spec:
   nodeSelector:
      resource-group: oppv
   containers:
      - name: appname
         image: IMAGE_TEMPLATE
         imagePullPolicy: Always
         ports:
            - containerPort: 3000
            resources:
               requests:
                  memory: "request_mem"
                  cpu: "limit_cpu"
                  limits:
                  memory: "limit_mem"
                  cpu: "limit_cpu"
            env:
               - name: ENV
               valueFrom:
               configMapKeyRef:
               name: appname
               key: config-env

Plik Yaml usługi zaplecza

apiVersion: v1
kind: Service
metadata:
   name: backend
   labels:
      k8s-app: backend
spec:
   type: NodePort
   ports:
   - name: http
      port: 9010
      protocol: TCP
      targetPort: 9000
   selector:
      k8s-app: appname
      component: play
      env: dev

Wspierany kontroler replikacji Yaml File

apiVersion: v1
kind: ReplicationController
metadata:
   name: backend
spec:
   replicas: 3
   template:
      metadata:
         name: backend
      labels:
         k8s-app: beckend
         component: play
         env: dev
spec:
   nodeSelector:
      resource-group: oppv
      containers:
         - name: appname
            image: IMAGE_TEMPLATE
            imagePullPolicy: Always
            ports:
            - containerPort: 9000
            command: [ "./docker-entrypoint.sh" ]
            resources:
               requests:
                  memory: "request_mem"
                  cpu: "request_cpu"
               limits:
                  memory: "limit_mem"
                  cpu: "limit_cpu"
            volumeMounts:
               - name: config-volume
               mountPath: /app/vipin/play/conf
         volumes:
            - name: config-volume
            configMap:
            name: appname

Autoscalingjest jedną z kluczowych funkcji klastra Kubernetes. Jest to funkcja, w której klaster jest w stanie zwiększać liczbę węzłów, gdy zapotrzebowanie na odpowiedź usługi rośnie i zmniejsza liczbę węzłów, gdy zapotrzebowanie maleje. Ta funkcja automatycznego skalowania jest obecnie obsługiwana w Google Cloud Engine (GCE) i Google Container Engine (GKE) i wkrótce zostanie uruchomiona w AWS.

Aby skonfigurować skalowalną infrastrukturę w GCE, musimy najpierw mieć aktywny projekt GCE z włączonymi funkcjami monitorowania w chmurze Google, rejestrowania w chmurze Google i sterowaniem stosem.

Najpierw skonfigurujemy klaster z kilkoma działającymi w nim węzłami. Po zakończeniu musimy ustawić następującą zmienną środowiskową.

Zmienna środowiskowa

export NUM_NODES = 2
export KUBE_AUTOSCALER_MIN_NODES = 2
export KUBE_AUTOSCALER_MAX_NODES = 5
export KUBE_ENABLE_CLUSTER_AUTOSCALER = true

Po zakończeniu uruchomimy klaster, uruchamiając kube-up.sh. Spowoduje to utworzenie klastra wraz z dodatkiem auto-skalarnym klastra.

./cluster/kube-up.sh

Podczas tworzenia klastra możemy sprawdzić nasz klaster za pomocą następującego polecenia kubectl.

$ kubectl get nodes
NAME                             STATUS                       AGE
kubernetes-master                Ready,SchedulingDisabled     10m
kubernetes-minion-group-de5q     Ready                        10m
kubernetes-minion-group-yhdx     Ready                        8m

Teraz możemy wdrożyć aplikację w klastrze, a następnie włączyć poziomy autoskaler podów. Można to zrobić za pomocą następującego polecenia.

$ kubectl autoscale deployment <Application Name> --cpu-percent = 50 --min = 1 --
max = 10

Powyższe polecenie pokazuje, że będziemy utrzymywać co najmniej jedną i maksymalnie 10 replik POD w miarę wzrostu obciążenia aplikacji.

Stan autoskalera możemy sprawdzić, uruchamiając plik $kubclt get hpaKomenda. Zwiększymy obciążenie strąków za pomocą następującego polecenia.

$ kubectl run -i --tty load-generator --image = busybox /bin/sh
$ while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

Możemy sprawdzić hpa biegiem $ kubectl get hpa Komenda.

$ kubectl get hpa NAME REFERENCE TARGET CURRENT php-apache Deployment/php-apache/scale 50% 310% MINPODS MAXPODS AGE 1 20 2m $ kubectl get deployment php-apache
NAME         DESIRED    CURRENT    UP-TO-DATE    AVAILABLE   AGE
php-apache      7          7           7            3        4m

Możemy sprawdzić liczbę działających podów za pomocą następującego polecenia.

jsz@jsz-desk2:~/k8s-src$ kubectl get pods
php-apache-2046965998-3ewo6 0/1        Pending 0         1m
php-apache-2046965998-8m03k 1/1        Running 0         1m
php-apache-2046965998-ddpgp 1/1        Running 0         5m
php-apache-2046965998-lrik6 1/1        Running 0         1m
php-apache-2046965998-nj465 0/1        Pending 0         1m
php-apache-2046965998-tmwg1 1/1        Running 0         1m
php-apache-2046965998-xkbw1 0/1        Pending 0         1m

I wreszcie możemy uzyskać status węzła.

$ kubectl get nodes
NAME                             STATUS                        AGE
kubernetes-master                Ready,SchedulingDisabled      9m
kubernetes-minion-group-6z5i     Ready                         43s
kubernetes-minion-group-de5q     Ready                         9m
kubernetes-minion-group-yhdx     Ready                         9m

Konfigurowanie pulpitu Kubernetes obejmuje kilka kroków z zestawem narzędzi wymaganych jako warunki wstępne do skonfigurowania.

  • Docker (1.3+)
  • idź (1.5+)
  • nodejs (4.2.2+)
  • npm (1.3+)
  • java (7+)
  • łyk (3.9+)
  • Kubernetes (1.1.2+)

Konfigurowanie pulpitu nawigacyjnego

$ sudo apt-get update && sudo apt-get upgrade Installing Python $ sudo apt-get install python
$ sudo apt-get install python3 Installing GCC $ sudo apt-get install gcc-4.8 g++-4.8

Installing make
$ sudo apt-get install make Installing Java $ sudo apt-get install openjdk-7-jdk

Installing Node.js
$ wget https://nodejs.org/dist/v4.2.2/node-v4.2.2.tar.gz $ tar -xzf node-v4.2.2.tar.gz
$ cd node-v4.2.2 $ ./configure
$ make $ sudo make install

Installing gulp
$ npm install -g gulp $ npm install gulp

Weryfikowanie wersji

Java Version
$ java –version java version "1.7.0_91" OpenJDK Runtime Environment (IcedTea 2.6.3) (7u91-2.6.3-1~deb8u1+rpi1) OpenJDK Zero VM (build 24.91-b01, mixed mode) $ node –v
V4.2.2

$ npn -v 2.14.7 $ gulp -v
[09:51:28] CLI version 3.9.0

$ sudo gcc --version
gcc (Raspbian 4.8.4-1) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc. This is free software; 
see the source for copying conditions. There is NO warranty; not even for 
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Instalowanie GO

$ git clone https://go.googlesource.com/go
$ cd go $ git checkout go1.4.3
$ cd src Building GO $ ./all.bash
$ vi /root/.bashrc In the .bashrc export GOROOT = $HOME/go
   export PATH = $PATH:$GOROOT/bin
   
$ go version
go version go1.4.3 linux/arm

Instalowanie panelu Kubernetes

$ git clone https://github.com/kubernetes/dashboard.git
$ cd dashboard $ npm install -g bower

Uruchomienie Dashboardu

$ git clone https://github.com/kubernetes/dashboard.git $ cd dashboard
$ npm install -g bower $ gulp serve
[11:19:12] Requiring external module babel-core/register
[11:20:50] Using gulpfile ~/dashboard/gulpfile.babel.js
[11:20:50] Starting 'package-backend-source'...
[11:20:50] Starting 'kill-backend'...
[11:20:50] Finished 'kill-backend' after 1.39 ms
[11:20:50] Starting 'scripts'...
[11:20:53] Starting 'styles'...
[11:21:41] Finished 'scripts' after 50 s
[11:21:42] Finished 'package-backend-source' after 52 s
[11:21:42] Starting 'backend'...
[11:21:43] Finished 'styles' after 49 s
[11:21:43] Starting 'index'...
[11:21:44] Finished 'index' after 1.43 s
[11:21:44] Starting 'watch'...
[11:21:45] Finished 'watch' after 1.41 s
[11:23:27] Finished 'backend' after 1.73 min
[11:23:27] Starting 'spawn-backend'...
[11:23:27] Finished 'spawn-backend' after 88 ms
[11:23:27] Starting 'serve'...
2016/02/01 11:23:27 Starting HTTP server on port 9091
2016/02/01 11:23:27 Creating API client for
2016/02/01 11:23:27 Creating Heapster REST client for http://localhost:8082
[11:23:27] Finished 'serve' after 312 ms
[BS] [BrowserSync SPA] Running...
[BS] Access URLs:
--------------------------------------
Local: http://localhost:9090/
External: http://192.168.1.21:9090/
--------------------------------------
UI: http://localhost:3001
UI External: http://192.168.1.21:3001
--------------------------------------
[BS] Serving files from: /root/dashboard/.tmp/serve
[BS] Serving files from: /root/dashboard/src/app/frontend
[BS] Serving files from: /root/dashboard/src/app

Pulpit nawigacyjny Kubernetes

Monitorowanie jest jednym z kluczowych elementów zarządzania dużymi klastrami. Do tego mamy szereg narzędzi.

Monitorowanie za pomocą Prometheusa

Jest to system monitorowania i alarmowania. Został zbudowany w SoundCloud i był open source w 2012 roku. Bardzo dobrze radzi sobie z danymi wielowymiarowymi.

Prometheus ma wiele komponentów do udziału w monitorowaniu -

  • Prometheus - Jest to główny komponent, który przetwarza i przechowuje dane.

  • Prometheus node explore - Pobiera macierze poziomu hosta i udostępnia je Prometeuszowi.

  • Ranch-eye - jest haproxy i ujawnia cAdvisor statystyki do Prometeusza.

  • Grafana - Wizualizacja danych.

  • InfuxDB - Baza danych szeregów czasowych używana specjalnie do przechowywania danych od farmera.

  • Prom-ranch-exporter - Jest to prosta aplikacja node.js, która pomaga w odpytywaniu serwera Rancher o status stosu usług.

Agent Sematext Docker

Jest to nowoczesny agent do zbierania metryk, zdarzeń i dzienników obsługujący platformę Docker. Działa jako mały kontener na każdym hoście platformy Docker i gromadzi dzienniki, metryki i zdarzenia dla wszystkich węzłów klastra i kontenerów. Wykrywa wszystkie kontenery (jeden pod może zawierać wiele kontenerów), w tym kontenery dla podstawowych usług Kubernetes, jeśli podstawowe usługi są wdrażane w kontenerach Docker. Po wdrożeniu wszystkie dzienniki i metryki są natychmiast dostępne po wyjęciu z pudełka.

Wdrażanie agentów w węzłach

Kubernetes udostępnia DeamonSets, które zapewniają, że pody są dodawane do klastra.

Konfigurowanie SemaText Docker Agent

Jest konfigurowany za pomocą zmiennych środowiskowych.

  • Załóż darmowe konto na apps.sematext.com , jeśli jeszcze go nie masz.

  • Utwórz aplikację SPM typu „Docker”, aby uzyskać token aplikacji SPM. Aplikacja SPM będzie przechowywać wskaźniki wydajności i zdarzenia Kubernetes.

  • Utwórz aplikację Logsene, aby uzyskać token aplikacji Logsene. Aplikacja Logsene będzie przechowywać Twoje dzienniki Kubernetes.

  • Edytuj wartości LOGSENE_TOKEN i SPM_TOKEN w definicji zestawu DaemonSet, jak pokazano poniżej.

    • Pobierz najnowszy szablon sematext-agent-daemonset.yml (czysty tekst) (również pokazany poniżej).

    • Przechowuj go gdzieś na dysku.

    • Zastąp symbole zastępcze SPM_TOKEN i LOGSENE_TOKEN swoimi tokenami SPM i Logsene App.

Utwórz obiekt DaemonSet

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
   name: sematext-agent
spec:
   template:
      metadata:
         labels:
            app: sematext-agent
      spec:
         selector: {}
         dnsPolicy: "ClusterFirst"
         restartPolicy: "Always"
         containers:
         - name: sematext-agent
            image: sematext/sematext-agent-docker:latest
            imagePullPolicy: "Always"
            env:
            - name: SPM_TOKEN
               value: "REPLACE THIS WITH YOUR SPM TOKEN"
            - name: LOGSENE_TOKEN
               value: "REPLACE THIS WITH YOUR LOGSENE TOKEN"
            - name: KUBERNETES
               value: "1"
            volumeMounts:
               - mountPath: /var/run/docker.sock
                  name: docker-sock
               - mountPath: /etc/localtime
                  name: localtime
            volumes:
               - name: docker-sock
                  hostPath:
                     path: /var/run/docker.sock
               - name: localtime
                  hostPath:
                     path: /etc/localtime

Uruchamianie platformy Docker agenta Sematext z kubectl

$ kubectl create -f sematext-agent-daemonset.yml
daemonset "sematext-agent-daemonset" created

Dziennik Kubernetes

Dzienniki kontenerów Kubernetes niewiele różnią się od dzienników kontenerów Docker. Jednak użytkownicy Kubernetes muszą przeglądać dzienniki dla wdrożonych podów. Dlatego bardzo przydatne jest posiadanie informacji specyficznych dla Kubernetes dostępnych do przeszukiwania dzienników, takich jak -

  • Przestrzeń nazw Kubernetes
  • Nazwa poda Kubernetes
  • Nazwa kontenera Kubernetes
  • Nazwa obrazu platformy Docker
  • UID Kubernetes

Korzystanie z ELK Stack i LogSpout

Stos ELK zawiera Elasticsearch, Logstash i Kibana. Aby zebrać i przesłać dzienniki na platformę logowania, użyjemy LogSpout (chociaż istnieją inne opcje, takie jak FluentD).

Poniższy kod pokazuje, jak skonfigurować klaster ELK na Kubernetes i utworzyć usługę dla ElasticSearch -

apiVersion: v1
kind: Service
metadata:
   name: elasticsearch
   namespace: elk
   labels:
      component: elasticsearch
spec:
   type: LoadBalancer
   selector:
      component: elasticsearch
   ports:
   - name: http
      port: 9200
      protocol: TCP
   - name: transport
      port: 9300
      protocol: TCP

Tworzenie kontrolera replikacji

apiVersion: v1
kind: ReplicationController
metadata:
   name: es
   namespace: elk
   labels:
      component: elasticsearch
spec:
   replicas: 1
   template:
      metadata:
         labels:
            component: elasticsearch
spec:
serviceAccount: elasticsearch
containers:
   - name: es
      securityContext:
      capabilities:
      add:
      - IPC_LOCK
   image: quay.io/pires/docker-elasticsearch-kubernetes:1.7.1-4
   env:
   - name: KUBERNETES_CA_CERTIFICATE_FILE
   value: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
   - name: NAMESPACE
   valueFrom:
      fieldRef:
         fieldPath: metadata.namespace
   - name: "CLUSTER_NAME"
      value: "myesdb"
   - name: "DISCOVERY_SERVICE"
      value: "elasticsearch"
   - name: NODE_MASTER
      value: "true"
   - name: NODE_DATA
      value: "true"
   - name: HTTP_ENABLE
      value: "true"
ports:
- containerPort: 9200
   name: http
   protocol: TCP
- containerPort: 9300
volumeMounts:
- mountPath: /data
   name: storage
volumes:
   - name: storage
      emptyDir: {}

Kibana URL

For Kibana, we provide the Elasticsearch URL as an environment variable.

- name: KIBANA_ES_URL
value: "http://elasticsearch.elk.svc.cluster.local:9200"
- name: KUBERNETES_TRUST_CERT
value: "true"

Kibana UI will be reachable at container port 5601 and corresponding host/Node Port combination. When you begin, there won’t be any data in Kibana (which is expected as you have not pushed any data).