Estoy ejecutando una aplicación en un servicio de kubernetes en Azure y la configuré con un controlador de ingreso NGINX y una dirección IP pública con un FQDN. Todo esto funcionaba bien.
Luego quise agregar seguridad mediante el uso del proxy oauth2 para el inicio de sesión de terceros. Me gustaría mantener mi configuración en un controlador de entrada y un oauth2_proxy por espacio de nombres, con varias aplicaciones ejecutándose juntas. Como Azure no admite el uso de subdominios para esto, he estado usando rutas para enrutar a la aplicación correcta. He visto ejemplos, como este , sobre cómo usar un oauth2_proxy para múltiples subdominios, pero ¿es posible que funcione con múltiples rutas?
Configuración
Esta es la configuración de trabajo actual con una sola aplicación, ubicada en root /
. Me gustaría cambiar a una ruta específica de la aplicación y la capacidad de ejecutar varias aplicaciones en diferentes rutas. p.ej. /my-app
, /another-app
etc.
oauth2-proxy-config.yaml
config: existingSecret: oauth2-proxy-creds extraArgs: whitelist-domain: my-fqdn.uksouth.cloudapp.azure.com cookie-domain: my-fqdn.uksouth.cloudapp.azure.com email-domain: example.com provider: github ingress: enabled: true path: /oauth2 hosts: - my-fqdn.uksouth.cloudapp.azure.com annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt-prod # cert-manager cluster issuer set up for Let's Encrypt tls: - secretName: my-fqdn-tls # TLS generated by letsencrypt-prod hosts: - my-fqdn.uksouth.cloudapp.azure.com
Esto se instala con el siguiente comando helm
helm upgrade oauth2-proxy --install stable/oauth2-proxy --namespace $NAMESPACE --reuse-values --values oauth2-proxy-config.yaml
app-ingress.yaml
apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1 kind: Ingress metadata: name: nginx-ingress annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt-prod # nginx.ingress.kubernetes.io/rewrite-target: /$2 # Not working with the /oauth2 path and not needed when using root path for the app nginx.ingress.kubernetes.io/auth-url: "https://my-fqdn.uksouth.cloudapp.azure.com/oauth2/auth" nginx.ingress.kubernetes.io/auth-signin: "https://my-fqdn.uksouth.cloudapp.azure.com/oauth2/start?rd=https%3A%2F%2F$host$request_uri" spec: tls: - secretName: my-fqdn-tls hosts: - my-fqdn.uksouth.cloudapp.azure.com rules: - host: my-fqdn.uksouth.cloudapp.azure.com http: paths: - path: / # I would like to be able to use something like '/path1(/|$)(.*)' instead of root. backend: serviceName: my-app servicePort: 80
Claro, es factible con múltiples rutas de acceso dentro de una sola definición de recurso de ingreso, consulte este ejemplo de trabajo:
apiVersion: extensions/v1beta1 kind: Ingress metadata: labels: app: hello-worlds name: hello-wrolds annotations: cert-manager.io/issuer: selfsigned-issuer kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/auth-signin: "https://my-fqdn.uksouth.cloudapp.azure.com/oauth2/start?rd=$escaped_request_uri" nginx.ingress.kubernetes.io/auth-url: "https://my-fqdn.uksouth.cloudapp.azure.com/oauth2/auth" nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: my-fqdn.uksouth.cloudapp.azure.com http: paths: - path: /my-app/(.*) backend: serviceName: my-app servicePort: 5000 - path: /another-app/(.*) backend: serviceName: another-app servicePort: 5000 tls: - hosts: - my-fqdn.uksouth.cloudapp.azure.com secretName: certmgr-selfsign-tls-requires-ouath
En mi caso, para ambos backends, la carpeta raíz de la aplicación es '/hello', por lo que la URL solicitada es respectivamente:
https://my-fqdn.uksouth.cloudapp.azure.com/my-app/hello https://my-fqdn.uksouth.cloudapp.azure.com/another-app/hello