Manipulando o pedido com base no ip de origem com o traefik em k8s

Eu tenho um cluster k8s (três vms no meu próprio hardware; sem aws, Google cloud, ...) que usa traefik ( https://traefik.io/ ) como um proxy reverso para endereçar serviços/implantações em segundo plano.

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

Agora tenho vários aplicativos implantados no cluster, que têm alguns ingressos atribuídos, que são lidos pelo traficik -gresso-controller . Algumas dessas aplicações são internas, como kibana ou traefik-web-ui , e algumas outras são externas, como as próprias aplicações. Eu distingo esses dois tendo diferentes entradas de DNS (como https://dashboard.internal.mycoolapp.com e https://app1.external.mycoolapp.com ) e o dns interno não é resolvido do mundo externo (= a internet) enquanto o externo é (como do Google dns).

Isso é para a configuração. Agora vamos ao problema:

Alguns dias atrás, pensei: O que acontece se eu criar uma entrada de caractere curinga para *. Internal.mycoolapp.com em uma máquina, que esteja fora da minha rede e resolva-a mesmo ip (s) a entrada externa do DNS resolve para. Et voila, meus serviços internos são acessíveis do lado de fora!

Portanto, este é, obviamente, um estado que não é aceitável. Então, estou procurando soluções sobre isso.

O que primeiro veio à mente foi bloquear todas as solicitações recebidas em regras para serviços internos, se o IP do solicitante estiver fora de nossa rede:

...
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"
...

Teoricamente isso deve funcionar. Mas como descobri mais tarde, antes de chegar ao traficik -gresso-controller , todas as solicitações são tratadas por kube-proxy e seus endereços de host são convertidos em endereços locais (< em> (S) NAT ), portanto, cada pedido tem um endereço de host interno definido.

Então, este é o ponto que estou procurando atualmente por uma solução.

Uma solução supostamente é implantar o trafic-ingresso-controlador não como uma implantação, mas como um daemon definido e vinculá-lo às portas no host diretamente (como dito aqui https://docs.traefik.io/user-guide/ kubernetes/# deploy-trfik-usando-a-implantação-ou-daemonset ). Eu tentei isso ontem apenas mudando minha configuração de trafik para um conjunto de daemon e adicionei o recurso NET_BIND_SERVICE , mas isso realmente não mudou nada lá. Então alguém tem alguma ideia do que eu poderia ter feito de errado ali? Ou alguém tem um bom tutorial/tutorial/... sobre como passar o host do solicitante real através do controlador de entrada?

Aqui está o meu arquivo de configuração atual para 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

O arquivo antigo contém apenas o redirecionamento http-para-https e os caminhos para os arquivos de certificado.

Tenho algumas outras soluções em mente, mas todas têm o lado negativo de precisarem de mais coisas implementadas e mantidas, como um segundo controlador de entrada em outra porta, que lida apenas com objetos de entrada específicos ou um novo ponto de entrada para solicitações externas na frente de todo o cluster, que exclui cabeçalhos de host de solicitações, quando não é meu endereço externo (isso funciona com SSL?).

Então eu realmente preciso de ajuda nisso. Desde já, obrigado!

2

Não há respostas.

0
dockerbr
dockerbr
3 859 dos participantes

Grupo brasileiro sobre Docker Código de conduta: http://bit.ly/codigo-de-conduta-do-grupo