Kubernetes byl představen v dřívějším článku „Začínáme s Kubernetes na Amazon Web Services (AWS). O Kubernetes se také hovořilo v jiném článku „Použití Kubernetes (K8s) na IBM Bluemix. Kubernetes lze pro účely vývoje nainstalovat na holý kov na téměř jakýkoli operační systém včetně Fedory, CentOS, Ubuntu a CoreOS.
Problém
Instalace Kubernetes na holý kov zahrnuje spuštění několika příkazů pro nastavení hlavního uzlu, pracovních uzlů, sítě podů atd.
Řešení
Kubernetes 1.4 představuje nový nástroj s názvem kubeadm pro bootstraping clusteru Kubernetes. kubeadm bootstraps cluster Kubernetes se dvěma příkazy. Po instalaci Docker, kubectl a kubelet lze hlavní uzel spustit pomocí kubeadm init a pracovní uzly přidané pomocí kubeadm join .
V tomto článku použijeme následující postup k instalaci a zavedení clusteru Kubernetes a následnému testování clusteru:
- Spusťte tři nové instance Ubuntu na Amazon EC2.
- Na všechny instance Ubuntu nainstalujte Docker, kubeadm, kubectl a kubelet.
- Z jedné z instancí Ubuntu inicializujte Kubernetes cluster Master pomocí následujícího příkazu:
kubeadm init
- Použijte zásady sítě Calico Pod kubeadm/calico.yaml .
- Připojte se k dalším dvěma instancím Ubuntu (uzlům) s master pomocí kubeadm join --token=
- Na hlavním serveru jsou tři uzly uvedeny s „kubectl get nodes“.
- Spusťte aplikaci na hlavním serveru:
kubectl -s http://localhost:8080 run nginx --image=nginx --replicas=3 --port=80
- Seznam podů:
kubectl get pods -o wide
- Odinstalujte cluster Kubernetes.
kubeadm reset
Tento článek má následující sekce:
- Nastavení prostředí
- Instalace Docker, kubeadm, kubectl a kubelet na každého hostitele
- Inicializace hlavního serveru
- Instalace sítě Calico Pod Network
- Připojování uzlů ke klastru
- Instalace ukázkové aplikace
- Odinstalace clusteru
- Omezení
- Další vývoj v kubeadm
- Závěr
Nastavení prostředí
kubeadm Tento nástroj vyžaduje následující počítače, na kterých běží jeden z Ubuntu 16.04+, HypriotOS v1.0.1+ nebo CentOS 7.
- Jeden počítač pro hlavní uzel
- Jeden nebo více počítačů pro pracovní uzly
Na každém z počítačů je vyžadováno alespoň 1 GB paměti RAM. Použili jsme tři stroje Ubuntu běžící na Amazon EC2 k zavedení clusteru s jedním hlavním uzlem a dvěma pracovními uzly. Tři počítače Ubuntu jsou zobrazeny na obrázku 1.
Obrázek 1: Stroje Ubuntu
Instalace Docker, kubeadm, kubectl a kubelet na každého hostitele
V této části nainstalujeme Docker, kubelet, kubectl a kubeadm na každý ze tří počítačů. Nainstalované součásti jsou popsány v tabulce 1.
Komponenta | Popis |
Docker | Běh kontejneru. Verze 1.11.2 je doporučená a v1.10.3 a v1.12.1 jsou také v pořádku. Vyžadováno na všech počítačích v clusteru. |
kubelet | Základní komponenta Kubernetes, která běží na všech počítačích v clusteru. Spouští kontejnery a moduly. Vyžadováno na všech počítačích v clusteru. |
kubectl | Nástroj příkazového řádku pro správu clusteru. Vyžadováno pouze na hlavním uzlu, ale užitečné, pokud je nainstalováno na všech uzlech. |
kubeadm | Nástroj pro zavedení clusteru. Vyžadováno na všech počítačích v clusteru. |
Tabulka 1: Komponenty k instalaci
Získejte veřejnou IP adresu každého ze tří počítačů a přihlaste se pomocí SSH:
ssh -i "docker.pem" [email protected] ssh -i "docker.pem" [email protected] ssh -i "docker.pem" [email protected]
Příkazy k instalaci binárních souborů musí být spuštěny jako root; proto nastavte uživatele na root.
sudo su -
Na každém z počítačů spusťte následující příkazy:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF > /etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF
První příkaz stáhne požadované balíčky pro Kubernetes, jak ukazuje výstup na obrázku 2.
Obrázek 2: Stahování balíčků pro Kubernetes
Příkaz 2 stáhne seznamy balíčků z repozitářů a aktualizuje je nejnovějšími verzemi balíčků.
apt-get update
Výstup je znázorněn na obrázku 3.
Obrázek 3: Aktualizace balíčků úložiště
Dále nainstalujte Docker:
# Install docker if you don't have it already. apt-get install -y docker.io
Docker se nainstaluje, jak je znázorněno na výstupu příkazu na obrázku 4.
Obrázek 4: Instalace Docker
A následně nainstalujte kubelet (základní komponenta Kubernetes), kubeadm (bootstrapping nástroj), kubectl (nástroj pro správu clusteru) a kubernetes-cni (síťový plugin):
apt-get install -y kubelet kubeadm kubectl kubernetes-cni
Výstup z předchozích příkazů je znázorněn na obrázku 5.
Obrázek 5: Instalace kubelet, kubeadm, kubectln a kubernetes-cni
Inicializace hlavního serveru
Dále inicializujte hlavní server, na kterém běží databáze etcd a server API. Kubelet spustí Pods pro spuštění těchto komponent. Spusťte následující příkaz, který automaticky zjistí adresy IP:
kubeadm init
Jak je znázorněno na výstupu příkazu, nejprve se provedou některé předletové kontroly k ověření stavu systému. Následně je vygenerován hlavní/tokenový token, který má být použit jako vzájemný ověřovací klíč pro pracovní uzly, které se chtějí připojit ke clusteru. Dále se vygeneruje klíč a certifikát certifikační autority podepsaný svým držitelem, který poskytne identitu každému z uzlů v klastru pro komunikaci s klienty. Pro API server je vytvořen klíč a certifikát API serveru pro komunikaci s klienty. A util/kubeconfig je vytvořen soubor pro připojení kubelet k serveru API a dalšímu util/kubeconfig je vytvořen soubor pro administraci. Následně je vytvořena konfigurace API klienta. Výstup z kubeadm init příkaz je znázorněn na obrázku 6.
Obrázek 6: Spuštění kubeadm init
Všechny součásti řídicí roviny jsou připraveny. První uzel je připraven a je provedeno testovací nasazení. Také se vytvoří základní doplňkové komponenty kube-discovery, kube-proxy a kube-dns, jak je znázorněno na výstupu příkazu na obrázku 7. Hlavní server Kubernetes se úspěšně inicializuje. Je vygenerován příkaz s následující syntaxí; musí být spuštěn na počítačích (uzlech), které se mají připojit ke clusteru.
kubeadm join -token=<token> <IP Address of the master node>
Předchozí příkaz musí být zkopírován a uchován pro následné použití na pracovních uzlech.
Obrázek 7: Hlavní inicializace Kubernetes
Ve výchozím nastavení nejsou hlavní uzly plánovatelné a lze je naplánovat pomocí „vyhrazené“ poskvrny. Hlavní uzel lze nastavit jako plánovatelný pomocí následujícího příkazu:
kubectl taint nodes --all dedicated-
kubeadm příkaz podporuje některé další možnosti (viz Tabulka 2), které jsme nemuseli použít, ale bylo možné je použít k přepsání výchozího příkazu.
Parametr příkazu | Popis | Výchozí |
--skip-preflight-checks | Přeskočí kontroly před výstupem | Provádějí se předletové kontroly |
--use-kubernetes-version | Nastaví verzi Kubernetes k použití | v1.5.1 |
--api-advertise-addresses | Příkaz kubeadm init auto detekuje a používá IP adresu výchozího síťového rozhraní a používá ji ke generování certifikátů pro server API. Tento konfigurační parametr lze použít k přepsání výchozího nastavení jednou nebo více IP adresami, na kterých má být server API ověřen. | Automatická detekce |
--api-external-dns-names | Tento konfigurační parametr lze použít k přepsání výchozího síťového rozhraní jedním nebo více názvy hostitelů, na kterých má být server API ověřen. Musí být použit pouze jeden z IP adres nebo externích DNS jmen. | |
--cloud-provider | Určuje poskytovatele cloudu. Cloud-manager podporuje „aws“, „azure“, „cloudstack“, „gce“, „mesos“, „openstack“, „ovirt“, „rackspace“ a „vsphere“. Konfigurace poskytovatele cloudu může být poskytnuta v souboru /etc/kubernetes/cloud-config. Použití cloudového poskytovatele má také výhodu v používání trvalých svazků a vyrovnávání zátěže. | Žádná automatická detekce poskytovatele cloudu |
--pod-network-cidr | Přiděluje rozsahy sítě (CIDR) každému uzlu a je užitečný pro určitá síťová řešení, včetně poskytovatelů Flannel a Cloud. | |
--service-cidr | Přepíše podsíť, kterou Kubernetes používá k přidělování IP adres podům. Soubor /etc/systemd/system/kubelet.service.d/10-kubeadm.conf musí být také upraven. | 10.96.0.0/12 |
--service-dns-domain | Přepíše příponu názvu DNS pro přiřazování služeb názvům DNS; má formát | cluster.local |
--token | Udává token, který se má použít pro vzájemnou autentizaci mezi hlavním serverem a uzly připojujícími se ke clusteru. | Automaticky generované |
Tabulka 2: Možnosti příkazu Kubeadm
Instalace sítě Calico Pod Network
Aby mohly Pody mezi sebou komunikovat, musí být nainstalován síťový doplněk Pod. Calico poskytuje instalační konfiguraci hostovanou na kubeadm ve formě ConfigMap na http://docs.projectcalico.org/master/getting-started/kubernetes/installation/hosted/kubeadm/calico.yaml, kterou v této části použijeme k instalaci sítě Pod. Spuštěním následujícího příkazu na hlavním uzlu nainstalujte síť pod:
kubectl apply -f http://docs.projectcalico.org/master/getting-started/ kubernetes/installation/hosted/kubeadm/calico.yaml
Případně si stáhněte calico.yaml a zkopírujte do hlavního uzlu:
scp -i "docker.pem" calico.yaml [email protected]:~
Následně spusťte následující příkaz:
kubectl apply -f calico.yaml
Calico a jeden uzel etcd cluster se nainstalují, jak je znázorněno na obrázku 8.
Obrázek 8: Instalace Calico Policy
Následně vypište všechny pody ve všech jmenných prostorech Kubernetes.
kubectl get pods --all-namespaces
kube-dns Modul musí být spuštěný, jak je uvedeno na obrázku 9.
Obrázek 9: Výpis podů ve všech jmenných prostorech
Připojování uzlů ke klastru
V této části připojíme pracovní uzly ke clusteru pomocí kubeadm join příkaz, který má následující syntaxi:
kubeadm join --token=<token> <master-ip>
Volitelně připojení kubeadm příkaz lze spustit pomocí --skip-preflight-checks možnost přeskočit předběžné ověření.
připojení ke kubeadm příkaz používá dodaný token ke komunikaci se serverem API a získává kořenový certifikát CA a vytváří pár lokálních klíčů. Následně je na API server odeslán požadavek na podpis certifikátu (CSR) k podepsání a místní kubelet je nakonfigurován pro připojení k API serveru.
Spusťte připojení ke kubeadm příkaz zkopírovaný z výstupu kubeadm init na každém z počítačů Ubuntu, které se mají připojit ke clusteru.
Nejprve se SSH přihlaste k instanci/instancím Ubuntu:
ssh -i "docker.pem" [email protected]
a
ssh -i "docker.pem" [email protected]
Následně spusťte kubeadm join příkaz. Nejprve se provedou některé předletové kontroly. Poskytnutý token je ověřen. Dále se používá zjišťování uzlů. Je vytvořen klient pro zjišťování informací o clusteru a informace jsou požadovány ze serveru API. Je přijat objekt informací o clusteru a podpis je ověřen pomocí daného tokenu. Informační podpis a obsah klastru jsou shledány platnými a zjišťování uzlu je dokončeno. Následně se provede bootstrapping uzlů, ve kterém jsou pro navázání spojení použity koncové body API https://10.0.0.129:6443. Následně je pomocí klienta API vytvořen požadavek na podepsání certifikátu (csr), aby se získal jedinečný certifikát pro uzel. Jakmile je ze serveru API přijat podepsaný certifikát, vygeneruje se konfigurační soubor kubelet. Zpráva „Node join Complete“ uvedená na obrázku 10 označuje, že se uzel připojil ke clusteru.
Obrázek 10: Připojení uzlu ke clusteru
Podobně spusťte stejný příkaz na druhém počítači Ubuntu. Druhý uzel se také připojí ke shluku, jak ukazuje výstup na obrázku 11.
Obrázek 11: Připojení druhého uzlu ke clusteru
Na hlavním uzlu spusťte následující příkaz pro zobrazení uzlů:
kubectl get nodes
Hlavní uzel a dva pracovní uzly by měly být uvedeny, jak je znázorněno na obrázku 12.
Obrázek 12: Výpis uzlů clusteru Kubernetes
Instalace ukázkové aplikace
Dále cluster otestujeme. Spuštěním následujícího příkazu spusťte nginx cluster podů sestávající ze tří replik:
kubectl -s http://localhost:8080 run nginx --image=nginx --replicas=3 --port=80
Seznam nasazení:
kubectl get deployments
Seznam modulů v celém clusteru:
kubectl get pods -o wide
Vystavte nasazení jako službu typu LoadBalancer :
kubectl expose deployment nginx --port=80 --type=LoadBalancer
Seznam služeb:
kubectl get services
Výstup z předchozích příkazů označuje nginx bylo vytvořeno nasazení a tři moduly běží napříč dvěma pracovními uzly v clusteru. Vytvoří se také služba s názvem „nginx“, jak je znázorněno na obrázku 13.
Obrázek 13: Spuštění clusteru nginx Pod
Zkopírujte IP clusteru služby. Spusťte příkaz curl pro vyvolání služby:
curl 10.0.0.99
Označení HTML ze služby získá výstup, jak je znázorněno na obrázku 14.
Obrázek 14: Vyvolání služby nginx
Odinstalace clusteru
Chcete-li odinstalovat cluster nainstalovaný kubeadm, spusťte následující příkaz:
kubeadm reset
Cluster se odinstaluje, jak je znázorněno na obrázku 15.
Obrázek 15: Odinstalace/resetování clusteru Kubernetes
Omezení
kubeadm má několik omezení a doporučuje se pouze pro vývojářské použití. Omezení kubeadm jsou následující;
- Podporováno je pouze několik OS:Ubuntu 16.04+, CentOS 7, HypriotOS v1.0.1+.
- Nevhodné pro produkční použití.
- Integrace poskytovatelů cloudu je experimentální.
- Vytvoří se klastr pouze s jedním hlavním serverem s jednou databází etcd. Vysoká dostupnost není podporována, což znamená, že hlavní server je jediným bodem selhání (SPOF).
- Funkce HostPort a HostIP nejsou podporovány.
- Některé další známé problémy při použití kubeadm s RHEL/CentOS 7 a VirtualBox.
Další vývoj v kubeadm
kubeadm je ve verzi alpha v Kubernetes v 1.5 a je v beta verzi od Kubernetes 1.6. Drobné opravy a vylepšení pokračují v kubeadm s každou novou verzí Kubernetes:
- S Kubernetes 1.7 se při upgradu z verze 1.6 na verzi 1.7 přepisují úpravy interních prostředků clusteru nainstalované pomocí kubeadm.
- V Kubernetes 1.8, výchozí token Bootstrap vytvořený pomocí kubeadm init se stane neplatným a bude odstraněn po 24 hodinách od vytvoření, aby se omezilo vystavení cenného pověření. připojení ke kubeadm příkaz deleguje bootstrapping TLS na samotný kubelet namísto reimplementace procesu. Bootstrap KubeConfig soubor je zapsán do /etc/kubernetes/bootstrap-kubelet-conf s připojit se ke kubeadm .
Závěr
V tomto článku jsme použili funkci nástroje kubeadm dostupnou od Kubernetes v1.4 k zavedení clusteru Kubernetes. Nejprve se nainstalují požadované binární soubory pro Docker, kubectl, kubelet a kubeadm. Následně kubeadm init příkaz se používá k inicializaci hlavního uzlu v clusteru. Nakonec připojení ke kubeadm příkaz se používá ke spojení pracovních uzlů s clusterem. Ukázka nginx je spuštěna aplikace pro testování clusteru.