จัดการบริบทเซิร์ฟเวอร์ในแอปพลิเคชัน Thymeleaf ที่ทำงานอยู่ในคลัสเตอร์ Kubernetes

ฉันมีแอปพลิเคชัน Spring Boot ที่มี Thymeleaf อยู่ที่ส่วนหน้า ฉันจำเป็นต้องปรับใช้แอปพลิเคชันกับคลัสเตอร์ Kubernetes ซึ่งจะสามารถเข้าถึงได้บนเส้นทางเช่นนี้ my-k8s-cluster.com/my-application

พาธบริบท /my-application ได้รับการกำหนดค่าบนฝั่ง Kubernetes และไม่ใช่หัวข้อของแอปพลิเคชันที่ต้องทราบ สามารถเปลี่ยนแปลงได้อย่างอิสระโดยไม่ต้องเปลี่ยนรหัสแอปพลิเคชัน

ปัญหา: โดยขึ้นอยู่กับว่าฉันใช้ URL หรือเซิร์ฟเวอร์ตามบริบทหรือไม่ -URL แบบสัมพันธ์ Thymeleaf อ้างอิงถึงรูทของเซิร์ฟเวอร์ ขณะที่แอปพลิเคชันกำลังทำงานบน my-k8s-cluster.com/my-application Thymeleaf ค้นหาทรัพยากรใน my-k8s-cluster.com/ และไม่สามารถโหลดได้

คำถาม: จะกำหนดค่า Thymeleaf ให้ทำงานอย่างอิสระด้วยบริบทที่แตกต่างกันได้อย่างไร

อัปเดต: การกำหนดค่า Ingress ของฉันมีลักษณะดังนี้:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: my-k8s-cluster.com
      http:
        paths:
          - path: /my-application/?(.*)
            backend:
              serviceName: my-service
              servicePort: 80

person Sasha Shpota    schedule 24.04.2020    source แหล่งที่มา
comment
คุณใช้ทางเข้าหรือไม่? กรุณาลงไฟล์ spec.   -  person Mr.KoopaKiller    schedule 24.04.2020
comment
@KoopaKiller โปรดตรวจสอบคำถามที่อัปเดต   -  person Sasha Shpota    schedule 24.04.2020
comment
คุณสามารถแบ่งปันฐานรหัสของคุณโดยระบุว่าคุณทำงานอย่างไร?   -  person Anish B.    schedule 28.04.2020
comment
ขออภัยที่ต้องตอบกลับด้วยวิธีนี้ แต่คุณลบคำถาม TeX ล่าสุดของคุณเนื่องจากไม่ตรงประเด็น ฉันหวังว่านั่นหมายความว่าคุณแก้ไขมันได้ ถ้าไม่เช่นนั้น การติดตั้งหนึ่งในการอ้างอิงพยายามตั้งค่าเขตเวลาของคุณด้วยเหตุผลบางประการ คุณสามารถเรียกใช้ dpkg-reconfigure tzdata ก่อนเพื่อให้แน่ใจว่าได้ตั้งค่าไว้แล้ว ฉันไม่ได้รับข้อผิดพลาดนั้นเมื่อฉันติดตั้งด้วย apt install texlive-full   -  person Davislor    schedule 11.05.2020
comment
ขอบคุณ @เดวิสเลอร์. ใช่ คำถามนี้ถูกทำเครื่องหมายว่าเป็นนอกประเด็น ดังนั้นฉันจึงลบคำถามนั้นออก อย่างที่คุณพูด ปัญหาเกี่ยวข้องกับการไม่ได้ตั้งค่าเขตเวลา (เพราะฉันอยู่ใน Docker) ฉันแก้ไขปัญหาด้วยการตั้งค่าตัวแปร DEBIAN_FRONTEND=noninteractive env ก่อนที่จะรันสคริปต์   -  person Sasha Shpota    schedule 11.05.2020
comment
@Davislor ขอบคุณสำหรับเวลาอีกครั้ง เห็นได้ชัดว่าฉันไม่สามารถโหวตคำตอบให้กับคำถามที่ไม่มีอยู่ได้ นั่นคือสาเหตุที่ฉันโหวตคำตอบของคุณสองสามข้อที่นี่ :) ขอให้มีความสุขมาก ๆ ในวันนี้นะ!   -  person Sasha Shpota    schedule 11.05.2020
comment
@SashaShpota ฉันซาบซึ้งกับความคิด แต่ การโหวตแบบอนุกรม อาจทำให้คุณเดือดร้อน วิธีที่ได้รับการยอมรับในการทำสิ่งที่คุณต้องการภายในกฎคือการให้รางวัล :)   -  person Davislor    schedule 11.05.2020


คำตอบ (2)


หากฉันเข้าใจปัญหาของคุณถูกต้อง วิธีแก้ไขปัญหาถัดไปอาจมีประโยชน์ในกรณีของคุณ

ตามเอกสารประกอบของ Spring Boot, context-path สามารถเปลี่ยนแปลงได้ผ่านไฟล์คุณสมบัติ

ตามค่าเริ่มต้น context-path คือ \ แต่การใช้การตั้งค่าถัดไป server.servlet.context-path ในไฟล์ที่มีคุณสมบัติแอปพลิเคชัน ก็สามารถเปลี่ยนแปลงได้

ตัวอย่างเช่น หากต้องการใช้ /my-application เป็นเส้นทางบริบท ควรเพิ่มคุณสมบัติถัดไป server.servlet.context-path=/my-application ลงใน application.properties

นอกจากนี้ใน เอกสาร Spring Boot มีหลายวิธีในการเปลี่ยนแปลงคุณสมบัตินี้:

ตัวอย่างเช่น สามารถทำได้ผ่าน OS environment variables หรือ command-line arguments และอื่นๆ

ดังนั้นจึงเป็นไปได้ที่จะตั้งค่าคุณสมบัตินี้ผ่านการกำหนดตัวแปรสภาพแวดล้อมสำหรับคอนเทนเนอร์ใน Kubernetes ดูข้อมูลเพิ่มเติมได้ที่นี่

นอกจากนี้ Spring Cloud ยังรองรับคุณสมบัติการอ่านจาก Kubernetes ConfigMap สปริง Cloud Kubernetes อธิบายกรณีนี้

person Danil Kuznetsov    schedule 29.04.2020

คุณลองสิ่งนี้ได้ไหม

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: my-k8s-cluster.com
      http:
        paths:
          - path: /my-application/(.+)
            backend:
              serviceName: my-service
              servicePort: 80
person Keaz    schedule 04.05.2020