ฉันพยายามหาวิธีกำหนดบริการในเนมสเปซเดียวที่ลิงก์ไปยัง Pod ที่ทำงานในเนมสเปซอื่น ฉันรู้ว่าคอนเทนเนอร์ใน Pod ที่ทำงานอยู่namespaceA
สามารถเข้าถึงที่serviceX
กำหนดnamespaceB
โดยการอ้างอิงใน DNS คลัสเตอร์เป็นserviceX.namespaceB.svc.cluster.local
แต่ฉันไม่อยากมีรหัสภายในคอนเทนเนอร์ที่จำเป็นต้องรู้เกี่ยวกับตำแหน่งของserviceX
. นั่นคือฉันต้องการให้โค้ดค้นหาserviceX
จากนั้นจึงจะสามารถเข้าถึงได้
เอกสาร Kubernetesแสดงให้เห็นว่าเป็นไปได้ มันบอกว่าหนึ่งในเหตุผลที่คุณจะกำหนดบริการโดยไม่มีตัวเลือกก็คือคุณต้องการที่จะชี้ให้บริการของคุณเพื่อให้บริการใน Namespace อื่นหรือในคลัสเตอร์อื่น
นั่นชี้ให้ฉันทราบว่าฉันควร:
- กำหนด
serviceX
บริการในnamespaceA
โดยไม่มีตัวเลือก (เนื่องจาก POD ที่ฉันต้องการเลือกไม่อยู่ในnamespaceA
) - กำหนดบริการ (ซึ่งฉันเรียกว่า
serviceX
) ในnamespaceB
แล้ว - กำหนดวัตถุปลายทางใน
namespaceA
การชี้ไปในserviceX
namespaceB
นี่เป็นขั้นตอนที่สามที่ฉันไม่สามารถทำได้สำเร็จ
ก่อนอื่นฉันลองกำหนดวัตถุปลายทางด้วยวิธีนี้:
kind: Endpoints
apiVersion: v1
metadata:
name: serviceX
namespace: namespaceA
subsets:
- addresses:
- targetRef:
kind: Service
namespace: namespaceB
name: serviceX
apiVersion: v1
ports:
- name: http
port: 3000
นั่นดูเหมือนเป็นวิธีการเชิงตรรกะและชัดเจนว่าtargetRef
มีไว้เพื่ออะไร แต่สิ่งนี้นำไปสู่ข้อผิดพลาดที่บอกว่าจำเป็นต้องกรอกip
ฟิลด์ในaddresses
อาร์เรย์ ดังนั้นความพยายามครั้งต่อไปของฉันคือกำหนดที่อยู่ ClusterIP คงที่ให้serviceX
ในnamespaceB
และใส่ไว้ในฟิลด์ IP (โปรดทราบว่าservice_cluster_ip_range
มีการกำหนดค่าเป็น192.168.0.0/16
และ192.168.1.1
ถูกกำหนดเป็น ClusterIP สำหรับserviceX
in namespaceB
; serviceX
in namespaceA
ถูกกำหนด ClusterIP ที่แตกต่างกันโดยอัตโนมัติบน192.168.0.0/16
เครือข่ายย่อย) :
kind: Endpoints
apiVersion: v1
metadata:
name: serviceX
namespace: namespaceA
subsets:
- addresses:
- ip: 192.168.1.1
targetRef:
kind: Service
namespace: namespaceB
name: serviceX
apiVersion: v1
ports:
- name: http
port: 3000
สิ่งนี้ได้รับการยอมรับ แต่การเข้าถึงserviceX
ในnamespaceA
ไม่ได้รับการส่งต่อไปยัง Pod innamespaceB
- หมดเวลา เมื่อดูการตั้งค่า iptables ดูเหมือนว่าจะต้องทำการกำหนดเส้นทางล่วงหน้าของ NAT สองครั้งเพื่อให้บรรลุเป้าหมายนั้น
สิ่งเดียวที่ฉันพบว่าใช้งานได้ - แต่ไม่ใช่วิธีแก้ปัญหาที่น่าพอใจ - คือการค้นหาที่อยู่ IP จริงของ Pod ที่ให้มา serviceX
ในnamespaceB
และวางอยู่ว่าในปลายทางวัตถุในnamespaceA
และวางอยู่ว่าในปลายทางวัตถุในแน่นอนว่าไม่น่าพอใจเพราะที่อยู่ IP ของ Pod อาจมีการเปลี่ยนแปลงเมื่อเวลาผ่านไป นั่นคือ IP ของบริการที่มีปัญหาเพื่อแก้ปัญหา
ดังนั้นมีวิธีใดบ้างที่จะตอบสนองสิ่งที่ดูเหมือนจะเป็นสัญญาของเอกสารที่ฉันสามารถชี้บริการในเนมสเปซเดียวไปยัง บริการทำงานในเนมสเปซอื่นได้
ผู้แสดงความคิดเห็นถามว่าทำไมคุณถึงต้องการทำสิ่งนี้ - นี่คือกรณีการใช้งานที่สมเหตุสมผลสำหรับฉันอย่างน้อย:
สมมติว่าคุณมีระบบผู้เช่าหลายระบบซึ่งรวมถึงฟังก์ชันการเข้าถึงข้อมูลทั่วไปที่สามารถใช้ร่วมกันระหว่างผู้เช่าได้ ทีนี้ลองนึกดูว่าฟังก์ชันการเข้าถึงข้อมูลนี้มีรสชาติที่แตกต่างกันกับ API ทั่วไป แต่มีลักษณะการทำงานที่แตกต่างกัน ผู้เช่าบางรายสามารถเข้าถึงหนึ่งในนั้นผู้เช่ารายอื่นสามารถเข้าถึงอีกรายหนึ่งได้
พ็อดของผู้เช่าแต่ละรายจะทำงานในเนมสเปซของตนเอง แต่แต่ละคนจำเป็นต้องเข้าถึงหนึ่งในบริการการเข้าถึงข้อมูลทั่วไปเหล่านี้ซึ่งจำเป็นต้องอยู่ในเนมสเปซอื่น (เนื่องจากมีการเข้าถึงโดยผู้เช่าหลายราย) แต่คุณไม่ต้องการให้ผู้เช่าต้องเปลี่ยนรหัสหากการสมัครของพวกเขาเปลี่ยนเพื่อเข้าถึงบริการที่มีประสิทธิภาพสูงกว่า
วิธีแก้ปัญหาที่เป็นไปได้ (วิธีที่สะอาดที่สุดที่ฉันคิดได้ถ้ามันใช้งานได้) คือการรวมคำจำกัดความของบริการไว้ในเนมสเปซของผู้เช่าแต่ละรายสำหรับบริการการเข้าถึงข้อมูลโดยแต่ละรายการได้รับการกำหนดค่าสำหรับปลายทางที่เหมาะสม ข้อกำหนดบริการนี้จะถูกกำหนดค่าให้ชี้ไปที่บริการเข้าถึงข้อมูลที่เหมาะสมที่ผู้เช่าแต่ละรายมีสิทธิ์ใช้