ما هو دخول؟
الدخول هو النوع الأساسي من الموارد في Coubertene. إذا قمت ببساطة بتعريف كائن من النوع Ingress in kubernetis ، فلن يحدث شيء.
لكي يبدأ هذا المورد العمل في نظام Kubernetis ، يجب تثبيت وحدة التحكم في الدخول ، والتي ستقوم بتكوين بروكسي عكسي وفقًا لكائن Ingress.
يتكون Ingress Controller من مكونين - وكيل عكسي ووحدة تحكم تتصل بخادم واجهة برمجة تطبيقات Kubernetes. يستمع الوكيل العكسي لحركة المرور الواردة على المنافذ المحددة في الإعدادات (عادةً ما يتم تحديد المنفذ 80 فقط في الإعدادات الافتراضية). يمكن أن تكون وحدة التحكم عبارة عن برنامج خفي منفصل (كما هو الحال في nginx) أو مدمج في الخادم الوكيل (كما في نظام traefik).
ليس كل مزودي kubernetes السحابيين يقومون بتثبيت Ingress Controller افتراضيًا.
يمكن تشغيل وحدات التحكم إما DaemonSet أو نشر. من المثالي استخدام DaemonSet كوحدة التحكم في الدخول الوحيدة ، بحيث يستمع الوكيل العكسي إلى جميع عناوين IP للعمال. يكون النشر مثاليًا إذا كان هناك موازن أمام وحدة التحكم في Ingress - من مزود kubernetis (GKE ، AKS) ، MetalLB إذا كان هناك قسط أو haproxy / nginx منتظم مثبت على الخادم (التكوين اليدوي مطلوب). مع هذا التثبيت ، من الممكن تثبيت العديد من أدوات التحكم في الدخول.
كيف تحصل حركة المرور الواردة إلى مراقب الدخول
في جميع الحالات ، يستمع الوكيل العكسي في وحدة التحكم في الدخول إلى المنافذ حيث ينتظر اتصالات HTTP / https.
يمكن الوصول إلى حركة المرور في هذه المنافذ بثلاث طرق:
- NodePort (على منافذ عشوائية في نطاق 30000-32767)
- HostPort (يمكن تعليقه على المنافذ 80 ، 443)
- شبكة المضيف - ستقوم Pod بتعيين منافذها على واجهة الشبكة العامة (أي ستكون جميع منافذ الحاويات مفتوحة)
NodePort
إن تثبيت Ingress Controller على NodePort بدون LoadBalancer ليس له معنى كبير ، لأن عنوان URL سيشمل المنفذ المحدد في NodePort http://domain.example.org:32200/ .
بالنسبة لهذا الخيار ، من الأفضل استخدام عمليات النشر. هذا سيجعل من الأسهل قياس عدد القرون المسؤولة عن حركة المرور الواردة ، وتسجيل العقدة بالنسبة لهم ، وتشغيل عدة وحدات تحكم في الدخول (على سبيل المثال ، للإنتاج والتدريج).
مضيف
عند استخدام HostPort ، يتم إعادة توجيه المنفذ من المضيف حيث يتم تشغيله تحت نفس Pod. ليست هناك حاجة إلى LoadBalancer للدخول ، ولكن لكي يعمل الموقع في DNS ، يجب أن تشير إلى أن عنوان المجال موجود على جميع العقد.
مثال تكوين DNS لـ 3 عمال:
ingress.example.org A 10.0.0.1 ingress.example.org A 10.0.0.2 ingress.example.org A 10.0.0.3 www.example.org CNAME ingress.example.org
لهذا التثبيت ، من الأفضل استخدام DaemonSet منذ ذلك الحين يسمح لك بتشغيل أكثر من قرنة على مضيف. النشر ممكن ، لكن الأمر لا معنى له منذ ذلك الحين يجب تسجيل التقارب بحيث لا يتم تعيين 2 Pods لمضيف واحد ، وإلا سيكون هناك تعارض على المنافذ.
مثال التكوين ل traefik kind: DaemonSet apiVersion: extensions/v1beta1 metadata: name: traefik-ingress-controller namespace: traefik labels: k8s-app: traefik-ingress-lb spec: template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb namespace: traefik spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 containers: - image: traefik:1.7.6 name: traefik-ingress-lb ports: - name: http containerPort: 80 hostPort: 80 - name: https containerPort: 443 hostPort: 443 - name: admin containerPort: 8080 hostPort: 8080 securityContext: capabilities: drop: - ALL add: - NET_BIND_SERVICE args: - --api - --kubernetes - --logLevel=DEBUG - --entrypoints=Name:https Address::443 TLS - --entrypoints=Name:http Address::80 - --defaultentrypoints=http
شبكة المضيف
عند تشغيل Ingress Controller على شبكة مشتركة مع المضيف ، لن يكون هناك حاجة إلى إعادة توجيه المنافذ ، ولكن في هذه الحالة ، ستكون جميع المنافذ المفتوحة في Pod متاحة من الإنترنت. من الأفضل استخدام DaemonSet للتشغيل. الأسباب هي نفسها كما هو الحال مع HostPort - لتجنب تعارض المنفذ.
ماذا تختار
إذا كان هناك LoadBalancer في الإدخال - NodePort ، إن لم يكن - HostPort + DNS Round Robin. للتجارب ، يمكنك تجربة شبكة المضيف ، لكنها ليست آمنة.