
Kubernetes الملقب بـ k8s
هو نظام مفتوح المصدر لأتمتة نشر التطبيقات المعبأة في k8s
وتوسيع نطاقها وإدارتها. في هذه المقالة ، سأوضح لك كيفية إعداد مجموعة Kubernetes ونشر مجموعة Elasticsearch على AWS عليها. تعمل هذه الإعدادات أيضًا على GCE و Azure .
تكوين Kubernetes على AWS
للبدء ، احصل على حق الوصول المطلق إلى خدمات AWS التالية: S3 و EC2 و Route53 و IAM و VPC .
1. التثبيت: سأعرض تثبيت CLI لنظام التشغيل Linux. إذا كان لديك نظام تشغيل مختلف ، فاتبع الروابط أدناه للحصول على إرشادات التثبيت لنظام التشغيل الخاص بك.
أولاً ، قم بتعيين AWS CLI للوصول إلى AWS من خلال CLI. إذا كان لديك Python و pip بالفعل ، فقم بتشغيل الأمر:
pip install awscli --upgrade --user
ثم نستخدم Kops ، وهي أداة سطر أوامر تأخذنا خلال إعداد مجموعة مستوى الإنتاج K8S.
قم بتثبيت ثنائيات Kops مباشرة من جيثب.
wget -O kops https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64 chmod +x ./kops sudo mv ./kops /usr/local/bin/
أخيرًا ، نستخدم kubectl - CLI لإدارة مجموعة K8S (إذا كنت تستخدم عامل الميناء ، فهذا يشبه عامل الميناء CLI). يتم تثبيت الإصدار الأخير بواسطة الأمر:
wget -O kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl chmod +x ./kubectl sudo mv ./kubectl /usr/local/bin/kubectl
ملاحظة: يمكنك بدء مجموعة Kubernetes واتباع التعليمات الواردة في هذه المقالة على جهاز منزلي مع minikube .
2.إنشاء مستخدمي IAM: لإنشاء مجموعات في AWS ، سنقوم بإنشاء مستخدم IAM منفصل لـ kops
. بالنسبة إلى kops
بحاجة إلى حساب API. قم بإنشاء مستخدم وتكوين حساب من خلال واجهة مستخدم وحدة تحكم AWS . سيحتاج مستخدم kops
إلى إذن IAM التالي:
- AmazonEC2FullAccess
- AmazonRoute53FullAccess
- أمازون S3FullAccess
- IAMFullAccess
- أمازون VPCFullAccess

بدلاً من ذلك ، يمكنك القيام بالشيء نفسه من CLI من خلال تطبيق الأوامر التالية:
aws iam create-group --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/IAMFullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonVPCFullAccess --group-name kops aws iam create-user --user-name kops aws iam add-user-to-group --user-name kops --group-name kops aws iam create-access-key --user-name kops
لاحظ AccessKeyID
SecretAccessKey
و SecretAccessKey
في SecretAccessKey
.
تكوين AWS CLI لاستخدام حسابك مع aws configure
.
تأكد من أن المستخدم الذي أنشأته موجود في aws iam list-users
.
نقوم بتصدير حساب AWS كمتغيرات البيئة التالية بحيث يمكن لـ kops
استخدامها.
export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)
إذا كنت تستخدم Kops 1.6.2 أو أحدث ، فإن إعداد DNS اختياري. يمكنك إنشاء مجموعة القيل والقال. المتطلب الوحيد: يجب أن ينتهي اسم الكتلة بـ .k8s.local
.
إعداد DNS
إذا كنت قد استضفت نطاقك بالفعل من خلال AWS وتخطط لاستخدامه ، فلا يلزم فعل أي شيء. خيار آخر: إذا كنت تريد استخدام نطاق فرعي من نطاقك ، فقم بإنشاء منطقة استضافة عامة ثانية لهذا النطاق الفرعي. في هذا الدليل ، سنعمل مع منطقة استضافة خاصة. قم بتعيين المنطقة تحت أي اسم. استخدم هذا الاسم لإنشاء مجموعات Kubernetes. اقرأ المزيد حول إعداد DNS هنا .
3. إنشاء دلو S3: لحفظ حالة ومظهر مجموعة K8S الخاصة بنا ، تحتاج إلى إنشاء دلو S3 منفصل لـ kops
. سيصبح هذا الدلو مصدرًا للبيانات الموثوقة لمجموعة التكوين.
aws s3api create-bucket \ --bucket <your-unique-bucket-name> \ --region us-east-1
ملحوظة: إذا قمت بتشغيل الجرافة في منطقة أخرى بخلاف us-east-1
، بالإضافة إلى الإعداد - region
فانتقل إلى المنطقة المطلوبة وأضف LocationConstraint
إلى نفس المنطقة. يوضح ما يلي أمر إنشاء الجرافة في منطقة us-west-1
.
aws s3api create-bucket \ --bucket <your-unique-bucket-name> \ --region us-west-1 \ --create-bucket-configuration LocationConstraint=us-west-1
لتكوين التخزين لإصدارات دلو S3 للاسترداد ، استخدم الأمر التالي:
aws s3api put-bucket-versioning \ --bucket <your-unique-bucket-name> \ --versioning-configuration Status=Enabled
4. إنشاء أول مجموعة Kubernetes: لذا ، فأنت على استعداد لإنشاء مجموعتك الأولى! أولاً ، قم بإعداد متغيرات البيئة لتبسيط العملية. إذا تخطيت تكوين DNS (بعد الخطوة 2) ، قم بإضافة .k8s.local
إلى قيمة NAME
.
export NAME=myfirstcluster.example.com export KOPS_STATE_STORE=s3://your-bucket-name
لا تنس تتبع المناطق الإقليمية المتاحة لك. في هذا المثال ، سننشر مجموعة في منطقة us-east-2 .
aws ec2 describe-availability-zones --region us-east-2
إذا كنت تستخدم منطقة استضافة عامة ، فأنشئ كتلة باستخدام الأمر التالي:
kops create cluster \ --zones us-east-2c \ --node-count 3 \ ${NAME}
إذا كنت تستخدم منطقة استضافة خاصة ، فقم بما يلي:
kops create cluster \ --zones us-east-2c \ --node-count 3 \ --dns private ${NAME}
سيوفر لك هذا الأمر سجل تكوين نظام المجموعة K8S. يستغرق الأمر وقتًا لبدء المجموعة ، حيث إنها تنشئ آلات EC2 جديدة للعقد الرئيسية التابعة.
[ec2-user@ip-172-31-35-145 test]$ kops create cluster \ > --dns private \ > --zones us-east-2c \ > --node-count 3 \ > ${NAME} --yes I0306 09:45:29.636834 20628 create_cluster.go:439] Inferred --cloud=aws from zone "us-east-2c" I0306 09:45:29.637030 20628 create_cluster.go:971] Using SSH public key: /home/ec2-user/.ssh/id_rsa.pub I0306 09:45:29.850021 20628 subnets.go:184] Assigned CIDR 172.20.32.0/19 to subnet us-east-2c I0306 09:45:31.118837 20628 dns.go:92] Private DNS: skipping DNS validation I0306 09:45:46.986963 20628 executor.go:91] Tasks: 73 done / 73 total; 0 can run I0306 09:45:46.987101 20628 dns.go:153] Pre-creating DNS records I0306 09:45:47.668392 20628 update_cluster.go:248] Exporting kubecfg for cluster kops has set your kubectl context to k8s.appbase Cluster is starting. It should be ready in a few minutes.
فويلا! يجب أن تعمل مجموعة K8s بالفعل.
5. فحص الكتلة: جميع الحالات التي تم إنشاؤها بواسطة kops
موجودة في ASG (مجموعات التحجيم التلقائي) . في حالة الفشل ، يتم فحص مثيلات ASG وإعادة بنائها تلقائيًا.
لتغيير تكوين الكتلة ، قم بتشغيل الأمر التالي:
kops edit cluster ${NAME}
في كل مرة تقوم فيها بتغيير تكوين الكتلة ، ستحتاج إلى إنشاء كتلة عن طريق تشغيل الأمر التالي:
kops update cluster ${NAME} --yes
سترى شيئا مثل هذا.
[ec2-user@ip-172-31-35-145 examples]$ kops update cluster --yes Using cluster from kubectl context: k8s.appbase I0216 05:09:06.074467 2158 dns.go:92] Private DNS: skipping DNS validation I0216 05:09:07.699380 2158 executor.go:91] Tasks: 73 done / 73 total; 0 can run I0216 05:09:07.699486 2158 dns.go:153] Pre-creating DNS records I0216 05:09:07.961703 2158 update_cluster.go:248] Exporting kubecfg for cluster kops has set your kubectl context to k8s.appbase Cluster changes have been applied to the cloud.
تحقق من الكتلة.
kops validate cluster
تأكد من تشغيل نظام المجموعة.
Using cluster from kubectl context: k8s.appbase Validating cluster k8s.appbase INSTANCE GROUPS NAME ROLE MACHINETYPE MIN MAX SUBNETS master-us-east-2c Master t2.large 1 1 us-east-2c nodes Node t2.medium 3 3 us-east-2c NODE STATUS NAME ROLE READY ip-172-20-44-33.us-east-2.compute.internal master True ip-172-20-52-48.us-east-2.compute.internal node True ip-172-20-62-30.us-east-2.compute.internal node True ip-172-20-64-53.us-east-2.compute.internal node True Your cluster k8s.appbase is ready
تحقق من k8s الجديدة الخاصة بك!
من خلال مكالمة بسيطة إلى Kubernetes API ، يمكنك التحقق مما إذا كانت واجهة برمجة التطبيقات متصلة بالإنترنت وتستمع إليها. استخدم kubectl
للتحقق من العقد.
kubectl get nodes
سيعطي هذا معلومات حول العقد الخاصة بك وحالتها الحالية.
[ec2-user@ip-172-31-35-145 elasticsearch]$ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-172-20-44-33.us-east-2.compute.internal Ready master 1m v1.8.6 ip-172-20-52-48.us-east-2.compute.internal Ready node 3m v1.8.6 ip-172-20-62-30.us-east-2.compute.internal Ready node 2m v1.8.6 ip-172-20-64-53.us-east-2.compute.internal Ready node 4m v1.8.6
إن Kubernetes الفرعية عبارة عن تجريد يمثل مجموعة واحدة أو أكثر من حاويات التطبيق (مثل Docker) والعديد من الموارد المشتركة لهذه الحاويات. تحت تتكشف على العقدة. إذا كنت بحاجة إلى توسيع نطاق التطبيق ، فأضف العقد إلى K8S المنشور.
لمعرفة القرون المتاحة:
kubectl get pods
يسرد هذا الأمر المداخن المتاحة في الكتلة.
[ec2-user@ip-172-31-35-145 ~]$ kubectl get pods NAME READY STATUS RESTARTS AGE es-5967f5d99c-5vcpb 1/1 Running 0 3h es-5967f5d99c-cqk88 1/1 Running 0 3h es-5967f5d99c-lp789 1/1 Running 0 3h
نشر Elasticsearch في مجموعة K8S

إذا لم تكن على دراية بـ Kubernetes ، أوصي بتدريب k8s عبر الإنترنت .
في الوقت الحالي ، أنشأنا في مجموعة K8S: العقدة الرئيسية وعقدي وكيل. يتمثل دور العقدة الرئيسية في نقل أوامر النشر إلى التطبيقات التي يتم تشغيلها في منصات وكلاء العقد.
تعتبر عمليات نشر تطبيق K8S تعريفيًا ويتم تكوينها من خلال ملفات JSON / YAML. اختر وحدة تحكم بناءً على نوع التطبيق أو النظام الذي تقوم بنشره. نظرًا لأن Elasticsearch هو تطبيق رسمي ، فسنستخدم وحدة تحكم StatefulSet.
6. النشر من خلال StatefulSet. تدير StatefulSet القرون بناءً على مواصفات الحاويات المتطابقة. ويدير نشر مجموعة الموقد وتوسيع نطاقها ويضمن ترتيب وتفرد هذه الموقد. يسهّل جهاز التحكم StatefulSet أيضًا ربط التطبيق بالحجم المستمر ، وهو أمر مهم بالنسبة لـ Elasticsearch.
قم بإنشاء ملف يسمى es-stateful set. yaml
. سيحتوي على مواصفات Elasticsearch. لا تتردد في تغيير التكوين. للحصول على قائمة بمتغيرات البيئة التي يمكن تمريرها إلى صورة Elasticsearch الخاصة بك ، انظر هنا .
7. الخدمات: Service
Kubernetes - تجريد يحدد مجموعة من
المنطقية والوصول إليها. يساعد ذلك تطبيق الحاوية على تحديد تطبيق حاوية آخر أو مثيله الخاص في موقد مختلف.

LoadBalancer
هو نوع خاص من الخدمات يوفر LoadBalancer
للشبكات الخارجية ويوزع الحمل. سنستخدمه لإنشاء عنوان IP خارجي يمكن لأي شخص من خلاله الاتصال بمجموعة Elasticsearch. سنستخدم هذه الخدمة للعقد ES كطريقة لاكتشاف بعضنا البعض.
قم بإنشاء ملف يسمى es-svc.yaml
. قم بتحريره وتحديد خدمة موازن التحميل.
apiVersion: v1 #API Version of the resource kind: Service #Type of resource metadata: #Contains metadata of this resource. name: elasticsearch #Name of this resource labels: #Additional identifier to put on pods component: elasticsearch #puts component = elasticsearch spec: #Specifications of this resource type: LoadBalancer #type of service selector: #will distribute load on pods which component: elasticsearch #have label `component = elasticsearch` ports: #Port on which LoadBalancer will listen - name: http #Name given to port port: 9200 #Port number protocol: TCP #Protocol supported - name: transport #Name given to port port: 9300 #Port number protocol: TCP #Protocol supported
8. إنشاء تطبيق: هذا كل ما نحتاج إليه. انشر مجموعة Elasticsearch الخاصة بنا على K8S باستخدام الأوامر التالية.
kubectl create -f es-statefulset.yaml kubectl create -f es-svc.yaml
"إنشاء" هو أمر عالمي لإنشاء أي مورد في K8S.
سيتم إطلاق مجموعة العقد الثلاث (تذكر replicas = 3
في StatefulSet config؟).
يمكننا التحقق من قرون Elasticsearch باستخدام هذا الأمر:
kubectl get pods
[ec2-user@ip-172-31-35-145 test]$ kubectl get pods,svc,deployment NAME READY STATUS RESTARTS AGE es-0 1/1 Running 0 23m es-1 1/1 Running 0 17m es-2 1/1 Running 0 23m
9. اختبار مجموعة Elasticsearch: تحقق لمعرفة ما إذا تم تكوين Elasticsearch بشكل صحيح ويعمل. احصل على عنوان IP الخارجي للاتصال بـ Elasticsearch. سيكون موجودًا في خدمة LoadBalancer التي أنشأناها. استخدم الأمر التالي لوصف LoadBalancer :
kubectl describe service elasticsearch
[ec2-user@ip-172-31-35-145 examples]$ kubectl describe service elasticsearch Name: elasticsearch Namespace: default Labels: component=elasticsearch Annotations: <none> Selector: component=elasticsearch Type: LoadBalancer IP: 100.70.114.146 LoadBalancer Ingress: http://a4d0c157d212811e898430af47d23da1-952261901.us-east-2.elb.amazonaws.com Port: http 9200/TCP TargetPort: 9200/TCP NodePort: http 31358/TCP Endpoints: 100.96.4.28:9200 Port: transport 9300/TCP TargetPort: 9300/TCP NodePort: transport 31767/TCP Endpoints: 100.96.4.28:9300 Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal EnsuringLoadBalancer 1m service-controller Ensuring load balancer Normal EnsuredLoadBalancer 1m service-controller Ensured load balancer [ec2-user@ip-172-31-35-145 examples]$
لاحظ قيمة LoadBalancer Ingress
. افتح متصفحًا يحتوي على URI ورقم لاحقة للمنفذ الخارجي Elasticsearch: 9200
. سترى هذا:

يمكنك التحقق من وظائف عقد 9200/_cluster /health?pretty
بإضافة: 9200/_cluster /health?pretty
إلى عنوان IP الخارجي.

10. Kubernetes اختبار الشفاء: StatefulSets لديه القدرة على تخزين العدد المحدد من النسخ المتماثلة. بهذه الطريقة ، إذا سقطت الباطن ، ستبدأ StatefulSet بجزء فرعي جديد.
سنقوم باختباره عن طريق محاكاة الفشل (حذف جميع الكبسولات التي تعمل عليها مثيلات ES) لمعرفة ما إذا كان يمكن تجميع الكتلة ES تلقائيًا مع البيانات السليمة.

نظرًا لأن StatefulSet تدير موقدًا واحدًا في كل مرة ، يستغرق الأمر وقتًا لاستعادة جميع الحاويات.
نرى أنه بعد استعادة المداخن ، يتوفر لنا سجل مفهرس في الحالة قبل فشل ES.
الخطوات التالية الموصى بها
قبل استخدام هذه الإعدادات في الإنتاج ، يرجى ملاحظة:
- تكوين النسخ الاحتياطية. يساعد على استعادة البيانات المفقودة. هذه العملية مؤتمتة بشكل أفضل.
- إعداد التفويض. نريد حماية مجموعة Elasticsearch. سيوفر إعداد المصادقة أو التفويض الأساسي بناءً على رمز الوسائط الأمان.
- شهادات TLS. تكوين LetsEncrypt / موفري TLS الآخرين لشهادات تعيين المجال الشخصية لمجموعة ES الخاصة بنا وحماية جميع الطلبات المرسلة إليه.
على الرغم من أن المقالة ليست حول ذلك ، ولكن تعرف: Kubernetes يمكن أن تفعل كل هذا.
الأصل: نشر Elasticearch مع Kubernetes على AWS في 10 خطوات