Prijateljski uvod u Kubernetes

Kubernetes je jedna od najuzbudljivijih tehnologija u svijetu DevOps ovih dana. Zadnjih nekoliko godina privukao je veliku pažnju. Razlog trenutne slave su moćni kontejneri .

Docker Inc. donio je spremnike na vapneno svjetlo svojim besprijekornim marketingom nevjerojatnog proizvoda. Docker je postavio temelje za široku upotrebu kontejnera, iako tehnologija kontejnera to zastarjuje. Ipak, zbog Dockera, upotreba Linux kontejnera postala je sve zastupljenija, što je učvrstilo temelje motora za orkestraciju spremnika.

Uđite u Kubernetes - razvio Google koristeći višegodišnje iskustvo upravljanja infrastrukturom svjetske klase na milijardama kontejnera. Kubernetes je trenutno hit, a od ove godine, Docker Inc. je Kubernetes spakirao kao dodatni mehanizam za orkestraciju zajedno s Docker Swarmom.

Od sada će Kubernetes biti dio zajednice Docker i Docker Enterprise Edition. Zvuči prilično cool, ha? Najbolje od oba svijeta spakirano zajedno u jednu binarnu datoteku.

Pregled ptičjeg oka

Kubernetes, k8s ili kube, platforma je otvorenog koda koja automatizira rad kontejnera. Eliminira većinu postojećih ručnih procesa, koji uključuju postavljanje, skaliranje i upravljanje kontejnerskim aplikacijama. Fuj! to je puno posla.

Pomoću Kubernetesa možete grupirati grupe domaćina koji izvode spremnike. Kubernetes vam pomaže u upravljanju tim klasterima. Te se skupine mogu proširiti na javni, privatni i hibridni oblak - i tko zna, svemir Ratova zvijezda jednog dana.

Kubernetes je razvio i dizajnirao inženjerski tim u Googleu. Google već dugo doprinosi tehnologiji kontejnera. Kubernetes, osim što govori o svojoj upotrebi tehnologije kontejnera, tehnologija je koja stoji iza Googleovih ponuda usluga u oblaku.

Google tjedno raspoređuje više od 2 milijarde spremnika. Sve pokreće interna platforma koja se zove Borg (zvuči više poput vođe Orka iz Mordora, ali ne). Borg je bio prethodnik Kubernetesa. Lekcije koje je Google surađivao s Borgom tijekom godina postale su vodilja Kubernetesa.

Kubernetes čini sve što je povezano s implementacijom i upravljanjem kontejnerskim aplikacijama radošću. Kubernetes automatizira uvođenja, vraćanja i nadgleda zdravstveno stanje implementiranih usluga. To sprječava loše uvođenje prije nego što se stvari stvarno pokvare.

Uz to, Kubernetes može povećavati ili smanjivati ​​usluge na temelju korištenja, osiguravajući da pokrećete samo ono što vam treba, kad god vam treba, gdje god vam treba. Kao i spremnici, Kubernetes nam omogućuje upravljanje klasterima, omogućujući postavljanje da se kontrolira i replicira.

Ovo je bio ptičji pogled, ali ne zaustavljajte se ovdje. Kubernetes ima više nego što se čini na prvi pogled (i zato ovo uopće pišem).

Kako Kubernetes djeluje?

Kubernetes je vrlo složen sustav u usporedbi s Dockerovim rješenjem za orkestraciju, Docker Swarm. Da bismo razumjeli kako Kubernetes djeluje, moramo razumjeti njegove temeljne koncepte i principe.

Željena država

Željeno stanje jedan je od temeljnih koncepata Kubernetesa. Možete slobodno definirati stanje za izvršavanje spremnika unutar Pods. Ako zbog nekog kvara spremnik prestane raditi, Kubernetes ponovno stvara Pod na temelju linija željenog stanja.

Kubernetes strogo osigurava da su svi spremnici koji se pokreću preko klastera uvijek u željenom stanju. To provodi Kubernetes Master koji je dio Kubernetes upravljačkog plana. Možete koristiti kubectlkoji izravno komunicira s klasterom da biste postavili ili izmijenili željeno stanje putem Kubernetes API-ja.

Kubernetesovi objekti

Kako je definirano u Kubernetesovoj dokumentaciji:

Kubernetes objekt je "zapis namjere" - čim stvorite objekt, Kubernetes sustav će neprestano raditi na osiguranju postojanja objekta. Stvarajući objekt, učinkovito kažete Kubernetesovom sustavu kako želite da izgleda opterećenje vašeg klastera; ovo je željeno stanje vašeg klastera.

Stanje entiteta u sustavu u bilo kojem trenutku predstavljaju Kubernetes objekti. Kubernetes objekti također djeluju kao dodatni sloj apstrakcije preko sučelja spremnika. Sada možete izravno komunicirati s primjercima Kubernetes objekata umjesto interakcije s spremnicima. Osnovni Kubernetesovi objekti su sljedeći:

  • Podje najmanja jedinica za raspoređivanje na čvoru . To je skupina kontejnera koja se mora trčati zajedno. Često, ali ne nužno, mahuna obično sadrži jedan spremnik.
  • Serviskoristi se za definiranje logičkog skupa mahunai povezane politike koje se koriste za njihov pristup.
  • Volumenje u stvari direktorij dostupan svim spremnicima koji se izvode u Podu.
  • Prostori imenasu virtualni klasteri iza kojih stoji fizički klaster.

Postoji niz upravljača koje pruža Kubernetes. Ovi kontroleri su izgrađeni na osnovnim Kubernetes objektima i pružaju dodatne značajke. Kubernetes kontroleri uključuju:

  • ReplicaSetosigurava da se određeni broj Pod replika izvodi u bilo kojem trenutku.
  • Primjena se koristi za promjenu trenutnog stanja u željeno stanje.
  • StatefulSetkoristi se za osiguravanje kontrole nad naručivanjem implementacije i pristupom volumenima itd.
  • DaemonSetkoristi se za pokretanje kopije Pod-a na svim čvorovima klastera ili na navedenim čvorovima.
  • Posaokoristi se za izvršavanje nekog zadatka i izlazak nakon uspješnog završetka posla ili nakon određenog vremenskog razdoblja.

Kubernetesova upravljačka ravnina

Kubernetes nadzorna ravnina radi da bi sadašnje stanje klastera odgovaraju Vašem željenog stanja. Da bi to učinio, Kubernetes automatski izvršava razne zadatke - na primjer, pokretanje ili ponovno pokretanje spremnika, skaliranje broja replika dane aplikacije i još mnogo toga.

Kako je definirano u Kubernetesovoj dokumentaciji:

Razni dijelovi Kubernetesove upravljačke ravnine, kao što su Kubernetes Master i kubelet procesi, upravljaju načinom na koji Kubernetes komunicira s vašim klasterom. Kontrolna ravnina održava evidenciju svih Kubernetes objekata u sustavu i izvodi kontinuirane kontrolne petlje za upravljanje stanjem objekta. U bilo kojem trenutku, kontrolne petlje kontrolne ravnine će reagirati na promjene u klasteru i raditi na tome da stvarno stanje svih objekata u sustavu odgovara željenom stanju koje ste definirali.

Kubernetesova upravljačka ravnina izvršava zadatak održavanja željenog stanja u klasteru. Snima stanje objekta i kontinuirano pokreće kontrolnu petlju kako bi provjerio odgovara li trenutno stanje objekta željenom stanju. Možete to smatrati Vladom koja vodi državu.

Majstor Kubernetes

Kao dio Kubernetesove upravljačke ravnine, Kubernetesov master radi na kontinuiranom održavanju željenog stanja u cijelom vašem klasteru. kubectlNaredba je sučelje za komunikaciju s klastera Kubernetes majstora kroz Kubernetes API-ja. Shvatite to kao policijsku silu koja je odgovorna za održavanje reda i mira.

Kako je definirano u Kubernetesovoj dokumentaciji:

"Glavni" odnosi se na zbirku procesa koji upravljaju stanjem klastera. Ti se procesi obično izvode na jednom čvoru u klasteru, a taj se čvor naziva i glavnim. Master se također može replicirati radi dostupnosti i suvišnosti.

U Kubernetes Master kontrolira i koordinira sve čvorove u klasteru uz pomoć tri procesa koji se pokreću na jedan ili više glavnih čvorova u klasteru. Svaki Kubernetesov master u vašem klasteru izvodi ova tri procesa:

  1. kube-apiserver : jedinstvena točka upravljanja cijelim klasterom. API poslužitelj implementira RESTful sučelje za komunikaciju s alatima i knjižnicama. kubectlNaredba izravno komunicira s API poslužitelja.
  2. kube-controller-manager : regulira stanje klastera upravljajući različitim vrstama kontrolera.
  3. kube-planer : raspoređuje radna opterećenja kroz dostupne čvorove u klasteru.

Čvorovi Kubernetesa

Čvorovi Kubernetes u osnovi su radni strojevi (VM-ovi, fizički, goli metalni poslužitelji, itd.) U klasteru koji pokreće vaše radne terete. Čvorove kontrolira Kubernetes master i kontinuirano ih nadgleda kako bi se održalo željeno stanje aplikacije. Prije su bili poznati kao službenici (a ne sićušna urnebesna žuta odana vojska Gru). Slično glavnom, svaki Kubernetesov čvor u vašoj klasteru izvodi dva procesa:

  1. kubelet je komunikacijsko sučelje između čvora i Kubernetes Master-a.
  2. kube-proxy je mrežni proxy koji odražava usluge kako su definirane u Kubernetes API-ju na svakom čvoru. Također može izvoditi jednostavno prosljeđivanje protoka TCP i UDP.

Aplikacija za glasanje

Let’s get you up to speed by actually running an application on Kubernetes. But, before you can move a step further in the amazing world of Kubernetes, first you’ll need to install and run Kubernetes locally. So, let’s start with that. Skip this if you have Kubernetes and MiniKube installed.

Installing Kubernetes

Kubernetes now comes out of the box with Docker Community Edition for version 17.12.+. In case you don’t have the Community Edition installed, you can download it here.

Installing MiniKube

To run Kubernetes locally you will need to install MiniKube. It creates a local VM and runs a single node cluster. Don’t even think of running your production cluster on it. It’s best used for development and testing purposes only.

The Single Node Cluster

To run a single node cluster, we just need to run the minikube start command. Voilà, a VM, a Cluster and Kubernetes are running.

$ minikube start Starting local Kubernetes v1.10.0 cluster... Starting VM... Getting VM IP address... Moving files into cluster... Setting up certs... Connecting to cluster... Setting up kubeconfig... Starting cluster components... Kubectl is now configured to use the cluster. Loading cached images from config file.

To verify that your setup was successful, run kubectl version to check for the Kubernetes version running on your machine.

$ kubectl version Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.1", GitCommit:"3a1c9449a956b6026f075fa3134ff92f7d55f812", GitTreeState:"clean", BuildDate:"2018-01-04T20:00:41Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"darwin/amd64"} Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:44:10Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

The Voting App Finally

Fast forward to the Voting App now that you have installed Kubernetes on your local machine. This is a simple application based on micro-services architecture, consisting of 5 simple services.

  1. Voting-App: Frontend of the application written in Python, used by users to cast their votes.
  2. Redis: In-memory database, used as intermediate storage.
  3. Worker: .Net service, used to fetch votes from Redis and store in Postgres database.
  4. DB: PostgreSQL database, used as database.
  5. Result-App: Frontend of the application written in Node.js, displays the voting results.

Git clone and cd into the voting app repo.

dockersamples/example-voting-app

example-voting-app — Example Docker Compose appgithub.com

The folder “k8s-specifications” contains the Kubernetes yaml specifications of the Voting App’s services. For each service it has two yaml files: a service file and a deployment file. The service file defines a logical set of pods and the policies around them. Below is the resulting service file from the voting app.

apiVersion: v1 kind: Service metadata: name: result spec: type: NodePort ports: - name: "result-service" port: 5001 targetPort: 80 nodePort: 31001 selector: app: result

A Deployment file is used to define the desired state of your application, such as the number of replicas that should be running at any given point of time. Below is the resulting deployment file from the voting app.

apiVersion: extensions/v1beta1 kind: Deployment metadata: name: result spec: replicas: 1 template: metadata: labels: app: result spec: containers: - image: dockersamples/examplevotingapp_result:before name: result

Time to create the service and deployment objects — piece of cake.

$ kubectl create -f k8s-specifications/ deployment "db" created service "db" created deployment "redis" created service "redis" created deployment "result" created service "result" created deployment "vote" created service "vote" created deployment "worker" created

There you go! Your app has successfully been deployed to the single node cluster, and you can list the running pods and services.

$ kubectl get pods NAME READY STATUS RESTARTS AGE db-86b99d968f-s5pv7 1/1 Running 0 1m redis-659469b86b-hrxqs 1/1 Running 0 1m result-59f4f867b8-cthvc 1/1 Running 0 1m vote-54f5f76b95-zgwrm 1/1 Running 0 1m worker-56578c48f8-h7zvs 1/1 Running 0 1m $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE db ClusterIP 10.109.241.59  5432/TCP 2m kubernetes ClusterIP 10.96.0.1  443/TCP 23m redis ClusterIP 10.102.242.148  6379/TCP 2m result NodePort 10.106.7.255  5001:31001/TCP 2m vote NodePort 10.103.28.96  5000:31000/TCP 2m

Behold the cats vs dogs war, which the cats always win. Cats are cute by design and their IDC attitude is a big win. But this is a discussion for another time.

Back to the moment, your voting app is exposed on port 30001, and the results app is exposed on port 31001. You can access it using localhost:port or, using the IP on which minikube is running, you can get that using minikube ip command.

Kubernetes Cheat Sheet

Since you all have shown a lot of patience going through these blocks of text, let me now present to you the Kubernetes Cheat Sheet (which could have been a whole new article in itself, but whatever!):

Minikube command:

# Start Minikube server $ minikube start # Get the Minikube IP $ minikube ip

Version Info:

$ kubectl version #Get kubectl version $ kubectl cluster-info #Get cluster info

Creating Objects:

$ kubectl create -f ./file.yml $ kubectl create -f ./file1.yml -f ./file2.yaml $ kubectl create -f ./dir $ kubectl create -f //www.fpaste.org/279276/48569091/raw/

Viewing and finding resources:

# List all services in the namespace $ kubectl get services # List all pods in all namespaces $ kubectl get pods --all-namespaces # List all pods in the namespace, with more details $ kubectl get pods -o wide # List a particular replication controller $ kubectl get rc  # List all pods with a label env=production $ kubectl get pods -l env=production

List services sorted by name:

$ kubectl get services --sort-by=.metadata.name

Modifying and Deleting resources:

$ kubectl label pods  new-label=awesome $ kubectl annotate pods  icon-url=//goo.gl/XXBTWq $ kubectl delete pod pingredis-XXXXX

Scaling up and down:

$ kubectl scale --replicas=3 deployment nginx

Interacting with running Pods:

$ kubectl logs  # Runs a tailf log output $ kubectl logs -f  # Run pod as interactive shell $ kubectl run -i --tty busybox --image=busybox -- sh # Attach to Running Container $ kubectl attach  -i # Forward port of Pod to your local machine $ kubectl port-forward   # Forward port to service $ kubectl port-forward   # Run command in existing pod (1 container case) $ kubectl exec  -- ls / # Run command in existing pod (multi-container case) $ kubectl exec  -c  -- ls /

DNS Lookups:

$ kubectl exec busybox -- nslookup kubernetes $ kubectl exec busybox -- nslookup kubernetes.default $ kubectl exec busybox -- nslookup kubernetes.default.svc.cluster.local

Create and expose a deployment:

$ kubectl run nginx --image=nginx:1.9.12 $ kubectl expose deployment nginx --port=80 --type=LoadBalancer

Summary

Kubernetes is super exciting, cool, and most likely the future of container orchestration. The tech is great, and it is worth investing your time in if you are interested in containers or simply a fan like me. Kubernetes is a very powerful container orchestration engine, it can be used to amplify cloud containerisation strategy as it is designed to automate deploying, scaling, and operating containers.

The sunny side is that Kubernetes readily integrates with any cloud portfolio, be it public, private, hybrid or multi-cloud. Cloud vendors like AWS and Google provide managed Kubernetes services like Elastic Container Service for Kubernetes (EKS) and Google Kubernetes Engine (GKE). The dark side is that Kubernetes is significantly more complex than Docker’s very own container orchestration engine Docker Swarm.

All the information here was just for wetting your feet. If you feel like taking a dive in the awesome Kubernetes ocean, here you go.

ramitsurana/awesome-kubernetes

awesome-kubernetes - A curated list for awesome kubernetes sources :ship::tada:github.com

After you emerge from the deep dive, you might as well want to get hands on Kubernetes. Take Kubernetes for a ride or let it take you for one, in the Play with Kubernetes labs.

Play with Kubernetes

Play with Kubernetes is a labs site provided by Docker and created by Tutorius. Play with Kubernetes is a playground…labs.play-with-k8s.com

I hope this article helped in the understanding of Kubernetes. I’d love to hear about how you use Kubernetes in your projects. Clap if it increased your knowledge, and help it reach more people.