K8s में traefik के साथ स्रोत आईपी के आधार पर अनुरोध संभाल

मेरे पास एक के 8 एस क्लस्टर है (मेरे स्वयं के हार्डवेयर पर तीन वीएमएस; कोई aws, Google क्लाउड, ...) जो traefik ( https://traefik.io/ ) पृष्ठभूमि में सेवाओं/तैनाती को संबोधित करने के लिए एक रिवर्स प्रॉक्सी के रूप में।

For this I use the deployment-variant from this part of the documentation: https://docs.traefik.io/user-guide/kubernetes/#deploy-trfik-using-a-deployment-or-daemonset

अब मेरे पास क्लस्टर में कई अनुप्रयोग तैनात हैं, जिनमें सभी को कुछ प्रविष्टियां असाइन की गई हैं, जिन्हें traefik-ingress-controller द्वारा पढ़ा जाता है। उनमें से कुछ एप्लिकेशन आंतरिक हैं, जैसे किबाना या traefik-web-ui , और कुछ अन्य बाहरी हैं, जैसे एप्लिकेशन स्वयं। मैं अलग-अलग डीएनएस प्रविष्टियों (जैसे https://dashboard.internal.mycoolapp.com और https://app1.external.mycoolapp.com ) करके उन दोनों को अलग करता हूं और आंतरिक डीएनएस बाहरी दुनिया (= इंटरनेट) से हल नहीं होता है जबकि बाहरी है (जैसे Google डीएनएस)।

यह सेटअप के लिए है। अब, चलो समस्या पर आते हैं:

कुछ दिन पहले, मैंने सोचा था: क्या होता है, अगर मैं एक मशीन पर *। Internal.mycoolapp.com के लिए वाइल्डकार्ड डीएनएस प्रविष्टि बनाता हूं, जो मेरे नेटवर्क के बाहर है, और बस इसे हल करें एक ही आईपी (बाहरी) बाहरी डीएनएस प्रविष्टि को हल करता है। और voila, मेरी आंतरिक सेवाओं बाहर से सुलभ हैं!

तो यह निश्चित रूप से एक राज्य है जो स्वीकार्य नहीं है। तो मैं इस पर समाधान की तलाश में हूं।

सबसे पहले क्या दिमाग आया था आंतरिक अनुरोधों के नियमों पर सभी आने वाले अनुरोधों को अवरुद्ध करना, अगर अनुरोधकर्ता का होस्ट आईपी हमारे नेटवर्क से बाहर है:

...
kind: Ingress
metadata:
  name: app1
  namespace: default
  annotations:
    traefik.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/8"
    ingress.kubernetes.io/whitelist-x-forwarded-for: "true"
...

सैद्धांतिक रूप से यह काम करना चाहिए। लेकिन जैसा कि मैंने बाद में पाया, traefik-ingress-controller तक पहुंचने से पहले, सभी अनुरोधों को kube-proxy द्वारा नियंत्रित किया जाता है और उनके होस्ट पते स्थानीय पते पर अनुवादित होते हैं (< em> (एस) एनएटी ), इसलिए प्रत्येक अनुरोध में एक आंतरिक होस्ट पता सेट होता है।

तो यही वह बिंदु है जिसे मैं वर्तमान में समाधान ढूंढ रहा हूं।

माना जाता है कि एक समाधान traefik-ingress-controller को तैनाती के रूप में नहीं तैनात करना है, लेकिन एक डिमन सेट के रूप में और मेजबान पर बंदरगाहों को सीधे बांधें (जैसा कि यहां बताया गया है https://docs.traefik.io/user-guide/ Kubernetes/# तैनाती-trfik का इस्तेमाल करने वाली एक तैनाती या daemonset )। मैंने कल अपनी ट्रेफिक कॉन्फ़िगरेशन को एक डेमन सेट में बदलकर कोशिश की और NET_BIND_SERVICE क्षमता को जोड़ा, लेकिन यह वास्तव में वहां कुछ भी नहीं बदला। तो क्या किसी को कोई विचार है कि मैंने वहां क्या गलत किया होगा? या किसी को इंजेक्शन नियंत्रक के माध्यम से वास्तविक अनुरोधकर्ता होस्ट को पास करने के तरीके पर एक अच्छा कैसे/ट्यूटोरियल/... है?

Traefik के लिए मेरी वर्तमान कॉन्फ़िगरेशन फ़ाइल यहां दी गई है:

---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: traefik-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - image: traefik:v1.6.4
        name: traefik-ingress-lb
        volumeMounts:
        - mountPath: /ssl/external
          name: ssl-external
        - mountPath: /ssl/internal
          name: ssl-internal
        - name: traefik-toml
          subPath: traefik.toml
          mountPath: /config/traefik.toml
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443
        - name: admin
          containerPort: 8080
        args:
        - --configfile=/config/traefik.toml
        - --api
        - --kubernetes
        - --logLevel=INFO
      volumes:
      - name: ssl-external
        secret:
          secretName: external.mycoolapp.com.cert
      - name: ssl-internal
        secret:
          secretName: internal.mycoolapp.com.cert
      - name: traefik-toml
        configMap:
          name: traefik-toml
---
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - protocol: TCP
    port: 80
    name: web
  - protocol: TCP
    port: 443
    name: sweb
  externalIPs:
  - 10.2.3.1
  - 10.2.3.2
  - 10.2.3.3

टॉम-फ़ाइल में केवल http-to-https रीडायरेक्ट और प्रमाणपत्र फ़ाइलों के पथ शामिल हैं।

मेरे मन में कुछ अन्य समाधान हैं, लेकिन उनके पास नकारात्मकता है कि उन्हें किसी अन्य बंदरगाह पर दूसरे प्रवेश नियंत्रक की तरह तैनात और रखरखाव की आवश्यकता होती है, जो केवल विशिष्ट प्रवेश वस्तुओं या एक नया संभालती है पूरे क्लस्टर के सामने बाहरी अनुरोधों के लिए एंट्रीपॉइंट, जो होस्ट हेडर को अनुरोधों से हटा देता है, जब यह मेरा बाहरी पता नहीं होता है (क्या यह एसएसएल के साथ भी काम करता है?)।

तो मुझे इस पर कुछ मदद चाहिए। अग्रिम में धन्यवाद!

2

कोई जवाब नहीं है

0