عامل الميناء - التحجيم إنجن إكس و فب-التيار الوطني الحر بشكل منفصل

لقد تم اللعب حولها مع عامل الميناء وعامل الميناء يؤلف ولدي سؤال.

حاليا بلدي عامل الميناء يؤلف.يمل يبدو مثل هذا:

app:    image: myname/php-app    volumes:        - /var/www    environment:        <SYMFONY_ENVIRONMENT>: devweb:    image: myname/nginx    ports:        - 80    links:        - app    volumes_from:        - app

التطبيق يحتوي على فب-التيار الوطني الحر على المنفذ 9000 ورمز التطبيق الخاص بي.الويب هو إنجن إكس مع عدد قليل من أجزاء التكوين.

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

fastcgi_pass    app:9000;

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

كيف يمكنني الحصول على كل مثيل فب-التيار الوطني الحر على منفذ مختلف ولكن لا تزال تعرف أين هم في بلدي التكوين إنجن إكس في أي وقت من الأوقات?

أنا اتخاذ نهج خاطئ?

شكراً!

حل واحد هو إضافة مثيلات فب-التيار الوطني الحر إضافية إلى ملف عامل الميناء الخاص بك ثم استخدام نجينكس المنبع كما هو مذكور في الإجابات الأخرى لتحميل التوازن بينهما. يتم ذلك في هذا المثال عامل الميناء-يؤلف الريبو: https://github.com/iamyojimbo/docker-nginx-php-fpm/blob/master/nginx/nginx.conf#L137

upstream php {    #If there's no directive here, then use round_robin.    #least_conn;    server dockernginxphpfpm_php1_1:9000;    server dockernginxphpfpm_php2_1:9000;    server dockernginxphpfpm_php3_1:9000;}

هذه ليست مثالية حقا لأنها سوف تتطلب تغيير التكوين نجينكس وعامل الميناء يؤلف.يمل عندما تريد توسيع نطاق أعلى أو لأسفل.

لاحظ أن منفذ 9000 داخلي للحاوية وليس المضيف الفعلي ، لذلك لا يهم أن لديك عدة حاويات فب-التيار الوطني الحر على المنفذ 9000.

حصل عامل الميناء على توتوم هذا الخريف. لديهم الحل الذي يجمع بين حاوية هابروكسي مع أبي لضبط تلقائيا تحميل موازن التكوين إلى الحاويات قيد التشغيل هو موازنة التحميل. هذا هو الحل الجميل. ثم يشير إنجن إكس إلى اسم المضيف المعين لموازن التحميل. ربما عامل الميناء سوف مزيد من دمج هذا النوع من الحل في أدواتهم بعد اكتساب توتوم. هناك مقال حول هذا الموضوع هنا: https://web.archive.org/web/20160628133445/https://support.tutum.co/support/solutions/articles/5000050235-load-balancing-a-web-service

توتوم حاليا خدمة مدفوعة الأجر. رانشر هو مشروع مفتوح المصدر يوفر ميزة موازنة تحميل مماثلة. لديهم أيضا " مربي ماشية-يؤلف.يمل " التي يمكن أن تحدد موازنة التحميل وتوسيع نطاق إعداد الخدمات في عامل الميناء يؤلف.يمل. http://rancher.com/the-magical-moment-when-container-load-balancing-meets-service-discovery/ http://docs.rancher.com/rancher/concepts/#load-balancer

تحديث 2017/03/06: لقد استخدمت مشروعا يسمى الانترلوك الذي يعمل مع عامل الميناء لتحديث التكوين إنجن إكس تلقائيا وإعادة تشغيله. انظر أيضا @إيواسايتنبياغرو الإجابة التي لديها نهج إضافية.

يمكنك استخدام المنبع لتحديد الخلفيات متعددة ، كما هو موضح هنا:

https://stackoverflow.com/questions/5467921/how-to-use-fastcgi-next-upstream-in-nginx

كنت تريد أيضا أن يكون التكوين تحديثها كلما الخلفيات الجديدة يموت / تأتي في الخدمة مع شيء من هذا القبيل:

https://github.com/kelseyhightower/confd

على الرغم من أن هذا المنشور من 2015 وأشعر أنني نخر (مجتمع آسف) ، أشعر أنه من المفيد إضافته في هذا الوقت:

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

نظرا لأنني أكثر دراية بسرب عامل الميناء، فهذه هي الطريقة التي ستفعل بها للتعامل مع هذه المشكلة (على افتراض أن لديك عقدة عامل ميناء واحدة):

تهيئة سرب:

docker swarm init

القرص المضغوط في جذر المشروع الخاص بك

cd some/project/root

إنشاء كومة سرب من عامل الميناء الخاص بك-يؤلف.يمل (بدلا من استخدام عامل الميناء-يؤلف):

docker stack deploy -c docker-compose.yml myApp

سيؤدي هذا إلى إنشاء كومة خدمة سرب عامل الميناء تسمى" مياب " وسوف تدير المنافذ بالنسبة لك. وهذا يعني: لديك فقط لإضافة واحد" ميناء: 9000:9000 " تعريف لخدمة فب-التيار الوطني الحر في ملف عامل الميناء الخاص بك ومن ثم يمكنك توسيع نطاق خدمة فب-التيار الوطني الحر ، ويقول إلى 3 حالات ، في حين أن سرب سوف لصناعة السيارات في سحرية تحميل التوازن بين الطلبات بين الحالات الثلاث دون أي مزيد من العمل اللازم.

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

لقد كتبت نص صغير للقيام بذلك (لصق أدناه) ، والتي تقوم تلقائيا بتحديث سجل دنس الذي له نفس اسم اسم الحاويات وتوجيهها إلى عناوين إب الحاويات:

#!/bin/bash# 10 seconds interval time by defaultINTERVAL=${INTERVAL:-10}# dnsmasq config directoryDNSMASQ_CONFIG=${DNSMASQ_CONFIG:-.}# commands used in this scriptDOCKER=${DOCKER:-docker}SLEEP=${SLEEP:-sleep}TAIL=${TAIL:-tail}declare -A service_mapwhile truedo    changed=false    while read line    do        name=${line##* }        ip=$(${DOCKER} inspect --format '{{.NetworkSettings.IPAddress}}' $name)        if [ -z ${service_map[$name]} ] || [ ${service_map[$name]} != $ip ] # IP addr changed        then            service_map[$name]=$ip            # write to file            echo $name has a new IP Address $ip >&2            echo "host-record=$name,$ip"  > "${DNSMASQ_CONFIG}/docker-$name"            changed=true        fi    done < <(${DOCKER} ps | ${TAIL} -n +2)    # a change of IP address occured, restart dnsmasq    if [ $changed = true ]    then        systemctl restart dnsmasq    fi    ${SLEEP} $INTERVALdone

ثم ، بدء حاوية إنجن إكس الخاص بك مع --dns host-ip-address، حيث host-ip-address هو عنوان إب للمضيف على الواجهة docker0.

الخاص بك تكوين إنجن إكس يجب حل الأسماء ديناميكيا:

server {  resolver host-ip-address;  listen 80;  server_name @server_name@;  root /var/www/@root@;  index index.html index.htm index.php;  location ~ ^(.+?\.php)(/.*)?$ {    try_files $uri =404;    include fastcgi_params;    fastcgi_param SCRIPT_FILENAME $document_root$1;    set $backend "@fastcgi_server@";    fastcgi_pass $backend;  }}

المراجع:

إذا كان لديك نجينكس و فب-فم على المضيفين مختلفة ، يمكنك محاولة الجواب @سماج.

قد يكون نهج آخر للنظر في شيء من هذا القبيل القنصل-قالب.

وبطبيعة الحال ، في مرحلة ما, كوبرنيتس قد تحتاج إلى ذكر.

ومع ذلك ، هل يمكن النظر في أكثر قليلا 'بت من سلسلة وشريط لاصق' النهج من خلال النظر في ما تستهلك الأحداث عامل الميناء يمكن أن نفعل لك (تشغيل docker events --since 0 للحصول على عينة سريعة).

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

للعودة إلى الفرضية الأصلية الخاصة بك ، على الرغم من: طالما يتم تشغيل حاويات فب-فم مع الشبكة الخاصة بهم (أي عدم تقاسم ذلك من حاوية أخرى ، مثل نجينكس واحد) ، ثم هل يمكن أن يكون العديد من الحاويات الاستماع على المنفذ 9000 كما تريد - كما لديهم لكل حاوية إيبس ، لا توجد مشكلة مع الموانئ 'اشتباك'.

كيف يمكنك قياس هذا من المرجح أن تعتمد على ما هدفك النهائي/حالة الاستخدام هو ، ولكن شيء واحد قد تنظر هو وضع هابروكسي بين نجينكس والعقد فب-التيار الوطني الحر الخاص بك.شيء واحد هذا يمكن أن يسمح لك القيام به هو ببساطة ترشيح مجموعة (وربما إنشاء docker network) لخوادم فب-فم (أي 172.18.0.0 / 24) ، ولها هابروكسي تكوين لمحاولة استخدام أي إب ضمن هذا النطاق كخلفية. منذ هابروكسي ديه الشيكات الصحية ، فإنه يمكن تحديد بسرعة العناوين التي هي حية ، والاستفادة منها.

انظر https://stackoverflow.com/questions/1358198/nginx-removing-upstream-servers-from-pool لمناقشة حول كيفية نجينكس مقابل هابروكسي يتعامل مع أوبستريمز.

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