مقدمة ودية إلى Kubernetes

Kubernetes هي واحدة من أكثر التقنيات إثارة في عالم DevOps هذه الأيام. لقد جذبت الكثير من الاهتمام على مدى السنوات القليلة الماضية. سبب شهرتها اللحظية هو الحاويات العظيمة .

جلبت شركة Docker Inc. الحاويات إلى ضوء الجير من خلال تسويقها الخالي من العيوب لمنتج مذهل. وضع Docker الأساس للاستخدام الواسع النطاق للحاويات ، على الرغم من أن تقنية الحاويات أصبحت قديمة. لكن بسبب Docker ، أصبح استخدام حاويات Linux أكثر انتشارًا ، مما عزز الأساس لمحركات تنسيق الحاويات.

أدخل Kubernetes - التي طورتها Google باستخدام سنوات من الخبرة في تشغيل بنية تحتية عالمية المستوى على مليارات الحاويات. حققت Kubernetes نجاحًا فوريًا ، وبدءًا من هذا العام ، قامت شركة Docker Inc. بتعبئة Kubernetes كمحرك تنسيق إضافي إلى جانب Docker Swarm.

من الآن فصاعدًا ، سيكون Kubernetes جزءًا من مجتمع Docker و Docker Enterprise Edition. يبدو رائعًا ، أليس كذلك؟ تم تجميع أفضل ما في العالمين معًا في صورة ثنائية واحدة.

نظرة عامة على عين الطائر

Kubernetes أو k8s أو kube هي منصة مفتوحة المصدر تعمل على أتمتة عمليات الحاويات. إنه يلغي معظم العمليات اليدوية الحالية ، والتي تتضمن نشر التطبيقات المعبأة في حاويات وتوسيع نطاقها وإدارتها. تفو! هذا كثير من العمل.

باستخدام Kubernetes ، يمكنك تجميع مجموعات المضيفين الذين يشغلون الحاويات معًا. يساعدك Kubernetes في إدارة تلك المجموعات. يمكن لهذه المجموعات أن تمتد عبر السحب العامة والخاصة والهجينة - ومن يدري ، عالم Star War يومًا ما.

تم تطوير Kubernetes وتصميمه بواسطة الفريق الهندسي في Google. لطالما كانت Google مساهماً في تكنولوجيا الحاويات. إلى جانب كونها صريحة حول استخدامها لتكنولوجيا الحاويات ، فإن Kubernetes هي التكنولوجيا وراء عروض خدمات السحابة من Google.

تنشر Google أكثر من ملياري حاوية في الأسبوع. كلها مدعومة بمنصة داخلية تسمى بورغ (تبدو أكثر مثل بعض أمراء حرب الأورك من موردور ، لكن لا). كان بورغ سلف Kubernetes. أصبحت الدروس التي تعلمتها Google من خلال العمل مع Borg على مر السنين القوة الدافعة وراء Kubernetes.

يجعل Kubernetes كل شيء مرتبطًا بنشر وإدارة التطبيقات المعبأة في حاويات أمرًا ممتعًا. تعمل Kubernetes على أتمتة عمليات الطرح والتراجع ومراقبة حالة الخدمات المنشورة. هذا يمنع عمليات الطرح السيئة قبل أن تسوء الأمور بالفعل.

بالإضافة إلى ذلك ، يمكن لـ Kubernetes توسيع نطاق الخدمات أو خفضها بناءً على الاستخدام ، مما يضمن أنك تقوم بتشغيل ما تحتاجه فقط ، عندما تحتاج إليه ، وفي أي مكان تريده. مثل الحاويات ، يتيح لنا Kubernetes إدارة المجموعات ، مما يتيح التحكم في الإصدار وتكرار الإعداد.

كانت هذه نظرة عين الطير ، لكن لا تتوقف هنا. هناك ما هو أكثر من Kubernetes مما تراه العين (وهذا هو السبب في أنني أكتب هذا في المقام الأول).

كيف يعمل نظام Kubernetes؟

Kubernetes هو نظام معقد للغاية بالمقارنة مع حل Docker للتناغم ، Docker Swarm. لفهم كيفية عمل Kubernetes ، نحتاج إلى فهم المفاهيم والمبادئ الأساسية.

الحالة المرغوبة

الحالة المرغوبة هي أحد المفاهيم الأساسية لـ Kubernetes. أنت حر في تحديد حالة تنفيذ الحاويات داخل السنفات. إذا توقفت الحاوية عن العمل بسبب بعض الإخفاق ، يقوم Kubernetes بإعادة إنشاء Pod استنادًا إلى خطوط الحالة المطلوبة.

يضمن Kubernetes بصرامة أن تكون جميع الحاويات التي تعمل عبر المجموعة دائمًا في الحالة المطلوبة. يتم فرض ذلك بواسطة Kubernetes Master وهو جزء من Kubernetes Control Plane. يمكنك استخدام kubectlالذي يتفاعل مباشرة مع المجموعة لتعيين أو تعديل الحالة المطلوبة من خلال Kubernetes API.

كائنات Kubernetes

كما هو محدد في وثائق Kubernetes:

كائن Kubernetes هو "سجل نوايا" - بمجرد إنشاء الكائن ، سيعمل نظام Kubernetes باستمرار لضمان وجود هذا الكائن. من خلال إنشاء كائن ، فأنت تخبر نظام Kubernetes بشكل فعال بالشكل الذي تريد أن يبدو عليه حجم عمل المجموعة ؛ هذه هي الحالة المرغوبة لمجموعتك.

يتم تمثيل حالة الكيانات في النظام في أي نقطة زمنية معينة بواسطة كائنات Kubernetes. تعمل كائنات Kubernetes أيضًا كطبقة إضافية من التجريد على واجهة الحاوية. يمكنك الآن التفاعل مباشرة مع مثيلات كائنات Kubernetes بدلاً من التفاعل مع الحاويات. كائنات Kubernetes الأساسية هي كما يلي:

  • جرابهي أصغر وحدة قابلة للنشر على العقدة . إنها مجموعة من الحاويات التي يجب أن تعمل معًا. في كثير من الأحيان ، ولكن ليس بالضرورة ، تحتوي الحاوية عادة على حاوية واحدة.
  • الخدماتيستخدم لتحديد مجموعة منطقية من القرونوالسياسات ذات الصلة المستخدمة للوصول إليها.
  • الصوتهو في الأساس دليل يمكن الوصول إليه من جميع الحاويات التي تعمل في Pod.
  • مساحات الأسماءهي مجموعات افتراضية مدعومة من قبل الكتلة المادية.

هناك عدد من وحدات التحكم التي توفرها Kubernetes. تم بناء وحدات التحكم هذه على كائنات Kubernetes الأساسية وتوفر ميزات إضافية. تتضمن وحدات تحكم Kubernetes ما يلي:

  • مجموعة النسخ المتماثلةيضمن تشغيل عدد محدد من النسخ المتماثلة Pod في أي وقت محدد.
  • يُستخدم النشر لتغيير الحالة الحالية إلى الحالة المطلوبة.
  • جليليتم استخدامه لضمان التحكم في أمر النشر والوصول إلى وحدات التخزين ، إلخ.
  • مجموعة الشيطانيستخدم لتشغيل نسخة من Pod على جميع عقد الكتلة أو على عقد محددة.
  • مهنةيستخدم لأداء بعض المهام والخروج بعد الانتهاء بنجاح من عملهم أو بعد فترة زمنية معينة.

طائرة التحكم Kubernetes

تعمل لوحة التحكم Kubernetes على جعل الحالة الحالية للعنقود تتطابق مع الحالة التي تريدها. للقيام بذلك ، ينفذ Kubernetes مجموعة متنوعة من المهام تلقائيًا - على سبيل المثال ، بدء تشغيل الحاويات أو إعادة تشغيلها ، وتوسيع عدد النسخ المتماثلة لتطبيق معين ، وغير ذلك الكثير.

كما هو محدد في وثائق Kubernetes:

تتحكم الأجزاء المختلفة من Kubernetes Control Plane ، مثل Kubernetes Master و kubelet ، في كيفية تواصل Kubernetes مع مجموعتك. يحتفظ مستوى التحكم بسجل لجميع كائنات Kubernetes في النظام ، ويقوم بتشغيل حلقات تحكم مستمرة لإدارة حالة الكائن. في أي وقت ، ستستجيب حلقات التحكم في لوحة التحكم للتغييرات في الكتلة وتعمل على جعل الحالة الفعلية لجميع الكائنات في النظام تتطابق مع الحالة المرغوبة التي حددتها.

ينفذ مستوى التحكم Kubernetes مهمة الحفاظ على الحالة المطلوبة عبر المجموعة. يسجل حالة الكائن ويدير حلقة تحكم باستمرار للتحقق مما إذا كانت الحالة الحالية للكائن تطابق الحالة المطلوبة. يمكنك التفكير في الأمر على أنه الحكومة التي تدير الدولة.

سيد Kubernetes

كجزء من Kubernetes Control Plane ، يعمل خبير Kubernetes على الحفاظ باستمرار على الحالة المطلوبة في جميع أنحاء مجموعتك. و kubectlالأمر واجهة للتواصل مع Kubernetes سيد الكتلة من خلال API Kubernetes. فكر في الأمر على أنه قوة الشرطة المسؤولة عن الحفاظ على القانون والنظام.

كما هو محدد في وثائق Kubernetes:

يشير "السيد" إلى مجموعة من العمليات التي تدير حالة الكتلة. عادةً ما يتم تشغيل جميع هذه العمليات على عقدة واحدة في الكتلة ، ويشار إلى هذه العقدة أيضًا باسم العقدة الرئيسية. يمكن أيضًا نسخ المعلم الرئيسي للتوافر والتكرار.

و Kubernetes ماستر الضوابط والإحداثيات كافة العقد في الكتلة بمساعدة ثلاثة العمليات التي تعمل على واحد أو أكثر من العقد الرئيسي في الكتلة. يدير كل خبير 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

اللعب مع Kubernetes هو موقع مختبرات يوفره Docker وتم إنشاؤه بواسطة Tutorius. اللعب مع Kubernetes هو ملعب ... labs.play-with-k8s.com

آمل أن يكون هذا المقال قد ساعد في فهم Kubernetes. أود أن أسمع عن كيفية استخدامك لنظام Kubernetes في مشاريعك. صفق إذا زادت من معرفتك ، وساعدها في الوصول إلى المزيد من الناس.