Публикация

CORS в Kubernetes

Краткое руководство о том как настраивать CORS в Kubernetes с использованием Ingress NGINX.

CORS или же Cross-Origin-Resource-Sharing - это технология браузеров, которая позволяет предоставлять или ограничивать доступ к ресурсам другого домена.

Все управление CORS производится посредством предоставления заголовков HTTP ответов. А именно, если сервер разрешает получать данные с [bcode.dev](http://bcode.dev) для домена mydomain.com, то в ответе на запрос в заголовке должен быть вот такой заголовок:

Access-Control-Allow-Origin: https://mydomain.com

Проблема заключается в том, что используя Kubernetes мы не можем настраивать CORS внутри нашего приложения, так как прежде чем HTTP запрос вызовет сервис нашего приложения он попадает в Kubernetes Ingress и архитектурно более корректно решить даную задачу именно тут.

Ниже я буду использовать самый распространённый Ingress Controller от NGINX.

Теория

Используя механизм аннотаций в Kubernetes мы можем более гибко настраивать все Kubernetes объекты, именно так мы и поступим с настройкой нашего NGINX Controller.

Полный список всех доступных аннотаций для конкретной версии Ingress NGINX можно найти тут. Мы же воспользуемся вот этим аннотациями:

nginx.ingress.kubernetes.io/enable-cors: ...
nginx.ingress.kubernetes.io/cors-allow-origin: ...
nginx.ingress.kubernetes.io/cors-allow-methods: ...
nginx.ingress.kubernetes.io/cors-allow-credentials: ...
nginx.ingress.kubernetes.io/cors-allow-headers: ...

Давайте пройдемся по каждому:

  • enable-cors - если true, то включает обслуживание CORS посредством Ingress Controller, если false, то деактивирует обслуживание CORS и все аннотации CORS будут неактивны;
  • cors-allow-origin - указывает каким доменнам будет разрешенно обращаться к ресурсам нашего сервиса. Можно перечислять через запятую несколько в следующем формате "https://domain1.com, http://domain2.com";
  • cors-allow-methods - перечисление HTTP методов посредством которых будет разрешено обращаться к ресурсам сервиса. Пример использования "PUT, GET, POST, OPTIONS";
  • cors-allow-credentials - если true дает возможность передачи учетных данных во время обращения к ресурсам сервиса;
  • cors-allow-headers - перечисление всех разрешенных заголовков в HTTP запросе.

Конечно же CORS аннотация значительно больше и тут я показал лишь основные.

Пример

Ниже приведен реальный пример использования CORS в Ingress NGINX Controller:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/enable-cors: 'true'
    nginx.ingress.kubernetes.io/cors-allow-origin: 'https://bcode.dev'
    nginx.ingress.kubernetes.io/cors-allow-headers: '*'
    nginx.ingress.kubernetes.io/cors-allow-methods: 'PUT, GET, POST, OPTIONS'
    nginx.ingress.kubernetes.io/cors-allow-credentials: 'true'
spec:
  tls:
    - hosts:
        - api.domain.com
      secretName: api.domain.com
  rules:
    - host: api.domain.com
      http:
        paths:
          - path: /api
            backend:
              service:
                name: api-service
                port:
                  number: 8080
Опубликовано: 4 ноября 2021 г.Просмотров: 49

Комментарии

Мы не даем слово анониму 😶
Войдите, пожалуйста.

Еще никто не комментировал эту публикацию 🤔