How can i configure ingress and nginx ingress controller to send http traffic to port 80 and https traffic to 443 port, with the same host and path

8/13/2019

I have a service for my app:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: app
  name: app
spec:
  type: ClusterIP
  ports:
    - name: "443"
      port: 443
      targetPort: 443
    - name: "80"
      port: 80
      targetPort: 80
  selector:
    io.kompose.service: app

and ingress:

  apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: 200m
spec:
  rules:
  - host: test.app.com
    http:
      paths:
        - backend:
            serviceName: app
            servicePort: 443

and ingress controller:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
      annotations:
        prometheus.io/port: "10254"
        prometheus.io/scrape: "true"
    spec:
      serviceAccountName: nginx-ingress-serviceaccount
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.0
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx
            - --annotations-prefix=nginx.ingress.kubernetes.io
            - --enable-ssl-passthrough
          securityContext:
            allowPrivilegeEscalation: true
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            # www-data -> 33
            runAsUser: 33
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
            - name: http
              containerPort: 80
            - name: https
              containerPort: 443
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10

The problem is that the ingress controller send's both http and https traffic to port 443. i want to configure it to be able to send http traffic to port 80 and https traffic to port 443. how can i do that? or there is a something i don't understand correctly?.

-- eitann
kubernetes
nginx
nginx-ingress

2 Answers

8/13/2019

Can you update a question to a bit more precise?

I can deduct in 2 cases.

1) If you want to send the same traffic to port 80 and 443?

2) You want traffic received on port 443 in ingress to send to port 80 to pod.

Still, I will give in short.

Case 1

It is not possible. you have to opt for istio etc which provide traffic mirroring.

Case 2

It is valid and used a lot called SSL offloading. for that, you have to remove below annotation and update ingress to send traffic on port 80 than 443.

nginx.ingress.kubernetes.io/ssl-passthrough: "true"
-- yogesh kunjir
Source: StackOverflow

8/13/2019
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  rules:
  - host: my.url.com
    http:
      paths:
      - path: /
        backend:
          serviceName: servicea
          servicePort: 80
      - path: /
        backend:
          serviceName: servicea
          servicePort: 443
-- Harsh Manvar
Source: StackOverflow