مرحبا الزملاء!
في يناير ، لدينا أخيرًا كتاب طال انتظاره حول Kubernetes. خطاب عن "إتقان Kubernetes الإصدار الثاني" لجيجي سيفان:
لم نجرؤ على نشر كتاب على Kubernetes منذ عام مضى ، لأن التكنولوجيا كانت في ذلك الوقت تبدو وكأنها مدرعة في الشركات الكبرى. ومع ذلك ، فإن الوضع آخذ في التغير ، ونقترح تأييدًا لمقال كبير كتبه كاليب دوكسي ، الذي كتب ، بالمناسبة ،
كتابًا عن لغة Go. تعد حجج السيد Doxy مثيرة للغاية ، ونأمل أنه بعد قراءتها تريد حقًا تجربة Kubernetes في الممارسة.
قضيت بضعة أشهر في بداية هذا العام في دراسة متعمقة عن Kubernetes: كنت في حاجة إليها لمشروع عمل واحد. Kubernetes هي تقنية شاملة لإدارة البنية التحتية ، فهي "تتضمن كل شيء ، حتى البطاريات". تحل Kubernetes عددًا من المشكلات التي يُحتمل أن تواجهها عند تطويرها للشركات الكبيرة. ومع ذلك ، يتم تكرار الاعتقاد بأن Kubernetes هي تقنية معقدة للغاية وذات صلة فقط بإدارة مجموعة كبيرة من الآلات. يزعم أن الحمل التشغيلي عند العمل مع Kubernetes كبير لدرجة أن استخدامه للبنية التحتية الصغيرة ، حيث لا تدخل الماكينة في العشرات ، يعد مدفعًا يطلق على العصافير.
أسمح لنفسي بالاعتراض على هذا. Kubernetes مفيد أيضًا للمشاريع الصغيرة ، واليوم يمكنك بالفعل شراء مجموعة Kubernetes الخاصة بك مقابل أقل من
5 دولارات شهريًا.
كلمة في الدفاع عن Kubernetesفيما يلي سأوضح لك كيفية إعداد مجموعة Kubernetes الخاصة بك ، ولكن أولاً حاول أن توضح سبب استخدام Kubernetes في المشروعات الصغيرة:
Kubernetes دقيقنعم ، للوهلة الأولى ، يبدو Kubernetes مثل حل زائدة عن الحاجة إلى حد ما. يبدو أنه من الأسهل الحصول على جهاز افتراضي والحصول عليه وليس تكوين التطبيق الخاص بك كخدمة ، لماذا لا؟ عند اختيار هذا المسار ، سيتعين عليك اتخاذ قرار بشأن بعض الحلول ، خاصة:
- كيفية نشر التطبيق؟ فقط رسينك إلى الخادم؟
- ماذا عن التبعيات؟ إذا كنت تعمل مع Python أو Ruby ، فسيتعين عليك تثبيتها على الخادم. هل ستقوم بتشغيل الأوامر يدويًا؟
- كيف ستطلق التطبيق؟ مجرد تنفيذ الثنائية في الخلفية ثم nohup ذلك؟ قد لا يكون هذا جيدًا جدًا ، لذا إذا كنت تنظم التطبيق كخدمة ، فعليك أن تتعلم systemd؟
- كيف ستتعامل مع تشغيل العديد من التطبيقات عندما يكون لديهم جميعًا أسماء نطاقات مختلفة أو مسارات http؟ (ربما تحتاج إلى تكوين haproxy أو nginx لهذا)
- افترض أنك قمت بتحديث التطبيق الخاص بك. كيف بعد ذلك سوف تطرح التغييرات؟ وقف الخدمة ، ونشر الرمز ، إعادة تشغيل الخدمة؟ كيفية تجنب التوقف؟
- ماذا لو حبست النشر؟ هناك فرص لاستعادة؟ (دليل Symlink ...؟ هذا البرنامج النصي البسيط لم يعد يبدو بسيطًا بشكل خاص)
- هل يستخدم التطبيق الخاص بك خدمات أخرى ، على سبيل المثال ، redis؟ كيفية تكوين كل هذه الخدمات؟
Kubernetes يحل كل هذه المشاكل. بطبيعة الحال ، يتم حلها جميعًا بطرق أخرى ، من بينها خيارات أفضل لـ Kubernetes ؛ ومع ذلك ، ما هو أفضل من عدم التفكير في كل هذا على الإطلاق والتركيز على تطوير التطبيق.
Kubernetes موثوقةخادم واحد سوف تحطم دائما. نعم ، هذا أمر نادر الحدوث ، ربما مرة واحدة في السنة ، ولكن بعد هذا الحدث ، يبدأ الصداع الحقيقي: كيفية إعادة كل شيء إلى حالة صالحة للعمل. هذا صحيح بشكل خاص إذا قمت بتكوين التكوين بأكمله بنفسك يدويًا. تذكر جميع الفرق التي ركضت آخر مرة؟ هل تتذكر ما عملت على الخادم؟ أذكر اقتباس واحد من bashorg:
erno: هم. فقدت الكمبيوتر ... على محمل الجد ، _lost_. يستجيب ، يعمل بشكل جيد ، أنا فقط لا أعرف من أين ذهب إلى الشقة.
bash.org/؟5273
بالضبط نفس الشيء حدث لي مؤخرًا في مدونتي الخاصة. كنت بحاجة فقط إلى تحديث الرابط ، لكنني نسيت تمامًا كيفية نشر المدونة. فجأة ، تحول إصلاح لمدة عشر دقائق إلى قطعة من العمل طوال عطلة نهاية الأسبوع الطويلة.
يستخدم Kubernetes تنسيقًا
وصفيًا ، بحيث تعرف دائمًا الأشياء ومتى وأين كان من المفترض تشغيله ؛ بالإضافة إلى ذلك ، تكون جميع مكونات النظام المنشور مرئية بشكل أكثر وضوحًا. علاوة على ذلك ، في مستوى التحكم ، يتم التعامل مع فشل العقدة بعناية ، ويتم إعادة توزيع الموقد تلقائيًا. عند العمل مع خدمة لا تحافظ على الحالة ، على سبيل المثال ، مع تطبيق ويب ، يمكنك نسيان الفشل تمامًا.
تعلم Kubernetes ليس أصعب من البدائلKubernetes لا يتبع نموذج يونكس. لا تنسجم مع النظام البيئي للأدوات. إنه ليس أحد تلك القرارات التي "تفعل شيئًا واحدًا فقط وتفعله جيدًا". Kubernetes هو حل شامل للعديد من المشاكل ، ويمكن أن يحل محل مجموعة متنوعة من الحيل والأدوات التي اعتاد المطورون عليها.
تتميز Kubernetes بمصطلحاتها الخاصة ، وأدواتها الخاصة ، ونموذج التعامل مع الخادم الخاص بها ، والذي يختلف اختلافًا كبيرًا عن نهج يونيكس التقليدي. عند التنقل في هذه الأنظمة ، قد تبدو العديد من ميزات Kubernetes عشوائية ومُعقدة ، وربما قاسية. أفترض أن هناك أسباب وجيهة لحدوث هذا التعقيد ، لكنني هنا لا أقول إن Kubernetes بسيط ومبتدئ. أنا أقول أن المعرفة Kubernetes كافية لإنشاء ودعم أي بنية تحتية.
هذا لا يعني أن أي مسؤول نظام لديه خلفية كافية في يونكس. على سبيل المثال ، بعد التخرج من الكلية ، عملت لمدة 5 سنوات في نظام ويندوز البيئي. أستطيع أن أقول إن وظيفتي الأولى في شركة ناشئة حيث كنت بحاجة للتعامل مع نظام لينكس تتطلب تحولا صعبا. لم أكن أعرف أوامر الذاكرة ؛ لم أكن معتادًا على استخدام سطر الأوامر لجميع المناسبات تقريبًا. استغرق الأمر مني بعض الوقت لمعرفة كيفية العمل مع النظام الأساسي الجديد (على الرغم من أنه بحلول ذلك الوقت كان لدي بالفعل بعض الخبرة في البرمجة) ، لكنني أتذكر بوضوح كم عانيت.
مع Kubernetes ، يمكنك بدء العمل من الصفر. في Kubernetes ، يمكنك توفير الخدمات بسهولة حتى بدون اتصال SSH بالخادم. ليس لديك لتعلم systemd. ليس من الضروري فهم مستويات التشغيل أو معرفة الأمر الذي تم استخدامه:
groupadd
أو
addgroup
؛ ليس عليك أن تتعلم كيفية التعامل مع
ps
أو ، لا سمح الله. كل هذا العتاد مفيد ومهم ، لا شيء منه يختفي في أي مكان. لدي احترام كبير لنظم مسؤولي قادرة على العمل من خلال أي بيئة يونيكس. ولكن كم سيكون رائعا إذا تمكن المطورون من الحصول على كل هذه الموارد بشكل إنتاجي دون الخوض في مثل هذه التفاصيل الدقيقة للإدارة؟
هل حقا هذا:
[Unit] Description=The NGINX HTTP and reverse proxy server After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/usr/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
أصعب بكثير من هذا؟
apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: selector: matchLabels: run: my-nginx replicas: 1 template: metadata: labels: run: my-nginx spec: containers: - name: my-nginx image: nginx ports: - containerPort: 80
وهذا لا يزال حالة جيدة نسبيا. إذا كنت تدير البنية التحتية بنسبة 100 ٪ عن بعد ، فلن تكون قادرًا على تقديم دعم خادم يدوي. للقيام بذلك ، سوف تحتاج إلى نوع من الأدوات: ansible ، الملح ، الشيف ، دمية ، الخ. بطبيعة الحال ، من أجل إتقان Kubernetes والعمل بفعالية معه ، تحتاج إلى أن تتعلم الكثير ، ولكن هذا ليس أكثر صعوبة من التعامل مع البدائل.
Kubernetes مفتوحة المصدرفي عصر الشعبية الهائلة للتكنولوجيات التي لا تستخدم الخوادم ، تتميز Kubernetes باستقلالها عن موردين محددين. هناك ما لا يقل عن 3 من مزودي Kubernetes المعروفين وسهل الإدارة (Google و Amazon و Microsoft) لن يختفون في المستقبل المنظور. هناك أيضًا العديد من الشركات التي تدير بنجاح مجموعات Kubernetes الخاصة بها ، ويتضاعف عدد هذه الشركات كل يوم. اليوم ، يعد العمل مع Kubernetes منذ اليوم الأول حلاً واضحًا لمعظم الشركات الناشئة.
Kubernetes ، كونه مشروع مفتوح المصدر ، تم توثيقه جيدًا ومستقر وشعبي ، ويمكن التعامل مع أي مشاكل بأكبر قدر ممكن من التفصيل في stackoverflow. بالطبع ، لدى Kubernetes الأخطاء والتحديات التقنية الخاصة بها ، لكنني أؤكد لك: هناك شباب في العالم يصقلون Kubernetes بمهارة لا تصدق. عملهم هو أرباحك. في السنوات القليلة المقبلة ، سيتم تحسين هذه التكنولوجيا فقط.
جداول Kubernetesأحد التحديات المرتبطة بدعم البنية التحتية هي: التقنيات الناجحة عند نشر أنظمة صغيرة نادراً ما تنجح في التكاثر في الأنظمة الأكبر. من الملائم بالتأكيد ربط SCP بملف ثنائي بالخادم ، وقتل العملية وإعادة تشغيله إذا كان لديك خادم واحد فقط. ولكن ، عندما تحتاج إلى دعم خوادم متعددة ومراقبتها في وقت واحد ، قد تتحول هذه المهمة إلى صعوبة هائلة. لهذا السبب لا يمكنك الاستغناء عن أدوات مثل الطاهي أو العرائس عند إدارة مثل هذه البنية التحتية.
ومع ذلك ، إذا اخترت الأداة الخاطئة ، فمع مرور الوقت يمكن أن تقودك إلى الزاوية. فجأة اتضح أن خادم الطهاة الرائد غير قادر على مواجهة حمولة 1000 خادم ، لا يتناسب نشر اللون الأزرق والأخضر مع الطراز الخاص بك ، ويستغرق الأمر ساعات لإكمال مهام capistrano. عندما تصل البنية التحتية إلى حجم معين ، سوف تضطر إلى هدم كل ما تم بالفعل والبدء من جديد. كم سيكون رائعًا لو تمكنت من الخروج من عجلة السنجاب الأبدية هذه باستخدام بنية تحتية والتحول إلى تقنية تتناسب مع احتياجاتك؟
Kubernetes يشبه إلى حد كبير قاعدة بيانات SQL. SQL هي نتاج سنوات عديدة من الدروس الصعبة حول تخزين البيانات والاستعلام الفعال. ربما ، لن تحتاج أبدًا إلى عُشر تلك الميزات التي يتم توفيرها في قاعدة بيانات SQL صالحة. قد تكون قادرًا على تصميم نظام أكثر كفاءة ، معتمداً على قاعدة البيانات الخاصة بك. ولكن في الغالبية العظمى من الحالات ، لن تلبي قاعدة بيانات SQL جميع احتياجاتك فحسب ، بل ستوسع قدرتك بشكل كبير على إصدار حلول جاهزة بسرعة. يعد استخدام مخططات SQL وفهرستها أسهل بكثير من استخدام هياكل البيانات الأصلية القائمة على الملفات ، حيث من شبه المؤكد أن تصبح هياكل البيانات الأصلية قديمة نظرًا لأن المنتج ينمو ويتطور مع مرور الوقت. لكن من المحتمل أن تصمد قاعدة بيانات SQL في أي عملية إعادة بيع محتومة.
سوف Kubernetes البقاء على قيد الحياة أيضا. ربما لن ينمو مشروعك الجانبي إلى هذا النطاق حيث لا يمكن حل مشاكله إلا مع Kubernetes ، لكن Kubernetes لديه كل الأدوات اللازمة لأية مشاكل ، وقد تتحول المهارات التي ستكتسبها عند التعامل مع مجموعة الأدوات هذه إلى لا تقدر بثمن في المشاريع المستقبلية.
بناء كتلة Kubernetes الخاصة بكلذلك ، أعتقد أنه من المستحسن استخدام Kubernetes في المشاريع الصغيرة ، ولكن فقط إذا تم إنشاء مجموعة بسيطة وغير مكلفة. اتضح أن كلاهما قابل للتحقيق. يوجد موفرون مدارون في Kubernetes يتعاملون مع الفوضى بأكملها بأنفسهم ، مما يدعم طائرة التحكم في مضيف Kubernetes. وقد أدت حروب الإغراق الأخيرة في بيئة البنية التحتية السحابية إلى انخفاض مذهل في تكلفة هذه الخدمات.
سنقوم بتحليل الحالة التالية باستخدام محرك Kubernetes من Google (GKE) كمثال ، ومع ذلك ، يمكنك أيضًا الاطلاع على العروض المقدمة من Amazon (EKS) أو Microsoft (AKS) إذا كانت Google لا تناسبك. لبناء مجموعة Kubernetes الخاصة بك ، نحتاج إلى:
- اسم المجال (حوالي 10 دولار في السنة ، حسب النطاق)
- Cloudflare DNS Hosting (مجاني)
- GKE Kubernetes Three-Node Cluster (حوالي 5 دولارات في الشهر)
- تم تحميل تطبيق الويب كحاوية لرسو السفن إلى Google Container Registry (GCR) (مجانًا)
- عدد من ملفات yaml لتكوين Kubernetes
لتحقيق وفورات إضافية ، سنحاول الاستغناء عن وحدة تحكم إدخال Google. بدلاً من ذلك ، سوف نستخدم Nginx على كل عقدة بمثابة برنامج خفي وننشئ المشغل الخاص بنا الذي سيقوم بمزامنة عناوين IP الخارجية لعقدة العمل مع Cloudflare.
تكوين جوجلأولاً ، انتقل إلى console.cloud.google.com وقم بإنشاء مشروع ، إذا لم تكن قد قمت بذلك بالفعل. ستحتاج أيضًا إلى إنشاء حساب فوترة. ثم ، من خلال قائمة الهامبرغر ، انتقل إلى صفحة Kubernetes وقم بإنشاء مجموعة جديدة. إليك ما عليك القيام به بعد ذلك:
- حدد Zonal لنوع الموقع.
- أشرت إلى موقعي كـ us-central1-a
- اختر نسختك من kubernetes
- إنشاء مجموعة من 3 عقد باستخدام أرخص نوع مثيل (f1-micro).
- بالنسبة إلى مجموعة العقد هذه ، على الشاشة "المتقدمة" ، قم بتعيين حجم قرص التمهيد على 10 جيجابايت ، وتمكين العقد المبثوقة (أرخص) ، وتمكين التحديث التلقائي والمعالجة التلقائية.
- ضمن مجموعة العقد ، ستجد عددًا من الخيارات الإضافية. نريد تعطيل موازنة تحميل HTTP (موازنة التحميل في GCP مكلفة) ، وكذلك تعطيل الاقتصاد الكلي المرتبط بـ StackDriver (يمكن أن يكون مكلفًا أيضًا ، وفي تجربتي ، لا يمكن الاعتماد عليه كثيرًا). قم أيضًا بإيقاف تشغيل لوحة مؤشر kubernetes.
بعد وضع كل هذه الخيارات ، يمكنك المتابعة إلى الخطوة التالية: إنشاء كتلة. إليك كيفية الحفظ عليها:
- طائرة التحكم Kubernetes: مجانية ، لأن Google لا تتقاضى من العقد المضيف
- عقد عمل Kubernetes: 5.04 دولار شهريًا ، وكقاعدة عامة ، ستكلفك ثلاث عقد صغيرة 11.65 دولارًا شهريًا ، وبعد أن نجعلها مزدحمة ، سنخفض هذا المعدل إلى 7.67 دولارًا شهريًا ، وفي Always Free - إلى 5.04 دولار.
- تكاليف التخزين: مجانا. نحصل على 30 جيجا بايت من مساحة القرص الدائمة ، لذلك اخترنا حجم 10 جيجابايت.
- تكاليف موازنة التحميل: مجانًا ، أوقفنا موازنة تحميل HTTP ، نظرًا لأن ذلك لن يستغرق سوى 18 دولارًا في الشهر. بدلاً من ذلك ، قم بتشغيل بروكسيات HTTP الخاصة بنا على كل عقدة وقم بتوجيه DNS إلى IP العام.
- مصاريف الشبكة: مجانًا ، تظل وظيفة الخروج خالية حتى تختار 1 جيجابايت شهريًا. (بعد ذلك ، تبلغ تكلفة كل غيغابايت التالي 8 سنتات)
لذلك أنشأنا مجموعة Kubernetes من 3 عقد ، كلفتنا نفس سعر الجهاز الرقمي المحيطي الوحيد.
بالإضافة إلى تكوين GKE ، تحتاج أيضًا إلى تكوين بعض قواعد جدار الحماية بحيث يمكنك الوصول إلى منافذ HTTP لمضيفينا من العالم الخارجي. ابحث عن إدخال VPC Network في قائمة الهمبرغر ، ثم انتقل إلى قواعد جدار الحماية وإضافة القواعد لمنافذ TCP 80 و 443 ، مع نطاق عنوان IP 0.0.0.0/0.

قواعد جدار الحماية
الإعداد المحليلذلك ، قمنا برفع المجموعة وبدأناها ، والآن لنقم بتكوينها. قم بتثبيت أداة
gcloud
باتباع الإرشادات على
cloud.google.com/sdk/docs . بعد تثبيته ، يمكنك المتابعة إلى التكوين عن طريق القيام بذلك:
gcloud auth login
بالطبع ، لا يزال عليك تثبيت عامل ميناء ، ثم ربطه بـ GCR ، بحيث يمكنك إرسال الحاويات:
gcloud auth configure-docker
يمكنك أيضًا تثبيت
kubectl
وتكوينه باتباع الإرشادات الموضحة هنا.
المبسطة:
gcloud components install kubectl gcloud config set project PROJECT_ID gcloud config set compute/zone COMPUTE_ZONE gcloud container clusters get-credentials CLUSTER_NAME
بالمناسبة ، إنها مجرد حكاية خرافية أن كل مجموعة الأدوات هذه تعمل على Windows أو OSX أو Linux. باعتباري شخصًا قام في بعض الأحيان بمثل هذه الأشياء في نظام Windows ، أعترف أن هذه مفاجأة سارة.
تطبيق ويب بناءيمكن كتابة تطبيق ويب بأي لغة برمجة. الحاوية يسمح لك بتجريد معين. يجب علينا إنشاء تطبيق HTTP الاستماع على المنفذ. أفضّل استخدام Go لهذه الأغراض ، لكن من أجل التغيير سنحاول استخدام البلورة. قم
main.cr
ملف
main.cr
:
# crystal-www-example/main.cr require "http/server" Signal::INT.trap do exit end server = HTTP::Server.new do |context| context.response.content_type = "text/plain" context.response.print "Hello world from crystal-www-example! The time is #{Time.now}" end server.bind_tcp("0.0.0.0", 8080) puts "Listening on http://0.0.0.0:8080" server.listen
نحتاج أيضًا إلى Dockerfile:
# crystal-www-example/Dockerfile FROM crystallang/crystal:0.26.1 as builder COPY main.cr main.cr RUN crystal build -o /bin/crystal-www-example main.cr --release ENTRYPOINT [ "/bin/crystal-www-example" ]
لبناء واختبار تطبيقنا ، قم بتشغيل:
docker build -t gcr.io/PROJECT_ID/crystal-www-example:latest . docker run -p 8080:8080 gcr.io/PROJECT_ID/crystal-www-example:latest
ثم انتقل إلى المتصفح في المضيف المحلي: 8080. بعد إنشاء هذه الآلية ، يمكننا إرسال طلبنا إلى GCR من خلال تشغيل:
docker push gcr.io/PROJECT_ID/crystal-www-example:latest
تكوين Kubernetesتكوين Kubernetes الخاص بي
هنا .
في هذا المثال ، سيتعين علينا إنشاء العديد من ملفات yaml حيث سيتم تقديم خدماتنا المتنوعة ، ثم تشغيل تطبيق kubectl لتكوينها في المجموعة. تكوين Kubernetes وصفي ، وجميع ملفات yaml هذه تخبر Kubernetes عن الحالة التي نريد الحصول عليها. بمعنى واسع ، هذا هو ما سنفعله:
- قم بإنشاء النشر والخدمة لتطبيق الويب Crystal-www على سبيل المثال
- إنشاء Daemon Set (مجموعة خدمات) و Config Map (خريطة التكوين) لـ nginx
- نطلق تطبيقنا الخاص لمزامنة عقد IP مع Cloudflare لنظام DNS
تكوين تطبيق الويبأولاً ، دعنا
PROJECT_ID
تطبيق الويب الخاص بنا: (تأكد من استبدال
PROJECT_ID
بمعرف مشروعك)
# kubernetes-config/crystal-www-example.yaml apiVersion: apps/v1 kind: Deployment metadata: name: crystal-www-example labels: app: crystal-www-example spec: replicas: 1 selector: matchLabels: app: crystal-www-example template: metadata: labels: app: crystal-www-example spec: containers: - name: crystal-www-example image: gcr.io/PROJECT_ID/crystal-www-example:latest ports: - containerPort: 8080 --- kind: Service apiVersion: v1 metadata: name: crystal-www-example spec: selector: app: crystal-www-example ports: - protocol: TCP port: 8080 targetPort: 8080
يؤدي هذا إلى إنشاء Deployment (تكوين موسع) ، والتي بموجبها يجب على Kubernetes إنشاء حاوية واحدة (ستعمل حاوية الإرساء الخاصة بنا هناك) وخدمة سوف نستخدمها للعثور على الخدمات في نظامنا. لتطبيق هذا التكوين ، قم بتشغيل (من دليل
kubernetes-config
):
kubectl apply -f
يمكنك اختباره مثل هذا:
kubectl get pod # : # crystal-www-example-698bbb44c5-l9hj9 1/1 Running 0 5m
يمكننا أيضًا إنشاء واجهة برمجة تطبيقات وكيل للوصول:
kubectl proxy
ثم انتقل:
المضيف المحلي: 8001 / api / v1 / مساحات الأسماء / الإعداد الافتراضي / services / crystal-www-example / proxy /
التكوين NGINXعادة ، عند العمل مع خدمات HTTP ، يستخدم Kubernetes وحدة تحكم في الإدخال. لسوء الحظ ، يعد موازن تحميل HTTP من Google مكلفًا للغاية ، ولذا فإننا لن نستخدمه ، ولكننا نستخدم بروكسي HTTP الخاص بنا ونهيئه يدويًا (يبدو مخيفًا ، ولكنه في الحقيقة بسيط جدًا).
للقيام بذلك ، استخدم Daemon Set و Config Map. برنامج Daemon Set هو تطبيق يعمل على كل عقدة. يعد Config Map ، من حيث المبدأ ، ملفًا صغيرًا يمكننا تحميله في حاوية ؛ هذا الملف سوف يخزن التكوين nginx.
يبدو ملف yaml شيئًا مثل هذا:
apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: hostNetwork: true dnsPolicy: ClusterFirstWithHostNet containers: - image: nginx:1.15.3-alpine name: nginx ports: - name: http containerPort: 80 hostPort: 80 volumeMounts: - name: "config" mountPath: "/etc/nginx" volumes: - name: config configMap: name: nginx-conf --- apiVersion: v1 kind: ConfigMap metadata: name: nginx-conf data: nginx.conf: | worker_processes 1; error_log /dev/stdout info; events { worker_connections 10; } http { access_log /dev/stdout; server { listen 80; location / { proxy_pass http://crystal-www-example.default.svc.cluster.local:8080; } } }
هذه هي الطريقة التي نقوم بها بتحميل ملف nginx.conf لبطاقة التكوين في حاوية nginx. نقوم أيضًا بتعيين قيم
hostNetwork: true
:
hostNetwork: true
، بحيث يمكنك ربط منفذ المضيف
dnsPolicy: ClusterFirstWithHostNet
nginx من الخارج و
dnsPolicy: ClusterFirstWithHostNet
بحيث يمكنك الوصول إلى الخدمات داخل الكتلة. إذا لم يتم ذلك ، فسنحصل على تكوين قياسي تمامًا.
قم بتطبيق هذه التعبيرات ويمكنك الوصول إلى nginx عبر IP العام لعقدك.
إليك كيفية التحقق من ذلك:
kubectl get node -o yaml # look for: # - address: ... # type: ExternalIP
حتى الآن تطبيق الويب لدينا يمكن الوصول إليها من الإنترنت. يبقى أن يأتي مع اسم جميل للتطبيق.
اتصال DNSيجب تعيين 3 سجلات DNS لعقد نظامنا:

إدخالات في واجهة المستخدم Cloudflare
ثم أضف سجل CNAME للإشارة إلى سجلات A هذه. (على سبيل المثال
www.example.com CNAME for kubernetes.example.com). يمكن القيام بذلك يدويًا ، ولكن بشكل أفضل - تلقائيًا ، بحيث إذا احتجنا إلى توسيع نطاق العقد في سجلات DNS أو استبدالها ، يتم تحديث هذه المعلومات أيضًا تلقائيًا.
أعتقد أن هذا المثال يوضح جيدًا كيف يمكنك تفويض جزء من عملك إلى Kubernetes ، وليس محاولة التغلب عليه. تتفهم Kubernetes البرامج النصية ولديها واجهة برمجة تطبيقات قوية ، ويمكنك ملء المساحات الحالية بمكوناتك الخاصة ، والتي يصعب كتابتها. للقيام بذلك ، قمت بتقديم تطبيق صغير على Go ، متاح على هذا العنوان:
kubernetes-cloudflare-sync .
للبدء ، قمت بإنشاء مخبر:
factory := informers.NewSharedInformerFactory(client, time.Minute) lister := factory.Core().V1().Nodes().Lister() informer := factory.Core().V1().Nodes().Informer() informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { resync() }, UpdateFunc: func(oldObj, newObj interface{}) { resync() }, DeleteFunc: func(obj interface{}) { resync() }, }) informer.Run(stop)
سوف تستدعي وظيفتي resync كلما تغيرت عقدة. ثم أقوم بمزامنة واجهة برمجة التطبيقات (API) باستخدام مكتبة
واجهة برمجة التطبيقات (API) الخاصة بـ Cloudflare ، شيء مثل هذا:
var ips []string for _, node := range nodes { for _, addr := range node.Status.Addresses { if addr.Type == core_v1.NodeExternalIP { ips = append(ips, addr.Address) } } } sort.Strings(ips) for _, ip := range ips { api.CreateDNSRecord(zoneID, cloudflare.DNSRecord{ Type: "A", Name: options.DNSName, Content: ip, TTL: 120, Proxied: false, }) }
بعد ذلك ، كما هو الحال مع تطبيق الويب الخاص بنا ، نطلق هذا التطبيق في Kubernetes كنشر:
apiVersion: apps/v1 kind: Deployment metadata: name: kubernetes-cloudflare-sync labels: app: kubernetes-cloudflare-sync spec: replicas: 1 selector: matchLabels: app: kubernetes-cloudflare-sync template: metadata: labels: app: kubernetes-cloudflare-sync spec: serviceAccountName: kubernetes-cloudflare-sync containers: - name: kubernetes-cloudflare-sync image: gcr.io/PROJECT_ID/kubernetes-cloudflare-sync args: - --dns-name=kubernetes.example.com env: - name: CF_API_KEY valueFrom: secretKeyRef: name: cloudflare key: api-key - name: CF_API_EMAIL valueFrom: secretKeyRef: name: cloudflare key: email
سنحتاج إلى إنشاء سر Kubernetes من خلال تحديد مفتاح
cloudflare api
وعنوان البريد:
kubectl create secret generic cloudflare --from-literal=email='EMAIL' --from-literal=api-key='API_KEY'
سنحتاج أيضًا إلى إنشاء حساب خدمة (مما يتيح وصولنا إلى النشر إلى Kubernetes API لاسترداد العقد). الجولة الأولى (خاصة بالنسبة لـ GKE):
kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user YOUR_EMAIL_ADDRESS_HERE
ثم قم بتطبيق:
apiVersion: v1 kind: ServiceAccount metadata: name: kubernetes-cloudflare-sync --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: kubernetes-cloudflare-sync rules: - apiGroups: [""] resources: ["nodes"] verbs: ["list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kubernetes-cloudflare-sync-viewer roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: kubernetes-cloudflare-sync subjects: - kind: ServiceAccount name: kubernetes-cloudflare-sync namespace: default
العمل مع RBAC شاقة بعض الشيء ، لكنني آمل أن كل شيء واضح هنا. عندما يكون التكوين جاهزًا ويعمل تطبيقنا مع Cloudflare ، يمكن تحديث هذا التطبيق بأي تغيير في أي من العقد.
الخاتمةمقدر Kubernetes لتصبح التكنولوجيا الرائدة لإدارة النظم الكبيرة. , Kubernetes , Kubernetes , Kubernetes , Kubernetes .
, Kubernetes : , . – !