Traefik كوحدة تحكم دخول K8S

ليس سرا أن K8S لديها مجتمع ممتاز ووثائق جيدة بشكل عام. يمكنك أن تجد فيه بسهولة الإجابة على العديد من الأسئلة. ولكن مثل أي وثائق أخرى ، لا يمكنها تغطية كل شيء على الإطلاق. في هذه المقالة سأحاول تقديم تعليمات مفصلة حول كيفية نشر وتكوين Traefik لاستخدامها كوحدة تحكم Ingress.


الصورة


ما هو الدخول؟


Ingress هو كائن API يتحكم في الوصول الخارجي إلى الخدمات في مجموعة ، بشكل أساسي من خلال HTTP / HTTPS. لكي يعمل مورد Ingress ، تحتاج إلى وحدة تحكم Ingress. إذا كنت تستخدم GCE ، فسيتم نشر وحدة تحكم Ingress بالفعل إلى المعالج. ومع ذلك ، إذا قمت بنفسك بتنزيل المجموعة ، على سبيل المثال من kops إلى AWS ، فستحتاج إلى نشر وحدة تحكم Ingress بنفسك. على minikube ، يتم حل ذلك عن طريق تضمين الوظيفة الإضافية Ingress.


وحدات تحكم الدخول


يمكن تنفيذ دور وحدة تحكم Ingress بواسطة NGINX Ingress Controller ، Kong ، Octavia Ingress Controller ، إلخ. في هذه المقالة سننظر في أداة مثل Traefik ونرى كيف يمكنك استخدامها كوحدة تحكم Ingress للخدمات في مجموعة.


لماذا؟


لماذا تستخدم وحدة تحكم Ingress إذا كان بإمكانك توفير الوصول إلى كل خدمة من خلال NodePort أو LoadBalancer ؟ باختصار ، يسمح هذا بنقطة مركزية واحدة للتوكيل لكل حركة المرور. بمعنى ، باستخدام وحدة تحكم Ingress ، تحتاج فقط إلى LoadBalancer لـ Traefik ولا شيء أكثر. ستحل هذه الحزمة كل حركة المرور.


مكونات Traefik


أعلن Traefik عن دعم Kubernetes Ingress في الإصدار 1.4. ومع ذلك ، فإن Traefik 1.7 الذي تم إصداره مؤخرًا يحتوي على خيار الخدمة publishedService, والذي يمكنه تحديث حقل status في Ingress ، والذي لم يكن في الإصدارات السابقة. فيما يلي قائمة بالمكونات المطلوبة للتشغيل.


إنشاء:


  • مساحة الاسم
  • حساب الخدمة
  • سر TLS
  • دور الكتلة
  • دور دور الكتلة
  • تكوين
  • نشر
  • خدمة http و https
  • خدمة لوحة القيادة Traefik
  • دخول

مساحة الاسم


إنشاء مساحة اسم:


 kubectl create namespace traefik 

TLS Secret


(تقريبًا لكل. - في المثال أدناه ، لسبب ما ، يكرر المؤلف نفس التكوين ، راجع التكوين الحالي في ملف README المقدم بواسطة الرابط أدناه)


قم أولاً بإنشاء شهادة:


 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com" 

إنشاء شهادة TLS:


 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com" 

إنشاء سر:


 kubectl create secret tls traefik-ui-tls-cert --key ./tls.key --cert ./tls.crt 

من أجل الراحة ، قمت بعمل ملف README باستخدام هذه الأوامر وقمت بتحميله إلى GitHub .


ConfigMap


 --- apiVersion: v1 kind: ConfigMap metadata: name: traefik-configmap namespace: traefik data: traefik.toml: | defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] CertFile = "/ssl/tls.crt" KeyFile = "/ssl/tls.key" [entryPoints.traefik] address = ":8080" [entryPoints.traefik.auth.basic] users = ["admin:$apr1$zjjGWKW4$W2JIcu4m26WzOzzESDF0W/"] [kubernetes] [kubernetes.ingressEndpoint] publishedService = "traefik/traefik" [ping] entryPoint = "http" [api] entryPoint = "traefik" 

بشكل افتراضي ، EntryPoints هي منافذ 80 و 443 .


يستمع EntryPoint http :80 وليس لديه قواعد إضافية


يستمع EntryPoint https على :443 ويحتوي على قاعدة لتوصيل شهادات TLS.


يستمع EntryPoint traefik :8080 ويستخدم المصادقة الأساسية. اسم المستخدم هو admin ، كلمة المرور هي admin .


يتم تعريف نقطة النهاية المقابلة Ingress في Kubernetes عن طريق تحديد publishService ويجب أن يتكون من قيمة namespace واسم service لـ Traefik. في هذه الحالة ، هو traefik / traefik .


ping أو الفحص الصحي ستستخدم entryPoint http .


api أو dashboard / ui ستستخدم entryPoint traefik .


لاحظ أنه يمكنك تحديد نقاط إدخال إضافية باستخدام منفذ. يمكن لهذا المنفذ نقل حركة المرور إلى أي منفذ ، بدلاً من المنافذ الديناميكية و NodePort .


Clusterrole


يجب أن يكون لحساب خدمة Traefik إذن لتحديث حقل Ingress status . هذه معلمة مهمة ، ولم يتم تقديمها بعد في وثائق Traefik الرسمية :


 --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses/status verbs: - update 

الخطوط الستة الأخيرة مهمة جدًا للتشغيل الصحيح.


النشر


النشر واضح ومباشر للغاية. دعنا نذهب لفترة وجيزة من خلال الكتل الرئيسية:


 volumes: - name: traefik-ui-tls-cert secret: secretName: traefik-ui-tls-cert - name: traefik-configmap configMap: name: traefik-configmap 

حدد volumes ConfigMap و Secret ، والتي يمكن استخدامها بعد ذلك في volumeMounts .


 volumeMounts: - mountPath: "/ssl" name: "traefik-ui-tls-cert" - mountPath: "/config" name: "traefik-configmap" 

يتم إجراء فحوصات السلامة على المنفذ 80 ، كما هو محدد في ConfigMap.


فتح المنافذ لجميع نقاط الدخول المحددة في ملف التكوين:


 ports: - name: http containerPort: 80 - name: https containerPort: 443 - name: dashboard containerPort: 8080 

أذكرك أن بعض الأمثلة والوثائق على الإنترنت قديمة ، لذا لا تفوت قسم الحجج اللازمة لكي يعمل Traefik:


 args: - --logLevel=INFO - --configfile=/config/traefik.toml 

لا تمرر علامات وسيطات إضافية ، مثل -api أو -ping أو -kubernetes ، لأن هذا سيتجاوز الإعدادات المحددة في ملف التكوين.


الخدمة


أول الخدمات يحدد Loadbalancer لـ entryPoints http و https . إذا نظرت إلى مجموعة الأمان (Ingress) الخاصة بـ LoadBalancer ، فسترى المنفذين 80 و 443 مفتوحين هناك. ستقوم K8s بإنشاء LoadBalancer وتوصيله بالعقد التي يعمل عليها Traefik. إذا كنت تريد إنشاء ELB داخلي ، مثلي ، فأنت بحاجة إلى تحديد التعليقات التوضيحية:


 --- kind: Service apiVersion: v1 metadata: name: traefik namespace: traefik annotations: {} # service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0 spec: selector: k8s-app: traefik-ingress ports: - protocol: TCP port: 80 name: http - protocol: TCP port: 443 name: https type: LoadBalancer 

الخدمة (للوحة البيانات)


الآن الجزء الممتع! نظرًا لأن Dashboard تستخدم المصادقة الأساسية ، فقد احتجت إلى https . لاستخدام SSL ، نحتاج إلى إعادة توجيه حركة المرور إلى المنفذ :8080 ، الذي تعمل عليه لوحة التحكم. كما ترون ، إنه بسيط للغاية. كل السحر يحدث في الدخول.


 --- kind: Service apiVersion: v1 metadata: name: traefik-dashboard namespace: traefik spec: selector: k8s-app: traefik-ingress ports: - port: 8080 name: dashboard 

الدخول (للوحة العدادات)


يكمن السر في أن حركة المرور الآمنة إلى لوحة البيانات تتم من خلال Traefik نفسها. تتم إدارة Traefik في Ingress باستخدام التعليقات التوضيحية لـ Traefik :


 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-dashboard-ingress namespace: traefik annotations: kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/frontend-entry-points: http,https traefik.ingress.kubernetes.io/redirect-entry-point: https traefik.ingress.kubernetes.io/redirect-permanent: "true" spec: rules: - host: traefik-ui.example.com http: paths: - path: / backend: serviceName: traefik-dashboard servicePort: 8080 

استغرق الأمر 4 تعليقات توضيحية بسيطة وواضحة.


بالطبع ، لضمان الوظائف الكاملة ، تحتاج إلى إنشاء سجل DNS traefik-ui.example.com ، والذي traefik-ui.example.com إلى ELB الخاص بك.


هل سيكون من الجميل أن يتم ذلك تلقائيًا؟ ليست مشكلة ، سأكتب عن الإنشاء التلقائي لسجلات DNS في المقالة التالية.


المراجع


يمكن تنزيل ملف loy.yaml النهائي من مستودع Github الخاص بي. إذا واجهتك أي صعوبات أثناء عملية الإعداد ، فلا تتردد في السؤال.


فراق الكلمات من المترجم


اقرأ مقالات أخرى على مدونتنا:


النسخ الاحتياطية للدولة في Kubernetes


النسخ الاحتياطي لعدد كبير من مشاريع الويب غير المتجانسة


بوت برقية لـ Redmine. كيف تبسط الحياة لنفسك وللناس

Source: https://habr.com/ru/post/ar427655/


All Articles