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
.