Μια φιλική εισαγωγή στο Kubernetes

Το Kubernetes είναι μια από τις πιο συναρπαστικές τεχνολογίες στον κόσμο των DevOps αυτές τις μέρες. Έχει προσελκύσει πολλή προσοχή τα τελευταία χρόνια. Ο λόγος για τη στιγμιαία φήμη του είναι τα πανίσχυρα δοχεία .

Η Docker Inc. έφερε τα δοχεία στο ασβέστη με το άψογο μάρκετινγκ ενός καταπληκτικού προϊόντος. Η Docker έθεσε τα θεμέλια για την ευρεία χρήση των εμπορευματοκιβωτίων, παρόλο που η τεχνολογία εμπορευματοκιβωτίων ξεπερνά. Ωστόσο, λόγω του Docker, η χρήση κοντέινερ Linux έχει γίνει πιο διαδεδομένη, ενισχύοντας τα θεμέλια για μηχανές ενορχήστρωσης κοντέινερ.

Εισαγάγετε το Kubernetes - που αναπτύχθηκε από την Google χρησιμοποιώντας πολυετή εμπειρία στη διαχείριση υποδομής παγκόσμιας κλάσης σε δισεκατομμύρια εμπορευματοκιβώτια. Το Kubernetes ήταν ένα στιγμιαίο χτύπημα, και ξεκινώντας φέτος, η Docker Inc. έχει συσκευάσει το Kubernetes ως πρόσθετο κινητήρα ενορχήστρωσης μαζί με το Docker Swarm.

Από τώρα και στο εξής, το Kubernetes θα είναι μέρος της κοινότητας Docker και του Docker Enterprise Edition. Ακούγεται πολύ ωραίο, ε; Το καλύτερο και των δύο κόσμων συσκευάζεται μαζί ως ενιαίο δυαδικό.

Επισκόπηση του Bird's Eye

Το Kubernetes, k8s ή kube, είναι μια πλατφόρμα ανοιχτού κώδικα που αυτοματοποιεί τις λειτουργίες κοντέινερ. Εξαλείφει τις περισσότερες από τις υπάρχουσες μη αυτόματες διαδικασίες, οι οποίες περιλαμβάνουν την ανάπτυξη, κλιμάκωση και διαχείριση εφαρμογών σε κοντέινερ. Φτου! είναι πολλή δουλειά.

Με το Kubernetes, μπορείτε να ομαδοποιήσετε ομάδες κεντρικών υπολογιστών που εκτελούν κοντέινερ μαζί. Το Kubernetes σας βοηθά να διαχειριστείτε αυτές τις ομάδες. Αυτά τα σμήνη μπορούν να εκτείνονται στα δημόσια, ιδιωτικά και υβριδικά σύννεφα - και ποιος ξέρει, το σύμπαν του Star War μια μέρα.

Το Kubernetes αναπτύχθηκε και σχεδιάστηκε από την ομάδα μηχανικών της Google. Η Google έχει από καιρό συνεισφέρει στην τεχνολογία κοντέινερ. Εκτός από τη φωνή της σχετικά με τη χρήση της τεχνολογίας κοντέινερ, η Kubernetes είναι η τεχνολογία πίσω από τις υπηρεσίες cloud της Google.

Η Google αναπτύσσει περισσότερα από 2 δισεκατομμύρια κοντέινερ την εβδομάδα. Όλα τροφοδοτούνται από μια εσωτερική πλατφόρμα που ονομάζεται Borg (ακούγεται περισσότερο σαν κάποιος πολέμαρχος του Orc από το Mordor, αλλά όχι). Ο Borg ήταν ο προκάτοχος του Kubernetes. Τα μαθήματα που έμαθε η Google σε συνεργασία με τον Borg με την πάροδο των ετών έγινε η καθοδηγητική δύναμη πίσω από τον Kubernetes.

Το Kubernetes κάνει όλα όσα σχετίζονται με την ανάπτυξη και τη διαχείριση εφαρμογών σε κοντέινερ μια χαρά. Το Kubernetes αυτοματοποιεί την κυκλοφορία, την επαναφορά και παρακολουθεί την υγεία των αναπτυσσόμενων υπηρεσιών. Αυτό αποτρέπει την κακή διάθεση πριν τα πράγματα γίνουν πραγματικά άσχημα.

Επιπλέον, το Kubernetes μπορεί να αυξήσει ή να μειώσει τις υπηρεσίες με βάση τη χρήση, διασφαλίζοντας ότι εκτελείτε μόνο αυτό που χρειάζεστε, όταν το χρειάζεστε, όπου και αν το χρειάζεστε. Όπως τα εμπορευματοκιβώτια, το Kubernetes μας επιτρέπει να διαχειριζόμαστε συστάδες, επιτρέποντας την ρύθμιση να ελέγχεται και να επαναλαμβάνεται η έκδοση.

Αυτή ήταν μια πανοραμική θέα, αλλά μην σταματήσετε εδώ. Υπάρχουν περισσότερα για τον Kubernetes παρά το συναίσθημα (και γι 'αυτό το γράφω αρχικά).

Πώς λειτουργεί το Kubernetes;

Το Kubernetes είναι ένα πολύ περίπλοκο σύστημα σε σύγκριση με τη λύση ενορχήστρωσης του Docker, το Docker Swarm. Για να καταλάβουμε πώς λειτουργεί το Kubernetes, πρέπει να κατανοήσουμε τις βασικές έννοιες και αρχές του.

Το επιθυμητό κράτος

Η επιθυμητή κατάσταση είναι μια από τις βασικές έννοιες του Kubernetes. Είστε ελεύθεροι να ορίσετε μια κατάσταση για την εκτέλεση κοντέινερ μέσα σε Pods. Εάν, λόγω κάποιας αστοχίας, το κοντέινερ σταματήσει να λειτουργεί, το Kubernetes αναδημιουργεί το Pod με βάση τις γραμμές της επιθυμητής κατάστασης.

Το Kubernetes διασφαλίζει αυστηρά ότι όλα τα δοχεία που διατρέχουν το σύμπλεγμα βρίσκονται πάντα στην επιθυμητή κατάσταση. Αυτό επιβάλλεται από το Kubernetes Master το οποίο είναι μέρος του Kubernetes Control Plane. Μπορείτε να χρησιμοποιήσετε αυτό kubectlπου αλληλεπιδρά απευθείας με το σύμπλεγμα για να ορίσετε ή να τροποποιήσετε την επιθυμητή κατάσταση μέσω του API Kubernetes.

Αντικείμενα Kubernetes

Όπως ορίζεται στην τεκμηρίωση Kubernetes:

Ένα αντικείμενο Kubernetes είναι μια "εγγραφή πρόθεσης" - μόλις δημιουργήσετε το αντικείμενο, το σύστημα Kubernetes θα λειτουργεί συνεχώς για να διασφαλίσει ότι υπάρχει αντικείμενο. Δημιουργώντας ένα αντικείμενο, λέτε αποτελεσματικά στο σύστημα Kubernetes πώς θέλετε να μοιάζει ο φόρτος εργασίας του συμπλέγματος σας. αυτή είναι η επιθυμητή κατάσταση του συμπλέγματος σας.

Η κατάσταση των οντοτήτων στο σύστημα σε οποιαδήποτε δεδομένη χρονική στιγμή αντιπροσωπεύεται από τα αντικείμενα Kubernetes. Τα αντικείμενα Kubernetes λειτουργούν επίσης ως ένα επιπλέον επίπεδο αφαίρεσης πάνω από τη διεπαφή του κοντέινερ. Τώρα μπορείτε να αλληλεπιδράτε άμεσα με παρουσίες αντικειμένων Kubernetes αντί να αλληλεπιδράτε με κοντέινερ. Τα βασικά αντικείμενα Kubernetes έχουν ως εξής:

  • Φλούδαείναι η μικρότερη αναπτυσσόμενη μονάδα σε έναν Κόμβο . Είναι μια ομάδα εμπορευματοκιβωτίων που πρέπει να λειτουργούν μαζί. Πολύ συχνά, αλλά όχι απαραίτητα, ένα Pod περιέχει συνήθως ένα δοχείο.
  • Υπηρεσίαχρησιμοποιείται για τον ορισμό ενός λογικού συνόλου Podsκαι συναφείς πολιτικές που χρησιμοποιούνται για την πρόσβασή τους.
  • Ενταση ΗΧΟΥείναι ουσιαστικά ένας κατάλογος προσβάσιμος σε όλα τα κοντέινερ που εκτελούνται σε ένα Pod.
  • Χώροι ονομάτωνείναι εικονικές συστάδες που υποστηρίζονται από το φυσικό σύμπλεγμα.

Υπάρχει ένας αριθμός ελεγκτών που παρέχονται από την Kubernetes. Αυτοί οι ελεγκτές βασίζονται στα βασικά αντικείμενα Kubernetes και παρέχουν πρόσθετες δυνατότητες. Οι ελεγκτές Kubernetes περιλαμβάνουν:

  • Σετ ρεπλίκαςδιασφαλίζει ότι ένας καθορισμένος αριθμός αντιγράφων Pod εκτελείται ανά πάσα στιγμή.
  • Η ανάπτυξη χρησιμοποιείται για να αλλάξει την τρέχουσα κατάσταση στην επιθυμητή κατάσταση.
  • StatefulSetχρησιμοποιείται για να εξασφαλίσει τον έλεγχο της παραγγελίας ανάπτυξης και της πρόσβασης σε τόμους κ.λπ.
  • DaemonSetχρησιμοποιείται για την εκτέλεση ενός αντιγράφου Pod σε όλους τους κόμβους ενός συμπλέγματος ή σε καθορισμένους κόμβους.
  • Δουλειάχρησιμοποιείται για την εκτέλεση ορισμένων εργασιών και την έξοδο μετά την επιτυχή ολοκλήρωση της εργασίας τους ή μετά από μια δεδομένη χρονική περίοδο.

Επίπεδο ελέγχου Kubernetes

Το Kubernetes Control Plane λειτουργεί ώστε η τρέχουσα κατάσταση του συμπλέγματος να ταιριάζει με την επιθυμητή κατάσταση. Για να γίνει αυτό, το Kubernetes εκτελεί μια ποικιλία εργασιών αυτόματα - για παράδειγμα, εκκίνηση ή επανεκκίνηση κοντέινερ, κλιμάκωση του αριθμού των αντιγράφων μιας δεδομένης εφαρμογής και πολλά άλλα.

Όπως ορίζεται στην τεκμηρίωση Kubernetes:

Τα διάφορα μέρη του Kubernetes Control Plane, όπως οι διαδικασίες Kubernetes Master και kubelet , διέπουν τον τρόπο επικοινωνίας του Kubernetes με το σύμπλεγμα. Το Control Plane διατηρεί μια εγγραφή όλων των αντικειμένων Kubernetes στο σύστημα και εκτελεί συνεχείς βρόχους ελέγχου για τη διαχείριση της κατάστασης του αντικειμένου. Ανά πάσα στιγμή, οι βρόχοι ελέγχου του αεροπλάνου ελέγχου θα ανταποκριθούν σε αλλαγές στο σύμπλεγμα και θα λειτουργήσουν ώστε η πραγματική κατάσταση όλων των αντικειμένων στο σύστημα να ταιριάζει με την επιθυμητή κατάσταση που ορίσατε.

Το Kubernetes Control Plane εκτελεί το έργο της διατήρησης της επιθυμητής κατάστασης σε όλο το σύμπλεγμα. Καταγράφει την κατάσταση του αντικειμένου και εκτελεί συνεχώς έναν βρόχο ελέγχου για να ελέγξει εάν η τρέχουσα κατάσταση του αντικειμένου ταιριάζει με την επιθυμητή κατάσταση. Μπορείτε να το θεωρήσετε ως κυβέρνηση που διαχειρίζεται το κράτος.

Μάστερ Kubernetes

Ως μέρος του Kubernetes Control Plane, το Kubernetes master εργάζεται συνεχώς για τη διατήρηση της επιθυμητής κατάστασης σε όλο το σύμπλεγμα. Η kubectlεντολή είναι μια διεπαφή για επικοινωνία με τον κύριο Kubernetes του συμπλέγματος μέσω του API Kubernetes. Σκεφτείτε το ως την αστυνομική δύναμη που είναι υπεύθυνη για τη διατήρηση του νόμου και της τάξης.

Όπως ορίζεται στην τεκμηρίωση Kubernetes:

Το "master" αναφέρεται σε μια συλλογή διεργασιών που διαχειρίζονται την κατάσταση συμπλέγματος. Συνήθως αυτές οι διεργασίες εκτελούνται σε έναν μόνο κόμβο στο σύμπλεγμα και αυτός ο κόμβος αναφέρεται επίσης ως κύριος. Ο κύριος μπορεί επίσης να αναπαραχθεί για διαθεσιμότητα και απολύσεις.

Το Kubernetes Master ελέγχει και συντονίζει όλους τους κόμβους του συμπλέγματος με τη βοήθεια τριών διεργασιών που εκτελούνται σε έναν ή περισσότερους κύριους κόμβους στο σύμπλεγμα. Κάθε κύριο Kubernetes στο σύμπλεγμα εκτελεί αυτές τις τρεις διαδικασίες:

  1. kube-apiserver : το μοναδικό σημείο διαχείρισης για ολόκληρο το σύμπλεγμα. Ο διακομιστής API εφαρμόζει μια διεπαφή RESTful για επικοινωνία με εργαλεία και βιβλιοθήκες. Η kubectlεντολή αλληλεπιδρά απευθείας με τον διακομιστή API.
  2. kube-controller-manager : ρυθμίζει την κατάσταση του συμπλέγματος διαχειρίζοντας τα διαφορετικά είδη ελεγκτών.
  3. kube-scheduler : προγραμματίζει τους φόρτους εργασίας στους διαθέσιμους κόμβους του συμπλέγματος.

Κόμβοι Kubernetes

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

Αφού βγείτε από τη βαθιά κατάδυση, ίσως θα θέλατε επίσης να πάρετε τα χέρια σας στο Kubernetes. Πάρτε το Kubernetes για μια βόλτα ή αφήστε το για ένα, στα εργαστήρια Play with Kubernetes.

Παίξτε με το Kubernetes

Το Play with Kubernetes είναι ένας ιστότοπος εργαστηρίων που παρέχεται από τον Docker και δημιουργήθηκε από τον Tutorius. Το παιχνίδι με το Kubernetes είναι παιδική χαρά… labs.play-with-k8s.com

Ελπίζω ότι αυτό το άρθρο βοήθησε στην κατανόηση του Kubernetes. Θα ήθελα πολύ να μάθω πώς χρησιμοποιείτε το Kubernetes στα έργα σας. Χτυπήστε εάν αύξησε τις γνώσεις σας και βοηθήστε να προσεγγίσει περισσότερους ανθρώπους.