- Kubernetes – orchestrátor kontejnerů (1) – schedulery vs. PaaS
- Kubernetes – orchestrátor kontejnerů (2) – instalace a první běžící kontejner
- Kubernetes – orchestrátor kontejnerů (3) – deployment aplikací, škálování a rollback
- Kubernetes – orchestrátor kontejnerů (4) – interní balancing a discovery služeb
- Kubernetes – orchestrátor kontejnerů (5) – přístup zvenku
Minule jsme srovnali Kubernetes s dalšími orchestrátory a platformami. Dnes už místo povídání systém nainstalujeme a spustíme si první kontejner.
Instalace pro naše zkoušení
Existuje mnoho způsobů jak Kubernetes nainstalovat – jak pro laboratorní tak pro produkční nasazení. Terraform (od firmy Hashicorp) je open sourcové řešení, které může rozjet Kubernetes unifikovaným způsobem nad vícero infrastrukturními prostředími jako je OpenStack, AWS nebo klasické vSphere virtualizace. Další možností jsou hotové předpisy pro configuration management nástroje jako je Ansible či Chef. Dá se také použít OpenStack Heat šablona nebo projekt OpenStack Magnum. Jednou z nejpříjemnějších metod je použití CoreOS, které se soustředí na jednoduché rozběhání Kubernetes už nějakou dobu. Právě kombinace CoreOS a Vagrant bude to, co použiji v této sérii článků. Stačí vám fyzický Linux stroj s VirtualBox a můžete začít.
Nejprve si stáhneme automatizační předpisy CoreOS pro Kubernetes
git clone https://github.com/coreos/coreos-kubernetes.git
UPDATE: Nemáte Linux stroj? Tady najdete variantu pro Vagrant fungující i ve Windows, ale nastavení je trochu jiné (na to přijdete).
https://github.com/pires/kubernetes-vagrant-coreos-cluster
Nakopírujte příkladový konfigurační soubor do config.rb.
cd coreos-kubernetes/multi-node/vagrant cp config.rb.sample config.rb
V tomto souboru upravíme námi požadovaný cluster. Budu chtít jeden kontroler, 3 “pracanty” a jednu VM s Etcd.
$update_channel="alpha" $controller_count=1 $controller_vm_memory=512 $worker_count=3 $worker_vm_memory=1024 $etcd_count=1 $etcd_vm_memory=512
Teď už stačí jen klasické:
vagrant up
Kromě vybudování VM s Kubernetes clusterem ještě budeme potřebovat CLI pro Kubernetes. Stáhněte ho, udělejte spustitelné a můžete ho například nakopírovat někam, kam vede cesta odkudkoli.
curl -O https://storage.googleapis.com/kubernetes-release/release/v1.2.2/bin/linux/amd64/kubectl chmod +x kubectl sudo mv kubectl /usr/local/bin/kubectl
Vagrant připravil i konfigurační soubory pro kubectl, takže vyzkoušejme, že je CLI schopno například vypsat členy Kubernetes clusteru.
$ export KUBECONFIG="${KUBECONFIG}:$(pwd)/kubeconfig"
$ kubectl get nodes
NAME STATUS AGE
172.17.4.101 Ready,SchedulingDisabled 52m
172.17.4.201 Ready 51m
172.17.4.202 Ready 52m
172.17.4.203 Ready 50m
Váš první běžící kontejner
Dnes se ještě nebudeme pouštět do bůh ví jakých podrobností, ale do základů se dáme. Spusťme si jeden kontejner (ve skutečnosti se toho stane trochu víc, ale buďte trpěliví).
$ kubectl run kontejner --image cloudsvet/byoc --port 3000 deployment "kontejner" created
Spustili jsme nejmodernější entitu v Kubernetes – “deployment”. Zkusme si ho vypsat.
$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kontejner 1 0 0 0 20s
Všimněte si, že jsou tam velmi zajímavé sloupečky. DESIRED ukazuje kolik instancí chceme mít, CURRENT kolik aktuálně máme (ano, Kubernetes se postará, aby to tak bylo). Sloupeček UP-TO-DATE může zavánět nějakým chytrým verzování (a tak to také je).
Kubernetes při svém rozhodování na jaký node co umístí nepracuje na úrovni kontejnerů, ale používá koncept podů. Jde o jeden (a pak je to stejné jako použití samotného kontejneru), ale i víc nodů (pak Kubernetes garantuje, že jsou neustále spolu a jde o nedělitelné uskupení). Proč mít víc kontejnerů v podu? Tak například se občas používá princip “sajdkáry”, tedy aplikace běží v jednom kontejneru a má vedle sebe svého neoddělitelného souseda, který se stará o provisioning nebo monitoring.
Vypišme si tedy pody.
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE NODE kontejner-3506078564-ptls4 1/1 Running 0 3m 172.17.4.203
Zkuste o něm zjistit víc detailů.
$ kubectl describe pod kontejner
Name: kontejner-3506078564-ptls4
Namespace: default
Node: 172.17.4.203/172.17.4.203
Start Time: Sat, 23 Apr 2016 01:02:16 -0700
Labels: pod-template-hash=3506078564,run=kontejner
Status: Running
IP: 10.2.49.2
Controllers: ReplicaSet/kontejner-3506078564
Containers:
kontejner:
Container ID: docker://b9acec853267371d7868b7bf1c36ba4c81e6132e22721f795b99d04d04046e4e
Image: cloudsvet/byoc
Image ID: docker://sha256:4b8e7e0e80a7313e138802085345fb9c370dae7c7dad9cf5c8f1380b1b8ca519
Port: 3000/TCP
QoS Tier:
memory: BestEffort
cpu: BestEffort
State: Running
Started: Sat, 23 Apr 2016 01:05:15 -0700
Ready: True
Restart Count: 0
Environment Variables:
Conditions:
Type Status
Ready True
Volumes:
default-token-u6ia4:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-u6ia4
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
5m 5m 1 {default-scheduler } Normal Scheduled Successfully assigned kontejner-3506078564-ptls4 to 172.17.4.203
4m 4m 1 {kubelet 172.17.4.203} spec.containers{kontejner} Normal Pulling pulling image "cloudsvet/byoc"
2m 2m 1 {kubelet 172.17.4.203} spec.containers{kontejner} Normal Pulled Successfully pulled image "cloudsvet/byoc"
2m 2m 1 {kubelet 172.17.4.203} spec.containers{kontejner} Normal Created Created container with docker id b9acec853267
2m 2m 1 {kubelet 172.17.4.203} spec.containers{kontejner} Normal Started Started container with docker id b9acec853267
Pro dnešek nám to stačí – deployment smažeme.
$ kubectl delete deployment kontejner deployment "kontejner" deleted
