весенняя загрузка thymeleaf k8s проблема перенаправления порта istio

#java #spring-boot #kubernetes

Вопрос:

У меня есть приложение Spring Boot, которое использует Thymeleaf в качестве движка шаблонов, закрепленного в кластере Kubernetes, в котором есть Istio. Я могу развернуть это приложение и запустить его. Я использую порт узла, и когда я проверяю запущенные службы, я получаю рабочий URL-адрес на порту 30314. Но всякий раз, когда я нажимаю ссылку в своем веб-приложении, она приводит меня к одному и тому же URL-адресу без номера порта, что, конечно, делает доступ невозможным, если я вручную не введу номер порта обратно. Честно говоря, я не знаю, что делать. Я серьезно застрял здесь на некоторое время.

Вот развертывание и обслуживание приложения Spring Boot:

 kind: Service
apiVersion: v1
metadata:
  name: springboot-k8s-mysql
  labels:
    name: springboot-k8s-mysql
spec:
  ports:
    - port: 8080
      protocol: TCP
  selector:
    app: springboot-k8s-mysql
  type: NodePort

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-k8s-mysql
spec:
  selector:
    matchLabels:
      app: springboot-k8s-mysql
  replicas: 1
  template:
    metadata:
      labels:
        app: springboot-k8s-mysql
    spec:
      containers:
        - name: springboot-k8s-mysql
          image: basiclogin
          imagePullPolicy: Never
          ports:
            - containerPort: 8080
          env:
          - name: DB_HOST
            valueFrom:
              configMapKeyRef:
                name: db-conf
                key: host
          - name: DB_NAME
            valueFrom:
              configMapKeyRef:
                name: db-conf
                key: name
          - name: DB_USERNAME
            valueFrom:
              secretKeyRef:
                name: db-root-credentials
                key: username
          - name: DB_PASSWORD
            valueFrom:
              secretKeyRef:
                name: db-root-credentials
                key: password
 

Вот мой файл application.properties, на всякий случай, если он вам понадобится:

 spring.datasource.url=jdbc:mysql://mysql/userdata?allowPublicKeyRetrieval=trueamp;useSSL=falseamp;serverTimezone=Europe/Madrid
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
logging.level.org.hibernate.SQL=debug
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.ddl-auto=update
server.servlet.session.timeout=2m
server.port=8080
 

Я выяснил, что созданные Thymeleaf URL-адреса успешно содержат номер порта и работают правильно.
Но всякий раз, когда приложению нужно пройти какую-либо логику перед перенаправлением, оно должно пройти через контроллер, который не может создать связь с текущим портом.

Вот мой контроллер пружинной загрузки:

 package com.millan.springboot.form.app.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import com.millan.springboot.form.app.entity.User;
import com.millan.springboot.form.app.repository.UserRepository;


@Controller
public class AppController {

    @Autowired
    private UserRepository userRepo;
    
    //--------
    
    @GetMapping("")
    public String viewHomePage() {
        
        return "index";
    }
    
    @GetMapping("/register")
    public String showRegistrationForm(Model model) {
        model.addAttribute("user", new User()); // Crea un nuevo user.
        
        return "signup_form";
    }
    
    @PostMapping("/process_register")
    public String processRegister(User user) {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String encodedPassword = passwordEncoder.encode(user.getPassword());
        user.setPassword(encodedPassword);
        userRepo.save(user);
        
        return "register_success";
    }
    
    @GetMapping("/users")
    public String listUsers(Model model) {
        List<User> listUsers = userRepo.findAll();
        model.addAttribute("listUsers", listUsers);
        
        return "users";
    }
    
    @GetMapping("/login")
    public String userLogin() {
        return "login";
    }
    
    
}

 

And here’s one of the Thymeleaf templates.

 <!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Login Basico con Thymeleaf</title>
<link rel="stylesheet" type="text/css"
    href="/webjars/bootstrap/css/bootstrap.min.css" />
<script type="text/javascript" src="/webjars/jquery/jquery.min.js"></script>
<script type="text/javascript"
    src="/webjars/bootstrap/js/bootstrap.min.js"></script>
</head>
<body>
    <div class="container text-center">
        <h1>Login y registro</h1>
        <h3>
            <a th:href="@{/users}">List of Users</a>
        </h3>
        <h3>
            <a th:href="@{/register}">Register</a>
        </h3>
        <h3>
            <a th:href="@{/login}">Login</a>
        </h3>
    </div>
</body>
</html>
 

If there’s anything else you need to take a look at in order to troubleshoot this, i’ll happily oblige.