Пријатељски увод у Кубернетес

Кубернетес је једна од најузбудљивијих технологија у свету ДевОпс ових дана. Привукао је велику пажњу током последњих неколико година. Разлог тренутне славе су моћни контејнери .

Доцкер Инц. је својим беспрекорним маркетингом невероватног производа донео контејнере на светло креча. Доцкер је поставио темеље широко распрострањене употребе контејнера, иако технологија контејнера то превазилази. Ипак, због Доцкера, употреба Линук контејнера постала је све распрострањенија, што је учврстило темеље мотора за оркестрацију контејнера.

Уђите у Кубернетес - развио га је Гоогле користећи дугогодишње искуство вођења инфраструктуре светске класе на милијардама контејнера. Кубернетес је био тренутни хит, а од ове године, Доцкер Инц. је спаковао Кубернетес као додатни механизам за оркестрацију заједно са Доцкер Свармом.

Од сада ће Кубернетес бити део заједнице Доцкер и Доцкер Ентерприсе Едитион. Звучи прилично цоол, ха? Најбоље од оба света спаковано заједно као један бинарни систем.

Преглед птичијег ока

Кубернетес, к8с или кубе је платформа отвореног кода која аутоматизује рад контејнера. Елиминише већину постојећих ручних процеса, који укључују примену, скалирање и управљање контејнерисаним апликацијама. Фуј! то је пуно посла.

Помоћу Кубернетес-а можете груписати групе хостова који покрећу контејнере. Кубернетес вам помаже да управљате тим кластерима. Ова јата могу се простирати кроз јавни, приватни и хибридни облак - и ко зна, свемир Светског рата једног дана.

Кубернетес је развио и дизајнирао инжењерски тим компаније Гоогле. Гоогле већ дуго доприноси технологији контејнера. Кубернетес је поред гласне употребе своје технологије контејнера и технологија која стоји иза Гоогле-ових понуда услуга у облаку.

Гоогле поставља више од 2 милијарде контејнера недељно. Све покреће интерна платформа под називом Борг (звучи више као неки вођ орка из Мордора, али не). Борг је био претходник Кубернетеса. Лекције које је Гоогле научио радећи са Боргом током година постале су водећа снага иза Кубернетеса.

Кубернетес чини све што је повезано са применом и управљањем контејнерским апликацијама радошћу. Кубернетес аутоматизује увођења, враћања и надгледа стање распоређених услуга. Ово спречава лоше представљање пре него што се ствари стварно покваре.

Поред тога, Кубернетес може скалирати услуге према горе или доле на основу коришћења, осигуравајући да покрећете само оно што вам треба кад год вам је потребно, где год вам је потребно. Као и контејнери, Кубернетес нам омогућава управљање кластерима, омогућавајући подешавање да се контролише верзијом и реплицира.

Ово је било из птичје перспективе, али не заустављајте се овде. Кубернетес има више него што се чини на први поглед (и зато ово прво пишем).

Како Кубернетес ради?

Кубернетес је веома сложен систем у поређењу са Доцкеровим решењем за оркестрацију, Доцкер Сварм. Да бисмо разумели како Кубернетес ради, морамо да разумемо његове основне концепте и принципе.

Жељена држава

Жељена држава је један од основних концепата Кубернетеса. Слободни сте да дефинишете стање за извршавање контејнера унутар Подова. Ако због неког квара контејнер престане да ради, Кубернетес поново ствара Под на основу линија жељеног стања.

Кубернетес стриктно осигурава да су сви контејнери који се покрећу преко кластера увек у жељеном стању. Ово спроводи Кубернетес Мастер који је део Кубернетесовог контролног нивоа. Можете користити kubectlкоји директно комуницира са кластером да бисте поставили или изменили жељено стање путем Кубернетес АПИ-ја.

Кубернетес објекти

Као што је дефинисано у Кубернетесовој документацији:

Кубернетесов објекат је „евиденција намере“ - чим направите објекат, Кубернетесов систем ће непрестано радити на томе да тај објекат постоји. Стварајући објекат, ефективно поручујете систему Кубернетес како желите да изгледа оптерећење вашег кластера; ово је жељено стање вашег кластера.

Стање ентитета у систему у било ком тренутку представља Кубернетес објекти. Кубернетес објекти такође делују као додатни слој апстракције преко интерфејса контејнера. Сада можете директно да комуницирате са примерцима Кубернетес објеката уместо да комуницирате са контејнерима. Основни Кубернетесови објекти су следећи:

  • Подје најмања јединица за распоређивање на чвору . То је група контејнера која мора да иде заједно. Често, али не нужно, махуна обично садржи један контејнер.
  • Услугакористи се за дефинисање логичког скупа махунаи сродне политике које се користе за њихов приступ.
  • Волумеје у основи директоријум доступан за све контејнере који се изводе у Под-у.
  • Простори именасу виртуелни кластери иза којих стоји физички кластер.

Постоји низ контролера које пружа Кубернетес. Ови контролери су засновани на основним Кубернетес објектима и пружају додатне функције. Кубернетес контролери укључују:

  • РеплицаСетосигурава да се одређени број Под реплика изводи у било ком тренутку.
  • Примена се користи за промену тренутног стања у жељено стање.
  • СтатефулСеткористи се да би се осигурала контрола над распоређивањем распореда и приступом волуменима итд.
  • ДаемонСеткористи се за покретање копије Под-а на свим чворовима кластера или на наведеним чворовима.
  • Посаокористи се за извршавање неког задатка и излазак након успешног завршетка посла или након одређеног временског периода.

Кубернетесов контролни авион

Кубернетес контролној равни ради на томе да садашње стање кластера одговара вашем жељено стање. Да би то урадио, Кубернетес аутоматски обавља разне задатке - на пример, покретање или поновно покретање контејнера, скалирање броја реплика дате апликације и још много тога.

Као што је дефинисано у Кубернетесовој документацији:

Разни делови Кубернетесове управљачке равни, као што су Кубернетес Мастер и кубелет процеси, управљају начином на који Кубернетес комуницира са вашим кластером. Контролна раван одржава евиденцију свих Кубернетес објеката у систему и покреће континуиране контролне петље за управљање стањем објекта. У било ком тренутку, контролне петље контролне равни ће реаговати на промене у кластеру и радити на томе да се стварно стање свих објеката у систему подудара са жељеним стањем које сте дефинисали.

Кубернетесова контролна раван врши задатак одржавања жељеног стања у кластеру. Снима стање објекта и непрекидно покреће контролну петљу да провери да ли се тренутно стање објекта подудара са жељеним стањем. Можете то сматрати владом која води државу.

Кубернетес Мастер

As a part of the Kubernetes Control Plane, the Kubernetes master works towards continuously maintaining the desired state throughout your cluster. The kubectl command is an interface to communicate with the cluster’s Kubernetes master through the Kubernetes API. Think of it as the police force responsible for maintaining law and order.

As defined in the Kubernetes Documentation:

The “master” refers to a collection of processes managing the cluster state. Typically these processes are all run on a single node in the cluster, and this node is also referred to as the master. The master can also be replicated for availability and redundancy.

The Kubernetes Master controls and coordinates all the nodes in the cluster with the help of three processes that run on one or more master nodes in the cluster. Each Kubernetes master in your cluster runs these three processes:

  1. kube-apiserver: the single point of management for the entire cluster. The API server implements a RESTful interface for communication with tools and libraries. The kubectl command directly interacts with the API server.
  2. kube-controller-manager: regulates the state of the cluster by managing the different kinds of controllers.
  3. kube-scheduler: schedules the workloads across the available nodes in the cluster.

Kubernetes Nodes

The Kubernetes nodes are basically worker machines (VMs, physical, bare metal servers, etc) in a cluster running your workloads. The nodes are controlled by Kubernetes master and are continuously monitored to maintain the desired state of the application. Previously they were known as minions (not the tiny hilarious yellow loyal army of Gru). Similar to the master, each Kubernetes node in your cluster runs two processes:

  1. kubelet is a communication interface between the node and the Kubernetes Master.
  2. kube-proxy is a network proxy that reflects services as defined in the Kubernetes API on each node. It can also perform simple TCP and UDP stream forwarding.

The Voting App

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

Након што изађете из дубоког зарона, можда бисте желели да се ухватите за Кубернетеса. Водите Кубернетеса у вожњу или пустите да вас повезе у лабораторијама Плаи витх Кубернетес.

Играјте се са Кубернетесом

Играјте се са Кубернетесом је лабораторијска веб локација коју је обезбедио Доцкер, а креирао је Туториус. Игра са Кубернетесом је игралиште ... лабс.плаи-витх-к8с.цом

Надам се да је овај чланак помогао у разумевању Кубернетеса. Волео бих да чујем о томе како користите Кубернетес у својим пројектима. Пљескајте ако је повећало ваше знање и помозите му да досегне више људи.