Kubernetes minikube nginx Ingress с базовым c auth, cors и сессионным возвратом 403 - PullRequest
0 голосов
/ 15 апреля 2020

Я играю с Minikube, чтобы развернуть простое приложение с весенней загрузкой, которое вы можете найти здесь: https://github.com/shopKubernetesSpringboot

minikube v1.9.2 on Ubuntu 18.04
Kubernetes v1.17.0 on Docker 19.03.5 ...

Я использую cors, session, basi c аутентификация Он работает вне кластера Minikube (со встроенным весенним загрузочным нетти-сервером), но я не могу заставить его работать с nginx -ingress.

В основном это два продукта на основе микросервисов и корзина. Список продуктов и корзин (GET) работает. Но я не могу заставить работать корзину добавления (POST), она всегда возвращает в браузере следующее:

XHRPOST http://192.168.39.94/cart/add
[HTTP/1.1 403 Forbidden 37ms]
CSRF Token has been associated to this client

Серверная часть получает X-XSRF-TOKEN:

[or-http-epoll-3] oswsadapter.HttpWebHandlerAdapter: [e8b45b1f-2] HTTP POST "/ cart / add", заголовки = [хост: "192.168.39.94", X-запрос-идентификатор: "dc741d2765b9d0c585b7f73d0eb2b2b2b2 -Real-IP: "192.168.39.1", X-Forwarded-For: "192.168.39.1", X-Forwarded-Host: "192.168.39.94", X-Forwarded-Port: "80", X-Forwarded-Proto : "http", X-Scheme: "http", Content-Length: "120", User-Agent: "Mozilla / 5.0 (X11; Ubuntu; Linux x86_64; rv: 75.0) Gecko / 20100101 Firefox / 75.0" , Accept: "application / json, text / plain, / ", Accept-Language: "en-GB, en; q = 0.5", Accept-Encoding: "gzip, deflate", Content -Тип: "application / json; charset = utf-8", авторизация: "Basi c dXNlcjp1c2Vy", X-XSRF-TOKEN: "17e1b013-98b3-4064-8173-bf3af4ce8bc7", происхождение: "http://localhost: 3000", Referer:" http://localhost: 3000 /"]

[or-http-epoll-3] oswsadapter.HttpWebHandlerAdapt er: [e8b45b1f-2] Завершено 403 FORBIDDEN, headers = [Vary: «Origin», «Access-Control-Request-Method», «Access-Control-Request-Headers», Access-Control-Allow-Origin: «http://localhost: 3000", Access-Control-Allow-Credentials:" true ", Content-Type:" text / plain ", Cache-Control:" no-cache, no-store, max-age = 0, must-revalidate ", Pragma:" no-cache ", Expires:" 0 ", X-Content-Type-Options:" nosniff ", X-Frame-Options:" DENY ", X-XSS-Protection: "1; mode = block ", Referrer-Policy:" no-referrer ", длина контента:" 45 "]

Мой вход выглядит так:

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: shop-ingress
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/ssl-redirect: "false"
        nginx.ingress.kubernetes.io/affinity: cookie
        nginx.ingress.kubernetes.io/session-cookie-name: session
        nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
        nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
        nginx.ingress.kubernetes.io/enable-cors: "true"
        nginx.ingress.kubernetes.io/cors-allow-origin: "http://localhost:3000"
        nginx.ingress.kubernetes.io/cors-allow-headers: X-XSRF-TOKEN,Accept,Accept-Encoding,Accept-Language,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Origin,Connection,Content-Length,Content-Type,Host,Referer,User-Agent
        nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
        nginx.ingress.kubernetes.io/session-cookie-path: /cart
    spec:
      rules:
        - http:
            paths:
              - path: /product
                backend:
                  serviceName: product-svc
                  servicePort: 80
              - path: /cart
                backend:
                  serviceName: cart-svc
                  servicePort: 80

Служба корзины & pod

apiVersion: v1
kind: Service
metadata:
  name: cart-svc
  labels:
    app: shop
    name: cart
    tier: backend
spec:
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 120
  selector:
    app: shop
    name: cart
    tier: backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: rest-api-port
---
apiVersion: v1
kind: Pod
metadata:
  name: cart-pod
  labels:
    app: shop
    name: cart
    tier: backend
spec:
  containers:
    - name: cart
      image: davidgfolch/shop-cart:latest
      ports:
        - containerPort: 8080
          name: rest-api-port
      env:
        - name: SPRING_PROFILES_ACTIVE
          value: "prod"

SpringSecurityConfig. java

@Configuration
@Slf4j
public class SecurityConfig {

    @Value("${com.dgf.shopCart.cors.origins}")
    private String corsOrigins;

    @Bean
    SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) {
        return http
                .csrf().csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse()).and()
                .cors(c -> c.configurationSource(cors()))
                .authorizeExchange()
                .anyExchange().authenticated()
                .and()
                .httpBasic()
                .and()
                .build();
    }

    private UrlBasedCorsConfigurationSource cors() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin(corsOrigins);
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return source;
    }
}

Сравнение журналов с и без Kubernetes

С Kubernetes SESSION повар ie не прибывает на задний план- end (как показано в журналах):

HTTP POST "/ cart / add", headers = [Host: "192.168.39.94", X-Request-ID: "aba957e6cc3c8803c1734a2724a75fbf", X- Реальный IP: «192.168.39.1», X-Forwarded-For: «192.168.39.1», X-Forwarded-Host: «192.168.39.94», X-Forwarded-Port: «80», X-Forwarded-Proto: "http", X-Scheme: "http", Content-Length: "120", User-Agent: "Mozilla / 5.0 (X11; Ubuntu; Linux x86_64; rv: 75.0) Gecko / 20100101 Firefox / 75.0", Accept: "application / json, text / plain, / ", Accept-Language: "en-GB, en; q = 0.5", Accept-Encoding: "gzip, deflate", Content- Тип: "application / json; charset = utf-8", Авторизация: "Basi c dXNlcjp1c2Vy", X-XSRF-TOKEN: "17e1b013-98b3-4064- 8173-bf3af4ce8bc7 ", Происхождение:" http://localhost: 3000", Рефери:" http://localhost: 3000 /"]

Без Kubernetes они do:

HTTP POST "/ cart / add", headers = [Host: "localhost: 8080", User-Agent: "Mozilla / 5.0 (X11; Ubuntu; Linux x86_64; rv: 75.0) Gecko / 20100101 Firefox / 75.0 ", Accept:" application / json, text / plain, /", Accept-Language:" en-GB, en; q = 0.5 ", Accept-Encoding: "gzip, deflate", Content-Type: "application / json; charset = utf-8", авторизация: "Basi c dXNlcjp1c2Vy", X-XSRF-TOKEN: "17e1b013-98b3-4064-8173 -bf3af4ce8bc7 ", длина содержимого:" 120 ", происхождение:" http://localhost: 3000", соединение:" keep-alive ", реферир:" http://localhost: 3000 /", Cook ie:" Idea-c3de9a37 = a5f5270f-e0e1-4807-92e2-79c126b768fc; XSRF-ЗНАК = 17e1b013-98b3-4064-8173-bf3af4ce8bc7; СЕССИЯ = eddb22e9-15f7-4b28-a422-36faa8a7f285 "]

Любой совет? Чего мне не хватает?

1 Ответ

0 голосов
/ 17 апреля 2020

Я наконец обнаружил, что липкие сессии не работают, если не указано spec.host для nginx -адресных версий до v.0.27.0 . См. запрос на выдачу .

. Поэтому необходимо обновить nginx -вход до версии 0.27.0, чтобы указанная выше конфигурация работала, или установить spec.host и (я надеюсь) включить добавление DNS. чтобы это работало. Доступ через DNS-имя de host:

    spec:
      host: myapp.example.com
      rules:
        - http:
            paths:
              - path: /product
                backend:
                  serviceName: product-svc
                  servicePort: 80
              - path: /cart
                backend:
                  serviceName: cart-svc
                  servicePort: 80

Здесь вы можете найти несколько связанных ссылок:

У меня будет тонкая настройка этот ответ, как только я получу рабочую версию.

  1. обновить входной контроллер minikube docker до 0.27.0 (ПРИМЕЧАНИЕ: еще не работает):
#minikube docker-env
#eval $(minikube -p minikube docker-env)
#docker images | grep ingress
#docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.27.1
#minikube stop && minikube start
#eval $(minikube -p minikube docker-env)
kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.1/deploy/static/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/mandatory.yaml
minikube stop && minikube start
...