3 votes

Transférer l'IP réelle du demandeur dans l'ingress NGINX de K3S

J'ai mis en place un environnement Kubernetes K3S dans mon Home-Lab privé sur des Raspberry PIs afin de m'initier à Kubernetes (Noob-Alert), en utilisant NGINX comme contrôleur Ingress et je suis un peu bloqué pour passer l'IP réelle des requêtes aux Pods cibles, dans mon cas une instance Nextcloud. La version de K3S est v1.22.5+k3s1 .

Le K3S a été mis en place en utilisant Docker comme conteneur d'exécution et avec l'option --no-deploy traefik option.

Après cela, j'ai déployé le contrôleur NGINX Ingress en utilisant

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/baremetal/deploy.yaml

Ensuite, après avoir déployé les pods Nextcloud, j'ai déployé l'Ingress :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - my.own-dns.org
    secretName: very-secret-ssl-secret
  ingressClassName: nginx
  rules:
  - host: my.own-dns.org
    http:
      paths:
        - path: /somepath
          pathType: Prefix
          backend:
            service:
              name: someservice-service
              port:
                number: 8081
        - path: /
          pathType: Prefix
          backend:
            service:
              name: nextcloud-service
              port:
                number: 80

Dans le déploiement de l'IngressController, j'ai ajouté les entrées suivantes dans le ConfigMap :

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    helm.sh/chart: ingress-nginx-4.0.10
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 1.1.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  allow-snippet-annotations: 'true'
  compute-full-forwarded-for: 'true'
  use-forwarded-headers: 'true'
  enable-real-ip: 'true'
  proxy-add-original-uri-header: 'true'
  forwarded-for-header: 'X-Forwarded-For'

et changé le ServiceType du service http en LoadBalancer Ainsi, mon service de l'IngressController ressemble à ceci :

apiVersion: v1
kind: Service
metadata:
  annotations:
  labels:
    helm.sh/chart: ingress-nginx-4.0.10
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 1.1.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: LoadBalancer
  ipFamilyPolicy: SingleStack
  ipFamilies:
    - IPv4
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
      appProtocol: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
      appProtocol: https
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/component: controller

Jusqu'à présent, tout va bien, l'accès à l'instance Nextcloud depuis l'Internet fonctionne parfaitement, y compris la redirection vers https, etc. Mais le journal d'audit Nextcloud ne reçoit qu'une IP interne du cluster comme IP source (étonnamment, aucune IP d'un service que j'exécute à l'intérieur du cluster), et non la vraie IP du monde extérieur.

Alors, qu'est-ce que je rate ? J'ai essayé de définir use-proxy-protocol à true, mais cela entraîne un ERR_CONNECTION_RESET .

1voto

Johnson Points 21

Avez-vous essayé de définir le paramètre spec.externalTrafficPolicy sur local ? Jetez un coup d'œil à documentation de kubernetes sur les implications.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X