Jak zainstalować Kubernetes w systemie Ubuntu

Ręczne wdrażanie kontenerów Docker na wielu serwerach może być bardzo czasochłonne i całkowicie pochłaniać czas administratora systemu odpowiedzialnego za to zadanie. We współczesnej branży IT popularność chmur, mikrousług i kontenerów stale rośnie, dlatego opracowano rozwiązania takie jak Kubernetes.

Kubernetes to otwarte oprogramowanie do zarządzania kontenerami i orkiestracji, które pozwala zbudować klaster ułatwiający wdrażanie kontenerów w środowiskach rozproszonych, a także zapewniający wysoką dostępność aplikacji w kontenerach. Celem tego wpisu na blogu jest omówienie sposobu instalacji Kubernetes na systemie Ubuntu w celu uruchamiania aplikacji w kontenerach Docker.

NAKIVO do tworzenia kopii zapasowej VMware vSphere

NAKIVO do tworzenia kopii zapasowej VMware vSphere

Kompleksowa ochrona danych dla maszyn wirtualnych VMware vSphere oraz opcje natychmiastowego odzyskiwania. Bezpieczne lokalizacje kopii zapasowych na miejscu, zdalnie oraz w chmurze. Funkcje ochrony przed oprogramowaniem wymuszającym okup.

Wymagania i konfiguracja systemu do instalacji Kubernetes na Ubuntu

Klaster Kubernetes składa się z węzłów głównych i węzłów roboczych. Konfiguracja sprzętowa zależy od potrzeb użytkownika oraz aplikacji, które planuje on uruchamiać w kontenerach Docker. Minimalne wymagania sprzętowe do instalacji Kubernetes na Ubuntu to:

  • Co najmniej 2-rdzeniowy Procesor x86/x64 (Central Processor Unit)
  • 2 GB pamięci RAM (Random Access Memory) lub więcej
  • Dostęp do Internetu

Porty, które muszą być otwarte w celu instalacji Kubernetes na Ubuntu:

Protokół & zakres portów Źródło Cel Kierunek
TCP 443 Węzły robocze, użytkownicy końcowi, żądania API Serwer API Kubernetes Ruch przychodzący do węzła głównego
TCP 10250 Węzły główne Port sprawdzania stanu Kubelet w węźle roboczym Ruch przychodzący do węzła roboczego
TCP 30000-32767 Zewnętrzni klienci aplikacji Domyślny zakres portów do świadczenia usług zewnętrznych
UDP 8285 Węzły robocze Backend UDP sieci nakładkowej Flannel
UDP 8472 Węzły robocze Backend VXLAN sieci nakładkowej Flannel
TCP 179 Węzły robocze Wymagane tylko w przypadku korzystania z sieci Calico BGP
TCP 2379-2380 Węzły główne API klienta serwera etcd Ruch przychodzący do węzła etcd
TCP 2379-2380 Węzły robocze API klienta serwera etcd wymagane w przypadku korzystania z Flannel lub Calico

Domyślnie w systemie Ubuntu zainstalowana jest zapora iptables, ale nie ma w niej żadnych gotowych reguł blokujących. Dlatego jeśli instalujesz system Ubuntu, aby wypróbować Kubernetes, nie musisz edytować reguł zapory. Kube-proxy umieszcza najpierw swoje łańcuchy iptables, a następnie wstawia dwie reguły iptables. Są to reguły KUBE-EXTERNAL-SERVICES i KUBE-FIREWALL, które są wstawiane na początku łańcucha INPUT.

Instalacja Kubernetes na Ubuntu może odbywać się zarówno na maszynach fizycznych, jak i wirtualnych. Ogólnym zaleceniem jest użycie najnowszej wersji 64-bitowego systemu Ubuntu Linux. W dzisiejszym wpisie na blogu wyjaśniono, jak zainstalować Kubernetes w systemie Ubuntu 18.04 LTS działającym na maszynach wirtualnych VMware. Pierwszy opisany typ wdrażania Kubernetes obejmuje jeden węzeł główny oraz dwa węzły robocze wykorzystywane w klastrze Kubernetes. W poniższej tabeli przedstawiono liczbę węzłów w zależności od warunków, role węzłów, nazwy hostów oraz adresy IP maszyn użytych w rozpatrywanym przykładzie.

Nr Rola węzła Adres IP Nazwa hosta
1 Master 192.168.101.21 docker-nakivo21
2 Worker 192.168.101.31 docker-nakivo31
3 Worker 192.168.101.32 docker-nakivo32

Możesz korzystać z maszyn wirtualnych działających na hostach ESXi, jeśli używasz VMware vSphere, lub możesz uruchamiać maszyny wirtualne na VMware stacji roboczej zainstalowanej na komputerze osobistym z systemem Linux lub Windows. W dzisiejszym przykładzie używamy maszyn wirtualnych działających na VMware Stacji Roboczej. Maszyny wirtualne korzystają z sieci NAT sieć z dostępem do Internetu, a jeśli wolisz VirtualBox od VMware, możesz z niej skorzystać.

Adres IP maszyny hosta: 10.10.10.53

Adres IP wirtualnej bramy dla sieci NAT (VMNet8): 192.168.101.2

Ten sam użytkownik systemu Linux istnieje na wszystkich maszynach z systemem Ubuntu: kubernetes-user

Konfiguracja maszyny wirtualnej: 2 procesory, 4 GB pamięci RAM, dysk wirtualny o pojemności 20 GB

Adresy IP sieci VMnet8 można zmienić, przechodząc do Edit > Virtual Network Editor w programie VMware stacja robocza.

Aby ułatwić zrozumienie, w dzisiejszym przykładzie wszystkie komponenty zostaną zainstalowane w systemie Linux ręcznie, bez użycia narzędzi do automatyzacji, takich jak Ansible.

Wdrażanie maszyny wirtualnej z systemem Ubuntu

Utwórz nową maszynę wirtualną o nazwie docker-nakivo21 .

Zainstaluj 64-bitową wersję systemu Ubuntu na pierwszej maszynie i ustaw nazwę hosta oraz nazwę użytkownika.

Nazwa maszyny wirtualnej: docker-nakivo21

Nazwa użytkownika: kubernetes-user

Configuring host name and user name while setting up Ubuntu before installing Kubernetes on Ubuntu.

Zainstaluj VMware Tools po pierwszym zalogowaniu się do zainstalowanego systemu operacyjnego. Jeśli korzystasz z maszyn fizycznych, nie musisz używać VMware Tools i możesz pominąć ten krok.

Uwaga : Znak $ na początku oznacza, że polecenie jest uruchamiane jako zwykły użytkownik ( kubernetes-user w tym przypadku). Jeśli ciąg znaków zaczyna się od znaku # , polecenie musi zostać wykonane jako użytkownik główny . Polecenie `sudo` (wystarczy wpisać `sudo` lub ` sudo -i `, w zależności od tego, czy chcesz działać jako zwykły użytkownik, czy jako superużytkownik) pozwala na wykonywanie poleceń w imieniu innego użytkownika, w tym użytkownika root. Aby uzyskać uprawnienia root w konsoli, wpisz ` sudo apt-get install open-vm-tools `. Naciśnij klawisze Ctrl+D, aby wyjść z trybu root.

Narzędzia VMware Tools można zainstalować z obrazu ISO dostarczonego wraz z hiperwizorem VMware lub z repozytoriów systemu Linux (jak wyjaśniono poniżej).

$&

Jeśli potrzebujesz zaawansowanych funkcji pulpitu, takich jak wspólny schowek, przeciąganie i upuszczanie plików itp., uruchom:

$ sudo apt-get install open-vm-tools-desktop

Uruchom ponownie maszynę wirtualną.

$ init 6

Skonfiguruj maszynę z systemem Ubuntu przed instalacją Kubernetes

Przed instalacją Kubernetes na maszynach z systemem Ubuntu należy wykonać pewne przygotowania. Przede wszystkim należy skonfigurować statyczny adres IP i nazwę hosta dla każdego zwykłego serwera.

Ustaw statyczny adres IP

Podobnie jak w przypadku każdego innego typu klastra, zdecydowanie zaleca się stosowanie statycznych adresów IP na węzłach.

Przed ustawieniem adresu IP zainstaluj narzędzia sieciowe systemu Linux.

$ sudo apt-get install net-tools

Wpisz ifconfig , aby sprawdzić aktualny adres IP maszyny wirtualnej z systemem Ubuntu.

Checking network configuration on the node before installing Kubernetes on Ubuntu.

Można zauważyć, że adres IP jest uzyskiwany automatycznie za pośrednictwem protokołu DHCP. Zapamiętaj nazwę interfejsu sieciowego. W obecnym przykładzie nazwa ta to ens33 . Nazwa pierwszego interfejsu sieciowego Ethernet to zazwyczaj eth0 w przypadku maszyn fizycznych.

Do edycji plików konfiguracyjnych potrzebny jest edytor tekstu. Zainstaluj vim jako edytor tekstu.

$ sudo apt-get install vim

W najnowszych wersjach Ubuntu konfiguracja sieci jest ustawiana w pliku yaml. Otwórz plik yaml konfiguracji sieci w vim.

$ sudo vim /etc/netplan/01-network-manager-all.yaml

Domyślny widok pliku konfiguracyjnego to:

Editing network settings on the node before installing Kubernetes on Ubuntu.

Edytuj ten plik konfiguracji sieci zgodnie z poniższym przykładem:

network:

version: 2

renderer: networkd

ethernets:

ens33:

dhcp4: no

addresses: [192.168.101.21/24]

gateway4: 192.168.101.2

nameservers:

addresses: [192.168.101.2,8.8.8.8]

Zapisz zmiany i zamknij plik.

:wq

Network settings on the first node used for installing Kubernetes on Ubuntu

$ sudo netplan try

Naciśnij klawisz ENTER, aby zaakceptować nową konfigurację.

Sprawdź, czy konfiguracja sieci została zmieniona i spróbuj wykonać polecenie ping, na przykład do adresów: nakivo.com .

$ ifconfig

$ ping nakivo.com

Checking network configuration on the Kubernetes node after editing.

Skonfiguruj nazwę hosta

Sprawdź aktualną nazwę hosta.

$ hostnamectl

Jak zapewne pamiętasz, nazwa hosta dla pierwszej maszyny wirtualnej, czyli docker-nakivo21 została już skonfigurowana podczas instalacji. Aby zmienić nazwę hosta, wykonaj następujące czynności (będzie to potrzebne do skonfigurowania drugiej i trzeciej maszyny wirtualnej po klonowaniu. Te dwie maszyny wirtualne mają być skonfigurowane jako węzły robocze):

Na przykład, jeśli chcesz zmienić nazwę hosta na docker-nakivo21 na pierwszej maszynie wirtualnej, uruchom: $ sudo hostnamectl set-hostname docker-nakivo21

Sprawdź, czy nowa nazwa hosta została zastosowana.

$ less /etc/hostname

Edytuj plik hosts .

$ sudo vim /etc/hosts

Zawartość pliku hosts musi wyglądać następująco:

127.0.0.1 localhost

127.0.1.1 docker-nakivo21

Uruchom ponownie maszynę.

$ init 6

Wyłącz plik wymiany

Korzystanie z pliku wymiany (partycji swap) nie jest obsługiwane przez Kubernetes, a wyłączenie swappiness jest konieczne do pomyślnej instalacji Kubernetes na Ubuntu.

Wyłącz plik wymiany, aby zapobiec wysokiemu zużyciu procesora przez kubelet.

$ sudo swapoff -a

Edytuj /etc/fstab i skomentuj ciąg znaków za pomocą znaku # .

$ sudo vim /etc/fstab

#/swapfile none swap sw 0 0

Disabling the swap partition before installing Kubernetes on Ubuntu

Możesz zrobić to samo za pomocą sed za pomocą jednego polecenia:

$ sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab

Wyłącz swap w sysctl.conf

$ sudo echo "vm.swappiness=0" | sudo tee --append /etc/sysctl.conf

Gdzie 0 to procent swapiness. W tym przypadku swap może być używany tylko wtedy, gdy zabraknie pamięci RAM (domyślnie swap jest używany, gdy ponad 60% pamięci RAM jest zapełnione).

Zastosuj zmiany konfiguracji bez restartu.

$ sudo sysctl -p

Uwaga : Jeśli partycja swap nie jest wyłączona, proces kswapd0 w systemie Ubuntu Linux z uruchomionym Kubernetes może zużywać duże ilości zasobów procesora na Twoim komputerze, powodując brak reakcji aplikacji i zawieszanie się systemu. Dzieje się tak, gdy systemowi operacyjnemu zabraknie pamięci, a stare strony pamięci są przenoszone do partycji swap przez proces systemowy jądra Linux. Z dziwnych powodów czasami coś idzie nie tak i pojawia się niekończąca się pętla, która zużywa wszystkie zasoby procesora. Na poniższym zrzucie ekranu widać wysokie zużycie procesora przez proces kswapd0 gdy Kubernetes jest zainstalowany na Ubuntu. Średnia wartość obciążenia jest nadmiernie wysoka.

For preventing CPU overloading by kswapd0 process disable the swap partition before installing Kubernetes on Ubuntu.

Jeśli kswapd0 nadal przeciąża Procesor, uruchom następujące polecenie, aby unieważnić wszystkie pamięci podręczne i zatrzymać kswapd0 (wykonaj jako root).

# echo 1 > /proc/sys/vm/drop_caches

Wyłącz maszynę wirtualną.

$ init 0

Ta częściowo skonfigurowana maszyna wirtualna ( docker-nakivo21 ) ma zostać użyta jako węzeł główny. Utwórz dwie maszyny, które będą służyć jako węzły robocze. Jeśli korzystasz z maszyn fizycznych, powtórz poprzednie kroki ręcznie (lub użyj narzędzi do automatyzacji, takich jak Ansible, do jednoczesnej konfiguracji wielu maszyn z systemem Linux przez SSH). Ponieważ w tym przykładzie używane są maszyny wirtualne, można je sklonować, aby zaoszczędzić czas podczas przygotowywania środowiska do instalacji Kubernetes na maszynach z systemem Ubuntu.

Sklonuj maszynę wirtualną

Sklonuj swoją pierwszą maszynę wirtualną. Jeśli korzystasz z VMware ESXi, możesz użyć wbudowanej funkcji klonowania. Więcej informacji na ten temat znajdziesz w naszym wpisie na blogu pod adresem klonowanie maszyn wirtualnych przy użyciu szablonów maszyn wirtualnych. Jeśli korzystasz z programu VMware Station, możesz również klonować maszyny wirtualne na dwa sposoby (za pomocą wbudowanego narzędzia do klonowania lub ręcznie). Kliknij VM > Manage > Clone , aby utworzyć klon powiązany. Stwórzmy pełny klon pierwszej maszyny wirtualnej i ręcznie skopiujmy pliki maszyny wirtualnej. W tym przypadku pliki są kopiowane z katalogu docker-nakivo21 do katalogu docker-nakivo31. Katalogi należy utworzyć ręcznie przed skopiowaniem plików maszyny wirtualnej.

Cloning the Ubuntu VM by copying VM files for creating worker nodes to install Kubernetes on Ubuntu.

Edytuj plik VMX, ponieważ nazwa maszyny wirtualnej i ścieżka do pliku dysku wirtualnego uległy zmianie.

displayName = "docker-nakivo31"

scsi0:0.fileName = "C:VirtualKUBERNETESdocker-nakivo31docker-nakivo31.vmdk"

nvram = "docker-nakivo31.nvram"

Editing the VMX file of the VM clone.

Maszyna wirtualna, która będzie używana jako pierwszy węzeł roboczy, została utworzona. Sklonuj pierwszą maszynę wirtualną jeszcze raz, aby przygotować drugi węzeł roboczy klastra Kubernetes.

Edytuj plik VMX trzeciej maszyny wirtualnej (drugiego węzła roboczego), tak jak to zrobiłeś wcześniej.

displayName = "docker-nakivo32"

scsi0:0.fileName = "C:VirtualKUBERNETESdocker-nakivo31docker-nakivo32.vmdk"

nvram = "docker-nakivo32.nvram"

Otwórz klony maszyn wirtualnych w stacji roboczej VMware (File> Open i wybierz plik VMX maszyny wirtualnej) lub po prostu kliknij dwukrotnie plik VMX maszyny wirtualnej. Włącz trzy maszyny wirtualne (jedną maszynę źródłową i dwa klony). Kliknij I Copied It , gdy pojawi się monit.

Uwaga : Jeśli korzystasz z maszyn wirtualnych, edytuj adres IP i nazwę hosta na każdym klonie maszyny wirtualnej po sklonowaniu maszyn. Jeśli korzystasz z maszyn fizycznych, wykonaj wszystkie poprzednie kroki zgodnie z adresami IP i nazwami hostów dla każdej maszyny.

Konfigurowanie adresów IP i nazw hostów na maszynach wirtualnych

Zmień adres IP i nazwę hosta na docker-nakivo31 oraz docker-nakivo32 maszynach wirtualnych (jak pokazano powyżej).

Powtórz kroki opisane w powyższych sekcjach, aby skonfigurować statyczne adresy IP i nazwy hostów.

Adres IP musi brzmieć: 192.168.101.31 oraz 192.168.101.32 ; nazwy hostów muszą brzmieć odpowiednio docker-nakivo31 oraz docker-nakivo32 na węzłach roboczych.

Wszystkie maszyny muszą być skonfigurowane do rozpoznawania nazw hostów węzłów na adresy IP. Można skonfigurować serwer DNS lub ręcznie przeprowadzić edycję pliku hosts na każdej maszynie. Edytujmy plik hosts .

Dodaj następujące ciągi do pliku hosts na każdej maszynie ( docker-nakivo21 , docker-nakivo31 , docker-nakivo32 ).

$ sudo vim /etc/hosts

Dodaj te linie do pliku hosts :

192.168.101.21 docker-nakivo21

192.168.101.31 docker-nakivo31

192.168.101.32 docker-nakivo32

Installing Kubernetes on Ubuntu - configuring etchosts on all cluster nodes before Kubernetes setup

Wykonaj polecenie ping na inne hosty z każdego hosta, aby upewnić się, że nazwy hostów są rozpoznawane: $ ping docker-nakivo21

$ ping docker-nakivo31

$ ping docker-nakivo32

Konfiguracja dostępu SSH na wszystkich hostach (maszynach wirtualnych)

Skonfiguruj dostęp SSH na wszystkich hostach. Zainstaluj serwer OpenSSH, wykonując polecenia na każdej maszynie.

$ sudo apt-get install openssh-server

Przejdź do katalogu domowego kubernetes-user i wygeneruj parę kluczy SSH (zestaw kluczy kryptograficznych składający się z klucza prywatnego i klucza publicznego). Pary kluczy SSH mogą być używane do uzyskania dostępu do zdalnej konsoli Linuxa przez SSH bez użycia haseł. Klucz publiczny można skopiować na maszynę, z której chcesz się połączyć zdalnie, podczas gdy klucz prywatny jest ściśle tajny i musi być przechowywany na maszynie, z którą chcesz się połączyć.

$ ssh-keygen

Nie ma potrzeby wprowadzania hasła do generowania klucza (hasło jest opcjonalne).

Skopiuj klucze na inne maszyny z systemem Ubuntu:

$ ssh-copy-id kubernetes-user@192.168.101.31

$ ssh-copy-id kubernetes-user@192.168.101.32

Wprowadź hasło użytkownika, aby potwierdzić kopiowanie kluczy.

Spróbuj połączyć się z drugą maszyną ( docker-nakivo31 ) jako kubernetes-user (czyli zwykły użytkownik).

$ ssh 'kubernetes-user@192.168.101.31'

Następnie przetestuj połączenie z trzecią maszyną ( docker-nakivo32 ).

$ ssh 'kubernetes-user@192.168.101.32'

Po pomyślnym nawiązaniu połączenia w wierszu poleceń konsoli pojawi się nazwa maszyny zdalnej.

Installing Kubernetes on Ubuntu – using SSH access for accessing one node from another.

Naciśnij Ctrl+D, aby wyjść z konsoli zdalnej.

Jak skopiować klucz do łączenia się przez SSH jako użytkownik główny?

Ponieważ w Kubernetes będziesz potrzebować uprawnień użytkownika głównego, utwórzmy klucze do konfiguracji dostępu SSH dla użytkownika głównego. Wykonaj następujące polecenia na wszystkich maszynach (docker-nakivo21, docker-nakivo31 i docker-nakivo32), do których dostęp przez SSH jest wymagany jako użytkownik główny.

$ sudo -i

Edytuj plik konfiguracyjny serwera SSH.

# vim /etc/ssh/sshd_config

Dodaj/edytuj następujący ciąg znaków w tym pliku.

PermitRootLogin yes

Setting the PermitRootLogin option during SSH configuration

Uruchom ponownie demona serwera SSH.

# /etc/init.d/ssh stop

# /etc/init.d/ssh start

Ustaw hasło root (hasło dla użytkownika głównego).

# passwd

$ cd /home/kubernetes-user/

$ sudo ssh-keygen -t rsa

Skopiuj klucz publiczny, aby móc logować się zdalnie przez SSH jako użytkownik główny (klucz jest przechowywany w katalogu domowym zwykłego użytkownika, ponieważ poprzednie polecenie zostało uruchomione z tego katalogu).

$ sudo ssh-copy-id -i /home/kubernetes-user/.ssh/id_rsa.pub 127.0.0.1

Jeśli klucz jest zapisany w katalogu domowym użytkownika głównego, skopiuj go za pomocą tego polecenia:

# ssh-copy-id -i /root/.ssh/id_rsa.pub 127.0.0.1

Potwierdź tę operację i wprowadź hasło.

Powtórz tę czynność, kopiując klucz z każdej maszyny na pozostałe. Na przykład na maszynie docker-nakivo21 wykonaj:

# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.101.31

# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.101.32

Autoryzuj klucz publiczny.

# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

Sprawdź, czy możesz zalogować się jako użytkownik główny przez SSH na maszynie lokalnej. $ sudo ssh root@127.0.0.1

Spróbuj nawiązać połączenie z/do zdalnej maszyny bez podawania hasła.

$ sudo ssh root@192.168.101.21

$ sudo ssh root@192.168.101.31

$ sudo ssh root@192.168.101.32

Uwaga : Łączenie się jako użytkownik główny może być niebezpieczne. Nie łącz się jako użytkownik główny, jeśli nie jest to konieczne — lepiej połączyć się przez SSH jako zwykły użytkownik i użyć polecenia sudo .

Instalacja Docker

Docker to najpopularniejsza platforma kontenerowa dla aplikacji Enterprise obsługiwana przez Kubernetes. Zainstaluj Docker na wszystkich maszynach. Wykonaj poniższe polecenia na docker-nakivo21 , docker-nakivo31 , docker-nakivo32 .

Nie ma jednak potrzeby się spieszyć. Na początek możesz po prostu zainstalować Docker, używając standardowego polecenia:

$ sudo apt-get install -y docker.io

Jednak w tym przypadku używana wersja Docker może nie być najnowsza. Naprawmy to, instalując najnowszą wersję Docker.

Najpierw zainstaluj wymagane pakiety.

$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

Curl to uniwersalne, kompaktowe narzędzie zaprojektowane do przesyłania danych z/do hosta bez interakcji użytkownika przy użyciu jednego z obsługiwanych protokołów (HTTP, HTTPS, FTP, FTPS, SFTP, LDAP, LDAPS, IMAP, IMAPS, POP3, POP3S, SCP, SMB, SMTP, TELNET itp.).

Dodaj klucz GPG dla oficjalnego repozytorium Docker do swojego systemu Ubuntu:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Wynik na konsoli powinien wyglądać następująco: OK.

Dodaj oficjalne repozytorium Docker do swojego menedżera pakietów apt:

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

Zaktualizuj bazę danych menedżera pakietów po wprowadzeniu ręcznych zmian za pomocą poprzedniego polecenia.

$ sudo apt-get update

Sprawdź wersję pakietu Docker dostępnego w oficjalnym repozytorium.

$ apt-cache policy docker-ce

Zainstaluj Docker.

$ sudo apt-get install docker-ce

Po instalacji możesz sprawdzić wersję Docker.

$ docker --version

W tym przypadku wynik to: Docker wersja 18.09.6, kompilacja 481bc77 .

Uruchom Docker i ustaw jego demona tak, aby ładował się automatycznie przy starcie systemu.

$ sudo systemctl start docker

$ sudo systemctl enable docker

Po zainstalowaniu Dockera na wszystkich maszynach możesz przejść bezpośrednio do etapu instalacji Kubernetes na Ubuntu.

Instalacja Kubernetes na Ubuntu i inicjalizacja klastra

Teraz nic nie stoi na przeszkodzie, aby zainstalować podstawowe komponenty Kubernetes.

Uruchom polecenia jako root na wszystkich maszynach, które mają zostać włączone do klastra Kubernetes.

$ sudo -i

Dodaj klucz GPG dla oficjalnego repozytorium Docker do systemu Ubuntu:

# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

Dodaj oficjalne repozytorium Kubernetes do bazy dostępnych repozytoriów pakietów dla menedżera pakietów apt.

# cat </etc/apt/sources.list.d/kubernetes.list

deb http://apt.kubernetes.io/ kubernetes-xenial main

EOF

Alternatywnie możesz dodać repozytorium za pomocą tego polecenia: # echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list

Gdzie tee to narzędzie, które odczytuje dane ze standardowego wejścia i zapisuje je na standardowym wyjściu oraz w określonych plikach.

Zaktualizuj listę pakietów dostępnych w repozytoriach w systemie Ubuntu.

# apt-get update

Installing Docker before installing Kubernetes on Ubuntu

Zainstalowanie kubectl , kubeadm oraz kubectl ma kluczowe znaczenie dla instalacji Kubernetes na Ubuntu.

# apt-get install -y kubelet kubeadm kubectl

Zainstaluj keepalived.

# apt-get install keepalived

# systemctl enable keepalived && systemctl start keepalived

Sprawdź, czy wartość wynosi 1 dla prawidłowego działania Kubernetes zainstalowanego na Ubuntu.

# sysctl net.bridge.bridge-nf-call-iptables

Aby ustawić tę wartość na 1 uruchom polecenie:

sysctl net.bridge.bridge-nf-call-iptables=1

Edytuj plik konfiguracyjny kubeadm.

# vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

Dodaj ciąg znaków po istniejącym ciągu Environment:

Environment=”cgroup-driver=systemd/cgroup-driver=cgroupfs”

Installing Kubernetes on Ubuntu – configuring kubeadm

Cgroups to grupy kontrolne, które izolują wykorzystanie zasobów, takich jak procesor, pamięć, wejście/wyjście dysku, sieć.

Na węźle głównym ( docker-nakivo21 ) uruchom polecenie, aby zainicjować klaster Kubernetes w systemie Ubuntu.

# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.101.21

Gdzie

–pod-network-cidr jest wymagane przez sterownik Flannel. CIDR (Classless Inter-Domain Routing) definiuje adres sieci nakładkowej (takiej jak Flannel), która zostanie skonfigurowana później. Maska sieciowa określa również, ile podów może działać na jednym węźle. Adres sieciowy CIDR i adres sieciowy używany dla Flannel muszą być takie same.

–apiserver-advertise-address=192.168.101.21 określa adres IP, który będzie ogłaszany przez Kubernetes jako jego serwer API.

Installing Kubernetes on Ubuntu – cluster initialization.

Przeczytaj wynik i zapisz polecenia wyświetlone na końcu tekstu. To ważna kwestia. Wygenerowany token jest wymagany do dodania węzłów roboczych do klastra Kubernetes.

Uruchom poniższe polecenia jako użytkownik, który uruchomił kubeadm init. W tym przypadku polecenia są wykonywane jako użytkownik główny.

# mkdir -p $HOME/.kube

# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# sudo chown $(id -u):$(id -g) $HOME/.kube/config

Jeśli nie uruchomisz tych poleceń, Kubernetes zwróci błąd: Połączenie z serwerem localhost:8080 zostało odrzucone — czy podałeś właściwy host lub port?

Kubernetes nie kopiuje automatycznie tego pliku konfiguracyjnego do katalogu użytkownika. Należy wykonać tę operację ręcznie.

Installing Kubernetes on Ubuntu – This connection to the server localhost 8080 was refused

Sprawdź węzły dodane do klastra

# kubectl get nodes

Installing Kubernetes on Ubuntu – checking cluster nodes

W klastrze Kubernetes instalowanym na Ubuntu widać jeden węzeł główny, który ma status NotReady . Wynika to z faktu, że sieć nakładkowa nie została skonfigurowana. Skonfiguruj Flannel, aby naprawić status NotReady węzła głównego Kubernetes. Utwórz katalog do przechowywania plików YAML dla Docker i Kubernetes, na przykład /home/kubernetes-user/kubernetes/

Język YAML (Yet Another Markup Language) zapewnia większą wygodę podczas tworzenia podów i wdrażania w Kubernetes. Wszystkie parametry kontenerów, które mają zostać wdrożone, można zdefiniować w pliku konfiguracyjnym YAML zamiast ręcznie uruchamiać każde polecenie w konsoli Linuksa. Pliki YAML są również nazywane plikami manifestowymi w kontekście Kubernetes.

Utwórz plik konfiguracyjny YAML o następującej treści:

kube-flannel.yml

Uruchom polecenie

# kubectl apply -f ./kube-flannel.yml

Alternatywnie możesz znaleźć gotowe, bezpłatne przykłady konfiguracji wdrażania YAML dla Kubernetes na GitHubie.

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

Sprawdź węzły dodane do klastra Kubernetes, który wdrażasz na Ubuntu:

# kubectl get nodes

Status węzła głównego to teraz Ready.

Installing Kubernetes on Ubuntu – the master node is ready

Upewnij się, że Flannel został poprawnie skonfigurowany:

# kubectl get pods --all-namespaces

Checking pods of the Kubernetes cluster after passing the error Unable to connect to the server net http TLS handshake timeout

Możesz zobaczyć, że pod Flannel działa. Ten pod składa się z dwóch kontenerów – demona Flannel oraz initContainer używanego do wdrażania konfiguracji CNI w lokalizacji dostępnej dla Kubernetes.

Czasami podczas instalacji Kubernetes na Ubuntu może wystąpić następujący błąd:

Nie można połączyć się z serwerem: net/http: przekroczono limit czasu uzgadniania TLS.

Jak można rozwiązać ten problem? Poczekaj kilka sekund i spróbuj ponownie — często to wystarczy.

Przestrzenie nazw to logiczne jednostki w klastrze Kubernetes, które reprezentują zasoby klastra i mogą być traktowane jako wirtualne klastry. Jeden fizyczny klaster można logicznie podzielić na wiele wirtualnych klastrów. Domyślne przestrzenie nazw Kubernetes to Default , Kube-public oraz Kube-system . Możesz uzyskać listę przestrzeni nazw:

# kubectl get namespaces

Jak pamiętasz, podstawową jednostką wdrażania w Kubernetes jest pod, czyli zbiór kontenerów, które współdzielą przestrzeń nazw sieciową i montowania. Wszystkie kontenery w podzie są planowane na tym samym węźle Kubernetes. Sprawdź dostępne pody:

# kubectl -n kube-system get pods

Checking available pods in Kubernetes

Jeśli chcesz zresetować/zatrzymać klaster, uruchom:

# kubeadm reset

Na węźle głównym wszystko jest w porządku. Oznacza to, że możesz teraz kontynuować instalację Kubernetes na Ubuntu i przejść do dodawania węzłów roboczych do klastra.

Na węzłach roboczych ( docker-nakivo31 , docker-nakivo32 ) uruchom polecenie:

# kubeadm join 192.168.101.21:6443 --token d8mbzb.uulxu01jbty8yh4z

--discovery-token-ca-cert-hash sha256:65ace7a4ff6fff795abf086f18d5f0d97da71d4639a0d0a6b93f42bea4948a79

Token i hash zostały zanotowane po inicjalizacji klastra za pomocą polecenia kubeadm init , jak być może pamiętasz.

Na węźle głównym sprawdź ponownie status klastra. # kubectl get nodes

Installing Kubernetes on Ubuntu – all nodes are added and ready

Teraz w klastrze Kubernetes działającym na maszynach z systemem Ubuntu widać jeden węzeł główny i dwa węzły robocze.

Możesz sprawdzić konfigurację Kubernetes:

# kubectl cluster-info

Installing Kubernetes on Ubuntu – viewing the cluster info

Wdrażanie poda w Kubernetes

Teraz możesz wdrożyć pod zawierający kontenery w swoim klastrze Kubernetes. Jak zapewne pamiętasz, w Kubernetes kontenery są zawarte w podach. Jeśli korzystasz z plików YAML, dla wygody utwórz katalog do przechowywania tych plików. Przejdź do tego katalogu i uruchom polecenia takie jak kubectl apply -f test.yaml

Taki katalog został już utworzony podczas konfiguracji Flannel – /home/kubernetes-user/kubernetes/

Czas wdrożyć nowy pod. Najpierw musisz utworzyć wdrażanie. Wdrażanie to koncepcja kontrolera używana do dostarczania deklaratywnych aktualizacji do podów i zestawów replik. Wdrażanie można utworzyć za pomocą pojedynczego polecenia lub plików YAML.

Przykład 1 – wdrażanie MySQL

W tym przykładzie utwórzmy plik YAML. Nazwa pliku to mysql-wdrażanie.yaml

Aby zapoznać się z konfiguracją, zajrzyj do załączonego pliku.

# vim mysql-deployment.yaml

Istnieją dwa popularne podejścia do zarządzania zasobami za pomocą kubectl . Jaka jest różnica między kubectl create a kubectl apply ? Korzystając z kubectl create , informujesz Kubernetes, co chcesz utworzyć, zastąpić lub usunąć; polecenie to nadpisuje wszystkie zmiany. Alternatywnie, kubectl apply wprowadza zmiany przyrostowe i to polecenie może być użyte do zapisania zmian zastosowanych do obiektu działającego.

Utwórz wdrażanie:

# kubectl apply -f ./mysql-deployment.yaml

Installing Kubernetes on Ubuntu – Creating the MySQL deployment

Kubernetes może wyświetlać informacje o Twoim wdrażaniu.

# kubectl describe deployment mysql

Sprawdź pody:

# kubectl get po

lub

# kubectl get pods

lub

# kubectl get pods -l app=mysql

Jeśli widzisz status „pending” dla poda, może to oznaczać, że brakuje zasobów obliczeniowych. Spróbuj dodać trochę procesorów i pamięci, aby naprawić status „pending” podu w Kubernetes.

Installing Kubernetes on Ubuntu – getting the list of services and pods

W razie potrzeby możesz usunąć usługę:

# kubectl delete service

Możesz również usunąć pod:

# kubectl delete pod mysql-7b9b7999d8-nz5tm

Przykład 2 — Wdrażanie nginx

Wdróżmy nginx przy użyciu innej metody bez plików yaml.

Utwórz wdrażanie.

# kubectl create deployment nginx --image=nginx

Sprawdź, czy wdrażanie zostało utworzone.

# kubectl get deployments

Utwórz usługę.

# kubectl create service nodeport nginx --tcp=80:80

Usługę można utworzyć przy użyciu następujących typów usług – ClusterIP, NodePort, LoadBalance i ExternalName. Jeśli używany jest typ NodePort, do uzyskania dostępu do dostarczonych usług przydzielany jest losowy port z zakresu 30000–32767. Ruch kierowany na ten port jest przekazywany do odpowiedniej usługi.

Sprawdź, czy usługa została utworzona i nasłuchuje na zdefiniowanym porcie.

# kubectl get svc

Installing Kubernetes on Ubuntu – creating the nginx deployment

Zapamiętaj numer portu (w tym przypadku 31453).

Sprawdź, czy usługa została wdrożona i jest dostępna (w tym przykładzie polecenie jest uruchamiane na węźle głównym). Użyj nazwy hosta węzła i portu, które zapamiętałeś w poprzednim kroku.

# curl docker-nakivo31:31453

Możesz również sprawdzić, czy usługa jest dostępna w przeglądarce dowolnego węzła. W pasku adresu przeglądarki internetowej spróbuj odwiedzić strony:

http:// 10.101.235.90

lub

http://docker-nakivo31:31453

http://docker-nakivo32:31453

Jeśli wszystko jest w porządku, zobaczysz stronę powitalną nginx.

Nginx id deployed in Kubernetes after installing Kubernetes on Ubuntu

Możliwe jest również odwiedzenie strony testowej nginx z dowolnego komputera, który ma dostęp do sieci, z którą połączone są węzły Kubernetes — ( 192.168.101.0/24 ) w tym przypadku. Na przykład można odwiedzić strony internetowe za pomocą przeglądarki:

http://192.168.101.21:31453/

http://192.168.101.31:31453/

http://192.168.101.32:31453/

Skonfiguruj interfejs internetowy do monitorowania Kubernetes

Instalacja Kubernetes na Ubuntu jest prawie zakończona, ale dla większej wygody możesz również zainstalować pulpit nawigacyjny Kubernetes. Pulpit nawigacyjny Kubernetes to interfejs internetowy służący do zarządzania i monitorowania Kubernetes. Aby zainstalować pulpit nawigacyjny, utwórz plik kubernetes-dashboard.yaml , podobnie jak to zrobiłeś wcześniej przed wykonaniem poleceń.

# kubectl create -f ./kubernetes-dashboard.yaml

# kubectl apply -f ./kubernetes-dashboard.yaml

Sprawdź pody.

# kubectl get pods -o wide --all-namespaces

Uruchom proxy do serwera API Kubernetes.

# kubectl proxy

Deploying Kubernetes dashboard after installing Kubernetes on Ubuntu

Aby wprowadzić kolejne polecenia w konsoli, otwórz kolejne okno konsoli. W przeciwnym razie proces zostanie zakończony.

W przeglądarce internetowej na węźle głównym przejdź do strony:

http://localhost:8001

Zobaczysz stronę testową.

Deploying Kubernetes dashboard

Wpisz pełny adres w pasku adresu przeglądarki internetowej.

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

Installing Kubernetes on Ubuntu – the dashboard in installed

Utwórz pulpit nawigacyjny z kontem serwisowym, wykonując polecenia w nowym oknie konsoli.

# kubectl create serviceaccount dashboard -n default

# kubectl create clusterrolebinding dashboard-admin -n default

--clusterrole=cluster-admin

--serviceaccount=default:dashboard

# kubectl get secret $(kubectl get serviceaccount dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 –decode

Teraz możesz zobaczyć wygenerowany token:

Generating a token needed to log in Kubernetes dashboard

Skopiuj wygenerowany token i wklej go w sekcji tokenów interfejsu internetowego, aby zalogować się do pulpitu nawigacyjnego.

Enter the token to log in Kubernetes dashboard.

Na poniższym zrzucie ekranu widać interfejs internetowy pulpitu nawigacyjnego Kubernetes. Możesz sprawdzić status węzłów, wdrażaniach i podów, a także role, klasy pamięci masowej i inne komponenty. The main page of Kubernetes dashboard.

Konfiguracja narzędzia monitorującego Heapster

Zainstaluj Heapster, aby rozszerzyć możliwości monitorowania pulpitu nawigacyjnego Kubernetes o parametry dotyczące Procesora, pamięci i inne. Utwórz plik manifestu o nazwie heapster.yaml .

# vim heapster.yaml

W kolejnym kroku wdrażaj Heapster.

# kubectl create -f heapster.yaml

Edytuj rolę RBAC (kontrola dostępu na podstawie ról) Heapstera i dodaj uprawnienia do dostępu do statystyk węzłów.

# kubectl edit clusterrole system:heapster

Installing Kubernetes on Ubuntu – deploying Heapster

Sprawdź, czy w konsoli można mierzyć wskaźniki dotyczące Procesora i pamięci.

# kubectl top node

Installing Docker on Kubernetes – measuring CPU and memory consumption of cluster nodes

Teraz możesz otworzyć interfejs internetowy pulpitu nawigacyjnego Kubernetes i zobaczyć, że dodano kilka sekcji, w tym wykresy wykorzystania Procesora i pamięci.

The web interface of Kubernetes dashboard after deploying Heapster.

Twój klaster Kubernetes jest teraz skonfigurowany i gotowy do pracy.

Wdrażanie klastra Kubernetes o wysokiej dostępności z wieloma węzłami głównymi w systemie Ubuntu

Posiadanie klastra Kubernetes z jednym węzłem głównym i kilkoma węzłami roboczymi jest dobrym rozwiązaniem, ale czasami jedyny węzeł główny może ulec awarii z powodu problemów sprzętowych lub utraty zasilania. Aby zapewnić wyższą odporność na awarie klastra Kubernetes wdrożonego na węzłach Ubuntu, lepiej rozważyć wdrożenie klastra Kubernetes o wysokiej dostępności z wieloma węzłami głównymi. Wykorzystanie tego modelu wdrażania klastra Kubernetes pozwala uniknąć pojedynczego punktu awarii. Zaleca się stosowanie nieparzystej liczby węzłów głównych, a minimalna liczba węzłów głównych zapewniająca odporność na awarie to trzy. Jeśli używasz więcej niż trzech węzłów głównych, a liczba węzłów jest parzysta, odporność całego klastra na awarie nie wzrasta. W poniższej tabeli przedstawiono porównanie wartości odporności na awarie w zależności od liczby węzłów głównych w klastrze Kubernetes. Na przykład, jeśli klaster ma 5 węzłów głównych, może on przetrwać awarię 2 węzłów głównych, ponieważ trzy węzły główne pozostają sprawne (3 z 5 to ponad 50% i stanowi większość). Rozmiar klastra odnosi się do liczby węzłów głównych w klastrze.

Rozmiar klastra Większość Odporność na awarie
1 1 0
2 2 0
3 2 1
4 3 1
5 3 2
6 4 2
7 4 3
8 5 3
9 5 4

W tej części dzisiejszego wpisu na blogu omówiono sposób instalacji Kubernetes na węzłach z systemem Ubuntu w ramach wdrażania klastra Kubernetes o wysokiej dostępności (HA), serwera proxy HA oraz kilku węzłów roboczych. W poniższej tabeli można zobaczyć adresy IP, nazwy hostów i role hostów użytych do zainstalowania klastra Kubernetes HA na węzłach Ubuntu w laboratorium testowym opisanym w tym przykładzie.

Nr Rola węzła Adres IP Nazwa hosta
1 Master 192.168.101.21 docker-nakivo21
2 Master 192.168.101.22 docker-nakivo22
3 Master 192.168.101.23 docker-nakivo23
4 HA Proxy 192.168.101.19 ha-proxy19
5 Worker 192.168.101.31 docker-nakivo31
6 Worker 192.168.101.32 docker-nakivo32

Niektóre polecenia są takie same jak podczas instalacji Kubernetes na Ubuntu przy użyciu modelu z jednym węzłem głównym. Z tego powodu komentarze do niektórych poleceń nie są powtarzane. Możesz przewinąć tę stronę w górę, aby przypomnieć sobie objaśnienia poleceń.

Przygotuj wszystkie maszyny (proxy HA, węzły główne i węzły robocze) do instalacji Kubernetes, wykonując następujące czynności:

  • Skonfiguruj statyczne adresy IP.
  • Ustaw nazwy hostów. Nazwy wszystkich hostów muszą być rozpoznane jako adresy IP.
  • Dostęp SSH musi być włączony i skonfigurowany przy użyciu certyfikatów.
  • Pamięć wymiany musi być wyłączona.

Te kroki należy wykonać przed rozpoczęciem instalacji Docker na każdej maszynie, podobnie jak w sekcji powyżej, gdzie wyjaśniono instalację Kubernetes na Ubuntu przy użyciu jednego węzła głównego. Po przygotowaniu wszystkich maszyn przejdź do ( 192.168.101.19 ).

Konfiguracja modułu równoważenia obciążenia HA Proxy

Moduł równoważenia obciążenia HA Proxy służy do rozdzielania ruchu przychodzącego między węzłami Kubernetes. Moduł ten jest wdrażany przed węzłami głównymi. Otwórz konsolę maszyny ha-proxy19 i wykonaj czynności przedstawione poniżej.

Zainstaluj cfssl

Cfssl (Cloud Flare SSL) to zestaw narzędzi służący do generowania różnych certyfikatów, w tym łańcuchów certyfikatów TLS/SSL.

Pobierz pliki binarne z oficjalnego repozytorium.

# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64

# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64

Nadaj plikom binarnym uprawnienia do wykonywania.

# chmod +x cfssl*

Przenieś te pliki binarne do /usr/local/bin/

# mv cfssl_linux-amd64 /usr/local/bin/cfssl

# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

Sprawdź instalację, sprawdzając wersję zainstalowanego cfssl.

# cfssl version

Zaktualizuj drzewo repozytorium.

# apt-get update

Zainstaluj HA proxy.

# apt-get install haproxy

Utwórz i edytuj plik haproxy.cfg .

# vim /etc/haproxy/haproxy.cfg

Dodaj te linie na końcu tego pliku konfiguracyjnego.

frontend kubernetes

bind 192.168.101.19:6443

option tcplog

mode tcp

default_backend kubernetes-master-nodes

backend kubernetes-master-nodes

mode tcp

balance roundrobin

option tcp-check

server docker-nakivo21 192.168.101.21:6443 check fall 3 rise 2

server docker-nakivo22 192.168.101.22:6443 check fall 3 rise 2

server docker-nakivo23 192.168.101.23:6443 check fall 3 rise 2

Installing HA proxy for Kubernetes on Ubuntu – editing the haproxy.cfg file

Uruchom ponownie usługę.

# systemctl restart haproxy

Wygeneruj certyfikaty TSL

Możesz nadal korzystać z konsoli maszyny proxy HA. Utwórz plik konfiguracyjny urzędu certyfikacji o nazwie ca-config.json .

# vim ca-config.json

Dodaj następującą treść do tego pliku konfiguracyjnego:

{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": ["signing", "key encipherment", "server auth", "client auth"],
"expiry": "8760h"
}
}
}
}

Utwórz plik konfiguracyjny żądania podpisania przez urząd certyfikacji.

# vim ca-csr.json

Dodaj do tego pliku treść pokazaną poniżej:

{
„CN”: „Kubernetes”,
„key”: {
„algo”: „rsa”,
„size”: 2048
},
„names”: [
{
„C”: „GB”,
„L”: „London”,
„O”: „Kubernetes”,
„OU”: „CA”,
„ST”: „Nakivo”
}
]
}

Gdzie:

C – kraj, na przykład GB (Wielka Brytania).

L – lokalizacja, taka jak miasto lub miejscowość.

O – organizacja.

OU – jednostka organizacyjna (na przykład dział zdefiniowany jako właściciel klucza).

ST – stan lub prowincja.

Teraz wygeneruj klucz publiczny i prywatny.

# cfssl gencert -initca ca-csr.json | cfssljson -bare ca

Sprawdź, czy klucze ca-key.pem oraz ca.pem zostały wygenerowane.

# ls -al

Tworzenie certyfikatu dla klastra Etcd

Etcd obsługuje komunikację między serwerami/klastrami przy użyciu uwierzytelniania za pomocą certyfikatów klienckich. Powinieneś posiadać certyfikat CA oraz podpisaną parę kluczy dla jednego z członków klastra.

Utwórz plik konfiguracyjny żądania podpisania certyfikatu.

# vim kubernetes-csr.json

{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "GB",
"L": "London",
"O": "Kubernetes",
"OU": "Kubernetes",
"ST": "Nakivo"
}
]
}

Następnie wygeneruj certyfikat i klucz prywatny.

# cfssl gencert

-ca=ca.pem

-ca-key=ca-key.pem

-config=ca-config.json

-hostname=192.168.101.21,192.168.101.22,192.168.101.23,192.168.101.19,127.0.0.1,kubernetes.default

-profile=kubernetes kubernetes-csr.json |

cfssljson -bare kubernetes

Generating the certificate and private key for the etcd cluster

Wyświetl listę plików w katalogu, aby sprawdzić, czy kubernetes-key.pem oraz kubernetes.pem zostały wygenerowane.

# ls -al

Skopiuj utworzony certyfikat do każdego węzła. # scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.21:~

# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.22:~

# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.23:~

# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.31:~

# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.32:~

# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.33:~

Gdzie ~ to katalog domowy użytkownika kubernetes-user na hostach z systemem Ubuntu.

Installing Kubernetes on Ubuntu in the HA mode – copying a certificate to each Ubuntu node

Przygotowanie węzłów Ubuntu do instalacji Kubernetes

Uruchom polecenia przedstawione w tej sekcji na wszystkich węzłach głównych i roboczych. Zainstaluj Docker, a następnie zainstaluj Kubernetes na maszynach z systemem Ubuntu, które zostaną włączone do klastra Kubernetes. Zacznijmy od przygotowania 192.168.101.21 węzła głównego.

Zainstaluj Docker.

# apt-get install apt-transport-https ca-certificates curl software-properties-common

# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

# apt-get update

# apt-get install docker-ce

Docker jest teraz zainstalowany. Cubeadm, kublet i cubectl to komponenty Kubernetes wymagane do zainstalowania Kubernetes na Ubuntu.

Zainstaluj komponenty Kubernetes — kubeadm, kubelet i kubectl.

# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

# echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list

# apt-get update

# apt-get install -y kubelet kubeadm kubectl

Po przygotowaniu wszystkich węzłów i zainstalowaniu Docker, kubelet, kubeadm oraz kubectl należy zainstalować i skonfigurować etcd na węzłach głównych.

Instalacja i konfiguracja etcd na węzłach głównych Ubuntu

Etcd to spójny i wysoce dostępny magazyn przeznaczony do przechowywania kluczy oraz wykonania kopii zapasowej wszystkich danych klastra. Klaster etcd musi zostać skonfigurowany przed skonfigurowaniem klastra HA Kubernetes z wieloma węzłami master. Zacznijmy od skonfigurowania 192.168.101.21 węzła master.

Installing and configuring etcd on the 192.168.101.21 machine.

Utwórz katalog konfiguracyjny dla etcd.

# mkdir /etc/etcd /var/lib/etcd

Przejdź do katalogu, do którego skopiowano certyfikaty. Jest to katalog domowy użytkownika kubernetes, w tym przypadku – /home/kubernetes-user/

Skopiuj certyfikaty do katalogu konfiguracyjnego etcd.

# cp ca.pem kubernetes.pem kubernetes-key.pem /etc/etcd

Sprawdź, czy pliki zostały skopiowane.

# ls -al /etc/etcd

Wróć do poprzedniego katalogu

# cd -

Pobierz pliki binarne etcd z repozytorium.

# wget https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz

Rozpakuj archiwum etcd.

# tar xvzf etcd-v3.3.9-linux-amd64.tar.gz

Teraz przenieś pliki binarne etcd do /usr/local/bin/

# mv etcd-v3.3.9-linux-amd64/etcd* /usr/local/bin/

Utwórz plik jednostki systemd dla etcd.

# vim /etc/systemd/system/etcd.service

Dodaj do tego pliku poniższe ciągi znaków.

[Unit]

Description=etcd

Documentation=https://github.com/coreos

[Service]

ExecStart=/usr/local/bin/etcd

--name 192.168.101.21

--cert-file=/etc/etcd/kubernetes.pem

--key-file=/etc/etcd/kubernetes-key.pem

--peer-cert-file=/etc/etcd/kubernetes.pem

--peer-key-file=/etc/etcd/kubernetes-key.pem

--trusted-ca-file=/etc/etcd/ca.pem

--peer-trusted-ca-file=/etc/etcd/ca.pem

--peer-client-cert-auth

--client-cert-auth

--initial-advertise-peer-urls https://192.168.101.21:2380

--listen-peer-urls https://192.168.101.21:2380

--listen-client-urls https://192.168.101.21:2379,http://127.0.0.1:2379

--advertise-client-urls https://192.168.101.21:2379

--initial-cluster-token etcd-cluster-0

--initial-cluster 192.168.101.21=https://192.168.101.21:2380,192.168.101.22=https://192.168.101.22:2380,192.168.101.23=https://192.168.101.23:2380

--initial-cluster-state new

--data-dir=/var/lib/etcd

Restart=on-failure

RestartSec=5

[Install]

WantedBy=multi-user.target

Przeładuj konfigurację menedżera systemd, aby pobrał zmienione konfiguracje z systemu plików i ponownie wygenerował drzewa zależności.

# systemctl daemon-reload

Spraw, aby etcd uruchamiał się podczas startu systemu.

# systemctl enable etcd

Uruchom etcd. # systemctl start etcd

Wykonaj te same czynności na drugim węźle głównym ( docker-nakivo22 192.168.101.21 oraz docker-nakivo23 192.168.101.22 ). Jedyna różnica w czynnościach wymaganych dla tych węzłów głównych polega na edycji pliku konfiguracyjnego etcd.service . Należy zdefiniować prawidłowe adresy IP dla każdego z pozostałych węzłów głównych. Na przykład plik konfiguracyjny etcd.service musi wyglądać następująco dla drugiego węzła głównego ( 192.168.101.22 ) w bieżącym laboratorium testowym Kubernetes.

[Unit]

Description=etcd

Documentation=https://github.com/coreos

[Service]

ExecStart=/usr/local/bin/etcd

--name 192.168.101.22

--cert-file=/etc/etcd/kubernetes.pem

--key-file=/etc/etcd/kubernetes-key.pem

--peer-cert-file=/etc/etcd/kubernetes.pem

--peer-key-file=/etc/etcd/kubernetes-key.pem

--trusted-ca-file=/etc/etcd/ca.pem

--peer-trusted-ca-file=/etc/etcd/ca.pem

--peer-client-cert-auth

--client-cert-auth

--initial-advertise-peer-urls https://192.168.101.22:2380

--listen-peer-urls https://192.168.101.22:2380

--listen-client-urls https://192.168.101.22:2379,http://127.0.0.1:2379

--advertise-client-urls https://192.168.101.22:2379

--initial-cluster-token etcd-cluster-0

--initial-cluster 192.168.101.21=https://192.168.101.21:2380,192.168.101.22=https://192.168.101.22:2380,192.168.101.23=https://192.168.101.23:2380

--initial-cluster-state new

--data-dir=/var/lib/etcd

Restart=on-failure

RestartSec=5

[Install]

WantedBy=multi-user.target

Inicjalizacja węzłów głównych w klastrze Kubernetes HA

Teraz można zainicjować węzły główne w klastrze Kubernetes HA zainstalowanym na maszynach z systemem Ubuntu.

Inicjalizacja węzła głównego 192.168.101.21

Na pierwszym węźle głównym należy wykonać czynności opisane poniżej.

Utwórz plik konfiguracyjny yaml dla kubeadm.

# vim config.yaml

Dodaj parametry konfiguracyjne do tego pliku:

apiVersion: kubeadm.k8s.io/v1alpha3

kind: ClusterConfiguration

kubernetesVersion: stable

apiServerCertSANs:

- 192.168.101.19

controlPlaneEndpoint: "192.168.101.19:6443"

etcd:

external:

endpoints:

- https://192.168.101.21:2379

- https://192.168.101.22:2379

- https://192.168.101.23:2379

caFile: /etc/etcd/ca.pem

certFile: /etc/etcd/kubernetes.pem

keyFile: /etc/etcd/kubernetes-key.pem

networking:

podSubnet: 10.244.0.0/16

apiServerExtraArgs:

apiserver-count: "3"

Sieć zdefiniowana jako podSubnet (10.244.0.0/16) musi być taka sama jak w kube-flannel.yml pliku.

Zainicjuj maszynę Ubuntu jako węzeł główny.

# kubeadm init --config=config.yaml

Czasami może pojawić się ostrzeżenie dotyczące starej wersji pliku konfiguracyjnego:

Twój plik konfiguracyjny używa przestarzałej specyfikacji API: „kubeadm.k8s.io/v1alpha3”. Użyj polecenia „kubeadm config migrate –old-config old.yaml –new-config new.yaml”, które zapisze nową, podobną specyfikację przy użyciu nowszej wersji API.

Zaktualizuj wersję pliku konfiguracyjnego za pomocą polecenia:

# kubeadm config migrate --old-config config.yaml --new-config config1.yaml

Kubeadm init – your configuration file uses a deprecated API spec.

Inny błąd może wystąpić podczas inicjalizacji węzła klastra Kubernetes z wieloma węzłami głównymi, jeśli etcd nie działa:

[ERROR ExternalEtcdVersion]: Pobierz https://192.168.101.21:2379/wersja: dial tcp 192.168.101.21:2379: connect: connection refused

Kubernetes kubeadm ERROR ExternalEtcdVersion

Sprawdź, czy etcd działa. Możesz uruchomić etcd ręcznie:

# systemctl start etcd

Po pomyślnej inicjalizacji węzła głównego w klastrze Kubernetes działającym na systemie Ubuntu otrzymasz następujący komunikat, tak jak pokazano na zrzucie ekranu. The first master node is initialized in the Kubernetes multi-node cluster.

Wynik pomyślnego wykonania tego polecenia zawiera wskazówkę, jak rozpocząć korzystanie z klastra, a także polecenia zawierające token i skrót certyfikatu potrzebne do dołączenia węzłów do klastra. Zapisz te ważne ciągi znaków, ponieważ wkrótce będą Ci potrzebne. Na zrzucie ekranu są one zaznaczone na żółto i powtórzone poniżej.

Możesz teraz dołączyć dowolną liczbę węzłów płaszczyzny sterowania, kopiując certyfikaty

i klucze kont usługowych na każdy węzeł, a następnie uruchamiając jako root:

kubeadm join 192.168.101.19:6443 --token sxm34y.p4rn4328vne0iihf

--discovery-token-ca-cert-hash sha256:bf3887f1565fcd48ff696da98a761ac1b70c6d38ba0ba3e4b1bf573000a302ca

--experimental-control-plane

Następnie możesz dołączyć dowolną liczbę węzłów roboczych, uruchamiając na każdym z nich jako root:

kubeadm join 192.168.101.19:6443 --token sxm34y.p4rn4328vne0iihf

--discovery-token-ca-cert-hash sha256:bf3887f1565fcd48ff696da98a761ac1b70c6d38ba0ba3e4b1bf573000a302ca

Uruchom polecenia, aby rozpocząć korzystanie z zainicjowanego węzła w klastrze.

# mkdir -p $HOME/.kube

# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# sudo chown $(id -u):$(id -g) $HOME/.kube/config

Sprawdź węzły dodane do klastra.

# kubectl get nodes

Installing Kubernetes on Ubuntu – the first master node is now added to Kubernetes HA cluster

Skopiuj certyfikaty do dwóch pozostałych węzłów głównych

# scp -r /etc/kubernetes/pki kubernetes-user@192.168.101.22:~

# scp -r /etc/kubernetes/pki kubernetes-user@192.168.101.23:~

Inicjowanie węzła głównego 192.168.101.22

Uruchom polecenia na drugim węźle głównym (192.168.101.22).

Usuń pliki apiserver.crt oraz apiserver.key znajdujące się w katalogu domowym (~) użytkownika kubernetes-user .

$ rm ~/pki/apiserver.*

Przenieś certyfikaty przechowywane w katalogu domowym do katalogu /etc/kubernetes/ .

$ sudo mv ~/pki /etc/kubernetes/

Utwórz plik konfiguracyjny yaml dla kubeadm.

# vim config.yaml

Zawartość tego pliku yaml jest taka sama jak dla pierwszego węzła głównego ( 192.168.101.21 ). Zobacz konfigurację inicjalizacji pierwszego węzła głównego powyżej. Możesz skopiować już utworzony plik używany na pierwszym węźle głównym klastra Kubernetes HA zainstalowanego na maszynach z systemem Ubuntu.

Zainicjuj drugi węzeł główny.

# kubeadm config migrate --old-config config.yaml --new-config config1.yaml

# kubeadm init --config=config1.yaml

Wynik jest taki sam, jak wynik wyświetlony po zainicjowaniu pierwszego węzła głównego w klastrze Kubernetes HA:

The second master node is initialized in the Kubernetes HA cluster running on Ubuntu machines.

Podobnie, wykonaj polecenia, aby rozpocząć korzystanie ze zainicjowanego węzła w klastrze.

# mkdir -p $HOME/.kube

# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# sudo chown $(id -u):$(id -g) $HOME/.kube/config

Sprawdź węzły dodane do klastra.

# kubectl get nodes

Kubectl get nodes – the second master node is added to the Kubernetes cluster running on Ubuntu machines.

Do klastra dodano dwa z trzech węzłów głównych. Pozostał jeszcze jeden węzeł główny do dodania.

Inicjalizacja trzeciego (192.168.101.23) węzła głównego

Powtórz te same kroki, które wykonałeś podczas inicjalizacji drugiego węzła (192.168.101.22) w klastrze. Nie zapomnij zanotować poleceń wraz z tokenami i skrótami służącymi do dodawania węzłów do klastra, które pojawiają się po zainicjowaniu węzła głównego.

Sprawdź, czy wszystkie trzy węzły główne zostały pomyślnie dodane do klastra.

# kubectl get nodes

Instalacja Flannel w celu usunięcia statusu NotReady węzłów głównych w Kubernetes

Zainstalujmy Flannel. W przeciwieństwie do pierwszego przykładu, w którym nauczyłeś się instalować Kubernetes na Ubuntu w celu utworzenia klastra z jednym węzłem głównym, w tym przykładzie Flannel zostanie zainstalowany przy użyciu pliku yaml.

Uruchom polecenie, aby zainstalować Flannel i naprawić NotReady status węzłów, który jest wyświetlany, ponieważ nie skonfigurowano jeszcze sieci nakładkowej. Utwórz plik kube-flannel.yaml za pomocą edytora tekstu vim, na przykład na pierwszym węźle głównym.

# kubectl apply -f kube-flannel.yml

Zapamiętaj adres podSubnet zdefiniowany w pliku config.yaml . Adres sieciowy musi być taki sam w pliku kube-flannel.yaml .

Sprawdź swoje węzły i ich status.

# kubectl get nodes

Kubectl get node – the NotReady status of master nodes has been fixed

Teraz wszystkie węzły główne działają poprawnie.

Dodawanie węzłów roboczych do klastra

Po zainicjowaniu wszystkich węzłów głównych możesz dodać węzły robocze do swojego klastra Kubernetes. Dodajmy pierwszy węzeł roboczy ( 192.168.101.31 ) do klastra HA Kubernetes wdrożonego na maszynach z systemem Ubuntu. Użyj polecenia wyświetlonego po zainicjowaniu węzłów głównych (polecenia zawierającego token i hash), aby węzeł roboczy dołączył do klastra. Uruchom polecenie na maszynie 192.168.101.31 .

# kubeadm join 192.168.101.19:6443 --token kxl1gf.6ddalutd60n0ez45

--discovery-token-ca-cert-hash sha256:bf3887f1565fcd48ff696da98a761ac1b70c6d38ba0ba3e4b1bf573000a302ca

Sprawdź węzły klastra Kubernetes HA, aby upewnić się, że węzeł roboczy został dodany. Teraz na liście węzłów możesz również zobaczyć maszynę proxy HA.

# kubectl get nodes

Installing Kubernetes cluster on Ubuntu machines is almost complete – more worker nodes can be added.

W podobny sposób dodaj inne węzły robocze do klastra Kubernetes High Availability zainstalowanego na maszynach z systemem Ubuntu. W zależności od potrzeb możesz w dowolnym momencie dodać więcej węzłów roboczych. Na tym kończy się dzisiejszy samouczek.

Wnioski

Wdrażanie Kubernetes na Ubuntu nie jest tak trudne, jak mogłoby się wydawać na pierwszy rzut oka. Wdrażanie klastra Kubernetes wymaga pewnego wysiłku, ale w rezultacie zyskujesz wiele korzyści, takich jak łatwiejsze, scentralizowane zarządzanie, wysoka skalowalność i równoważenie obciążenia. Najprostszym typem wdrażania Kubernetes jest wdrażanie z jednym serwerem głównym – należy zainstalować Kubernetes na węzłach Ubuntu, w tym na węzłach głównych i roboczych. Jeśli potrzebujesz bardziej niezawodnej infrastruktury do uruchamiania aplikacji kontenerowych, rozważ wdrażanie klastra Kubernetes z wieloma węzłami głównymi, znanego jako klaster Kubernetes o wysokiej dostępności. Tego typu wdrażanie Kubernetes eliminuje pojedynczy punkt awarii, a klaster może nadal funkcjonować nawet w przypadku awarii niektórych węzłów głównych.

W przypadku obu typów wdrażania musisz skonfigurować dostęp SSH, ustawić statyczne adresy IP i nazwy hostów, zainstalować Docker, wyłączyć korzystanie z partycji swap, a na koniec zainstalować komponenty Kubernetes, takie jak kubeadm, kubectl, kubelet, oraz skonfigurować Flannel do sieci nakładkowej. W przypadku wdrażania klastra Kubernetes HA musisz również skonfigurować proxy HA na samodzielnej maszynie, wygenerować certyfikaty i skonfigurować klaster etcd. Większość etapów konfiguracji Kubernetes, tworzenia wdrażania, a także uruchamiania podów można wykonać na dwa sposoby: ręcznie, uruchamiając polecenia udostępnione przez interfejs wiersza poleceń, oraz korzystając z plików konfiguracyjnych YAML. Korzystanie z plików YAML pozwala na tworzenie bardziej złożonych struktur i sprawia, że proces administracji jest wygodniejszy.

Kubernetes można zainstalować w systemie Ubuntu, działającym zarówno na maszynach fizycznych, jak i wirtualnych. Jeśli Kubernetes jest zainstalowany na maszynach wirtualnych działających w vSphere, można zapewnić dodatkową ochronę, korzystając z Klaster VMware High Availability z funkcją Fault Tolerance. Logika wdrażania Kubernetes omówiona w tym wpisie na blogu może być również wykorzystana do instalacji Kubernetes w innych dystrybucjach systemu Linux.

Wypróbuj NAKIVO Backup & Replication

Wypróbuj NAKIVO Backup & Replication

Skorzystaj z bezpłatnej wersji próbnej, aby poznać wszystkie funkcje rozwiązania w zakresie ochrony danych. 15 dni za darmo. Bez żadnych ograniczeń dotyczących funkcji ani pojemności. Nie trzeba podawać danych karty kredytowej.

People also read