لضمان موازنة التحميل وقابلية التوسع وزيادة تحمل الأخطاء ، يمكن استخدام الأدوات المساعدة - أوركسترا. من بينها ، خدمة Kubernetes تحظى بشعبية كبيرة الآن. أسهل طريقة لتجربتها في الممارسة العملية هي نشرها في السحابة ، وهو ما سنفعله اليوم.

ملاحظة: نواصل سلسلة منشورات الإصدارات الكاملة من المقالات من مجلة هاكر. هجاء وعلامات الترقيم للمؤلف المحفوظة.
توسيع AKS
نذهب إلى بوابة أزور ، انقر فوق "إنشاء مورد" وإيجاد خدمة تسمى خدمة Kubernetes.
اختر الاسم وبادئة DNS حسب ذوقك. يؤثر الاسم على كيفية وصولك إلى نظام المجموعة ، لكن البادئة تؤثر على عنوان FQDN الخاص به.

أرخص آلة افتراضية حاليا تكلف ما يزيد قليلا عن 30 دولارا في الشهر.
الخطوة الثانية هي إنشاء مدير خدمة. مدير الخدمة هو نوع من حساب الخدمة الذي يمكن بموجبه تنفيذ مهام محددة. الميزة هي أن حقوق مثل هذا الحساب يمكن أن تكون محدودة. بالإضافة إلى ذلك ، يمكنك إنشاء أي عدد من هذه الحسابات (في حين أن عدد الحسابات العادية محدود حسب الاشتراك). يمكنك العثور على الحسابات الرئيسية للخدمة التي تم إنشاؤها في Active Directory بين تسجيلات التطبيقات.

RBAC (التحكم في الوصول المستند إلى الأدوار) هو القدرة على تقييد أو توفير الوصول إلى موارد محددة (أو مجموعات الموارد). أي أنه يمكنك التمييز بين مستخدمي اشتراكك الذين لديهم حقوق الوصول وأيهم لا يتمتعون بذلك.

في الوقت الحالي ، تستغرق العملية حوالي 20 دقيقة ، لكن كل شيء قد يعتمد على التكوين.
ابحث عن أدلة رسمية باتباع الروابط
إنشاء كتلة AKS باستخدام المدخل
إنشاء كتلة AKS باستخدام CLI
للعمل ، نحتاج إلى سطر أوامر Azure - CLI (واجهة سطر الأوامر). يمكن تثبيته على حد سواء تحت ويندوز ، وتحت ماك أو لينكس. أنا شخصياً أفضل استخدام Azure Cloud Shell. هذا هو سطر الأوامر الذي يتم تشغيله من صفحة مدخل Azure التي تم تحميلها في المتصفح. للعمل ، فإنه يتطلب تخزين blob التي تم إنشاؤها. ستكون تكلفتها بضعة سنتات شهريًا ، وبالتالي أفضل ألا أقلق بشأن تثبيت CLI على سيارتي.
تدعم Kubernetes تقنيات الحاويات المختلفة ، ولكن دعونا ننظر إلى أكثرها شعبية - Docker. docker.hub يسمح لك بتخزين صورة واحدة لرسو السفن الخاصة مجانًا. إذا كنت بحاجة إلى المزيد ، يمكنك وضعها مقابل المال. ولكن مقابل المال ، يمكن وضع صورة عامل ميناء خاص في سجل حاوية أزور. تبدأ الأسعار الآن من 5 دولارات شهريًا (SKU).
لقد أنشأت خدمة ACR تحت اسم myservice. إذا قررت أيضًا استخدام ACR ، فعند إنشاء خدمة ، ستحتاج إلى الحصول على مفاتيحها.

بعد ذلك ، سيكون من الممكن تسجيل الدخول عن طريق تشغيل الأمر:
docker login myservice.azurecr.io
أدخل اسم المستخدم (myservice) وكلمة المرور المأخوذة من البوابة (PJSeyO9 = lCMRDI7dGkz68wjhFGRGxSY3)
الآن من خلال الانتقال إلى الدليل مع المشروع ، سيكون من الممكن بناء صورة أثناء وضع علامة عليها بالعلامة المطلوبة. وبعد ذلك أرسله إلى الخدمة السحابية:
docker build -t myservice.azurecr.io/myservice . docker push myservice.azurecr.io/myservice
أسرار ، أسرار ... نحن نقدم الوصول إلى الصورة وحفظ الإعدادات.
عند العمل مع AKS المنشورة ، تحتاج إلى الحصول على ائتماناته. خلاف ذلك ، لن يتم تنفيذ أوامر kubectl. للوصول إلى AKS ، يتم تنفيذ الأمر التالي:
az aks get-credentials --resource-group KubernetesGroup --name verycoolcluster
للوصول إلى صورة عامل النقل الموجود في مستودع عامل النقل في حاوية خاصة ، تحتاج إلى إنشاء سر. إذا كان لديك صورة عامة ، فيمكنك تخطي هذه الخطوة.
لإنشاء ملف سري ، يجب تشغيل أمر من النموذج التالي:
kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
إذا كانت صورتك في مستودع عامل الميناء ، فستكون قيمة <your-registry-server> https://index.docker.io/v1/
بالنسبة لـ Azure Container Registry ، ستكون FQDN <registry-name> .azurecr.io
بمعنى ، لإنشاء سر للحاوية في حالتي ، فعلت:
kubectl create secret docker-registry regcred --docker-server="myservice.azurecr.io" --docker-username="myservice" --docker-password="PJSeyO9=lCMRDI7dGkz68wjhFGRGxSY3" --docker-email="asommer@yandex.ru"
يمكنك الآن عرض محتويات الملف السري الذي تم إنشاؤه باستخدام الأمر:
kubectl get secret regcred --output=yaml
معلومات
إذا كنت تستخدم AKS ، فلا يمكنك إنشاء ملف سري ، ولكن يمكنك توفير الوصول إلى خدمة ACR إلى خدمة AKS بطريقة أخرى - عن طريق تنفيذ برنامج نصي خاص. يمكنك أخذها من الصفحة التالية:
المصادقة مع سجل حاوية أزور من خدمة أزور Kubernetes
#!/bin/bash AKS_RESOURCE_GROUP=KubernetesGroup AKS_CLUSTER_NAME=verycoolcluster ACR_RESOURCE_GROUP=MyACRGroup ACR_NAME=myservice # Get the id of the service principal configured for AKS CLIENT_ID=$(az aks show --resource-group $AKS_RESOURCE_GROUP --name $AKS_CLUSTER_NAME --query "servicePrincipalProfile.clientId" --output tsv) # Get the ACR registry resource id ACR_ID=$(az acr show --name $ACR_NAME --resource-group $ACR_RESOURCE_GROUP --query "id" --output tsv) # Create role assignment az role assignment create --assignee $CLIENT_ID --role Reader --scope $ACR_ID
يمكنك ببساطة تعديل قيم متغيرات AKS * و ACR * ، ثم نسخ البرنامج النصي ولصقه في Azure CLI أو Cloud Shell.
يحتوي Kubernetes على مخزن بيانات اعتماد آمن. أي أنه يمكنك إنشاء ملف بالإعدادات وسيكون الوصول إلى هذه الإعدادات من الخارج صعباً. يحتوي هذا الملف عادةً على سلاسل اتصال قاعدة البيانات ونوع من الاعتمادات. إذا لم يكن لديك مثل هذه المعلومات في التطبيق (هل هذا صحيح؟) ، فيمكنك تخطي هذه الخطوة.
لإنشاء ملف إعدادات من سطر الأوامر ، نحتاج أولاً إلى النظر في الأمر vi.
vi < >
سيقوم بإنشاء ملف إذا كان مفقودًا أو يفتح ملفًا موجودًا
من أجل حفظ التغييرات المدخلة ، اضغط ESC ثم ZZ
من أجل الخروج ببساطة دون حفظ ESC وبعد: ف!
وصف قصير جدًا ، لكن يجب أن يكون كافيًا. يمكنني أن أضيف أن مفتاح الإدراج يمكن أن يكون مفيدًا للغاية.
لذلك ، من خلال Azure Cloud Shell ، قم بإنشاء ملف باسم اعتباطي (على سبيل المثال ، appsettings.json) والمحتوى الذي تحتاجه. دعنا نعترف بهذا:
{ "ConnectionString": "some secret string goes there" }
وبعد تنفيذ الأمر:
kubectl create secret generic secret-appsettings --from-file=/home/youraccount/appsettings.json
سيخلق هذا الأمر سرًا بإعدادات تسمى تطبيقات سرية
يمكنك معرفة أي مسار لاستبدال / home / youraccount بأمر pwd
إنشاء النشر
عمليات النشر مخصصة لخدمات عديمي الجنسية. يصفون كيف سيتم إنشاء Pods و ReplicaSets وكيف سيتم تحديثها. Pod هي مجموعة من الحاويات (أو حاوية واحدة) تعمل في نفس البيئة. الغرض من ReplicaSet هو التحكم في إطلاق العدد المحدد من القرون وسيعمل باستمرار.
استنادًا إلى الملف الذي تم إنشاؤه مسبقًا ، أقوم بإنشاء ملف publish.yaml الذي سينشئ 3 ملفات فرعية يحتوي الملف على الكود التالي (أذكرك بأن المساحات في yaml مهمة جدًا):
apiVersion: apps/v1beta1 kind: Deployment metadata: name: mydeployment spec: replicas: 3 minReadySeconds: 10 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 template: metadata: labels: app: myapp spec: containers: - name: app image: myservice.azurecr.io/myservice:latest ports: - containerPort: 80 name: http protocol: TCP imagePullPolicy: Always env: - name: "ASPNETCORE_ENVIRONMENT" value: "Production" volumeMounts: - name: secrets mountPath: /app/secrets readOnly: true imagePullSecrets: - name: regcred volumes: - name: secrets secret: secretName: secret-appsettings
النظر في الرمز. تصف البداية عدد النسخ المتماثلة واستراتيجية التحديث. ثم يتم إعطاء النشر اسمًا (myapp) وتتم الإشارة إلى صورة الحاوية. المنافذ مسجلة. 80 هو المنفذ القياسي ل http. فيما يلي إعدادات بيئة ASP.NET Core. ثم تم تحميل أرصدة صورة عامل الميناء الخاص وإعدادات التطبيق السري التي أنشأناها مؤخرًا.
strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1
هذه القطعة هي المسؤولة عن عملية الترقية. maxSurge - عدد المرات التي تم إنشاؤها بما يزيد عن تلك الموجودة عند التحديث (بالوحدات أو النسبة المئوية). maxUnavailable - الحد الأقصى لعدد المرات التي قد تصبح غير متوفرة أثناء عملية التحديث.
يمكن إنشاء النشر باستخدام الأمر:
kubectl apply -f deploy.yaml
تلبية الدخول
لتوفير الوصول إلى خدمات الكتلة وتنظيم موازنة التحميل ، يتم استخدام خدمة تسمى ingress. حل شعبية إلى حد ما هو دخول على أساس nginx. أسهل طريقة لتثبيته هي استخدام مدير الحزم Kubernetes يسمى helm. ميزة Azure Cloud Shell هي أن القبعة مثبتة بالفعل فيها. ما زال يتعين القيام به لتثبيت nginx-ingress. أدخل:
helm init
انتظر قليلاً وقم بتنفيذ:
helm install stable/nginx-ingress --namespace kube-system --set rbac.create=false
إنشاء شهادات SSL باستخدام LetsEncrypt
نظرًا لأن شهادة طبقة المقابس الآمنة مرتبطة ببعض اسم المجال ، فسنقوم بتعيين اسم مورد DNS لدينا.
قم بتشغيل الأمر التالي واتخاذ IP الخارجي
kubectl get service -l app=nginx-ingress --namespace kube-system
استبدل IP والاسم الذي اخترعناه للنطاق الفرعي في البرنامج النصي التالي
#!/bin/bash # Public IP address of your ingress controller IP="168.63.19.2" # Name to associate with public IP address DNSNAME="myservice-ingress" # Get the resource-id of the public ip PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]" --output tsv) # Update public ip address with DNS name az network public-ip update --ids $PUBLICIPID --dns-name $DNSNAME
نحن ببساطة نسخ هذا البرنامج النصي ، ولصقه في سطر الأوامر وتنفيذه بهذه الطريقة. كاسم للمجال الفرعي ، قمت بتعيين اسم "أصلي" جدًا - myservice-ingress
قم بتثبيت مدير الشهادة بنفس الطريقة عن طريق نسخ البرنامج النصي التالي ولصقه في سطر الأوامر. هنا ، حتى لا شيء يحتاج إلى تغيير.
helm install \ --name cert-manager \ --namespace kube-system \ stable/cert-manager \ --set ingressShim.defaultIssuerName=letsencrypt-prod \ --set ingressShim.defaultIssuerKind=ClusterIssuer \ --set rbac.create=false \ --set serviceAccount.create=false
معلومات
إذا كان لدينا مجموعة مع RBAC ، فسيكون البرنامج النصي مختلفًا.
helm install stable/cert-manager --set ingressShim.defaultIssuerName=letsencrypt-staging --set ingressShim.defaultIssuerKind=ClusterIssuer
إذا كان ملف الشهادة متاحًا ، فيمكنك إضافته مثل هذا:
kubectl create secret tls tls-secret --cert CERT.crt --key KEY-FOR-CERT.key
ولكن نظرًا لعدم وجود شهادة CA موقعة ، يتعين علينا أن نرقص قليلاً مع الدف. سنقوم بإنشاء مرجع مصدق باستخدام خدمة مجانية تسمى LetsEncrypt . LetsEncrypt هو المرجع المصدق الذي يصدر الشهادات مجانًا. مثل هذه المنظمة الإيثار ، التي تهدف إلى تأمين الإنترنت.
لذلك ، قم بإنشاء ملف cluster-issuer.yaml ، وهو يصف المؤسسة التي أصدرت الشهادة.
apiVersion: certmanager.k8s.io/v1alpha1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: youeemail@yourdomain.ru privateKeySecretRef: name: letsencrypt-prod http01: {}
ما عليك سوى استبدال البريد الإلكتروني بعنوانك ويمكنك القيام بما يلي:
kubectl apply -f cluster-issuer.yaml
ثم نقوم بإنشاء ملف الشهادة certificate.yaml الذي يحدد اسم ClusterIssuer الذي تم إنشاؤه والمجال الذي تهدف إليه الشهادة - myservice-ingress.westeurope.cloudapp.azure.com
apiVersion: certmanager.k8s.io/v1alpha1 kind: Certificate metadata: name: tls-prod-secret spec: secretName: tls-prod-secret dnsNames: - myservice-ingress.westeurope.cloudapp.azure.com acme: config: - http01: ingressClass: nginx domains: - myservice-ingress.westeurope.cloudapp.azure.com issuerRef: name: letsencrypt-prod kind: ClusterIssuer
نقوم بها:
kubectl apply -f certificate.yaml
إنشاء الخدمة والخروج
يمكن ل Kubernetes إنشاء أربعة أنواع مختلفة من الخدمات.
الخدمة الافتراضية هي ClusterIP. الوصول إلى هذه الخدمة ممكن فقط من الكتلة عبر IP داخلي.
يقوم NodePort تلقائيًا بإنشاء خدمة ClusterIP. الوصول إلى NodePort ممكن خارجيًا بواسطة المسار التالي:
يوفر موازن التحميل LoadBalancer الوصول إلى الخدمة من الخارج ، تلقائيًا بإنشاء خدمات NodePort و ClusterIP.
يربط ExternalName الخدمة باسم خارجي.
الخدمة الأساسية كافية بالنسبة لنا:
apiVersion: v1 kind: Service metadata: name: myservice spec: type: ClusterIP ports: - port: 80 name: http targetPort: http selector: app: myapp
مع قيمة المحدد فإننا نشير إلى اسم نشرنا.
يبقى لإنشاء خدمة
kubectl apply -f service.yaml
وكمرحلة أخيرة ، نخلق مدخلًا قمت بتقديمه لك بالفعل أعلى قليلاً في هذا المقال. في yaml ، سنحدد اسم جهة إصدار نظام المجموعة والشهادة. لقد خلقنا لهم في وقت سابق.
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: myingress annotations: kubernetes.io/ingress.class: nginx certmanager.k8s.io/cluster-issuer: letsencrypt-prod nginx.ingress.kubernetes.io/rewrite-target: / spec: tls: - hosts: - myservice-ingress.westeurope.cloudapp.azure.com secretName: tls-prod-secret rules: - host: myservice-ingress.westeurope.cloudapp.azure.com http: paths: - path: / backend: serviceName: myservice servicePort: 80
بعد مرور بعض الوقت على إنشاء إدخال باستخدام نفس الأمر kubectl application ، يجب أن تصبح خدمة micros لدينا متاحة على https: // myservice-ingress.westeurope.cloudapp.azure.com . من خلال النقر فوق القفل في شريط العنوان في المتصفح بجوار https ، يمكنك التحقق من صحة الشهادة وإصدارها من قبل المرجع المصدق (CA).

نذكرك أن هذه هي النسخة الكاملة
لمقال من مجلة هاكر . مؤلفها هو
أليكسي سومر .