Я играю с 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 "]
Любой совет? Чего мне не хватает?