一千萬個為什麽

搜索

在k8s中使用traefik基於源ip處理請求



我有一個使用 traefik 的k8s集群(我自己的硬件上有三個vms;沒有aws,谷歌雲......)( 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 讀取。其中一些應用程序是內部的,如 kibanatraefik-web-ui ,還有一些是外部應用程序,就像應用程序本身一樣。我通過使用不同的dns條目(例如 https://dashboard.internal.mycoolapp.comhttps://app1.external.mycoolapp.com )來區分這兩者。內部dns不是從外部世界(=互聯網)解決,而外部是(如谷歌dns)。

這是設置。現在,讓我們來解決這個問題:

幾天前,我想:如果我在一臺機器上為 * .internal.mycoolapp.com 創建一個通配符dns條目,那就是我的網絡外部,並將其解析為外部dns條目解析為的相同IP。瞧,我的內部服務可以從外面訪問!

所以這當然是一個不可接受的狀態。所以我正在尋找解決方案。

首先想到的是,如果請求者的主機ip在我們的網絡之外,則阻止所有對內部服務規則的傳入請求:

...
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>(S)NAT ),因此每個請求都有一個內部主機地址集。

所以這就是我目前正在尋找解決方案的重點。

據推測,一種解決方案是將 traefik-ingress-controller 部署為部署,但作為守護進程設置並將其直接綁定到主機上的端口(如此處所述 https://docs.traefik.io/user-guide/ kubernetes /#部署-trfik-使用-A-部署或 - daemonset )。我昨天嘗試將我的traefik配置更改為守護進程集並向其添加 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

toml文件只包含http-to-https重定向和證書文件的路徑。

我還有其他一些解決方案,但是他們都有缺點,他們需要更多的東西部署和維護,比如另一個端口上的第二個入口控制器,只處理特定的入口對象,或者新的在整個集群前面的外部請求的入口點,當它不是我的外部地址時,它會從請求中刪除主機頭(這是否適用於ssl?)。

所以我真的需要一些幫助。提前致謝!

轉載註明原文: 在k8s中使用traefik基於源ip處理請求

一共有 0 個回答: