Tôi đã cố gắng tìm cách xác định một dịch vụ trong một không gian tên liên kết đến một Pod đang chạy trong một không gian tên khác. Tôi biết rằng các vùng chứa trong Pod đang chạy trong namespaceA
có thể truy cập serviceX
được xác định trong namespaceB
bằng cách tham chiếu nó trong DNS cụm serviceX.namespaceB.svc.cluster.local
, nhưng tôi không muốn có mã bên trong vùng chứa cần biết về vị trí của serviceX
. Đó là, tôi muốn mã chỉ cần tra cứu serviceX
và sau đó có thể truy cập nó.
Các tài liệu Kubernetes gợi ý rằng điều này là có thể. Nó nói rằng một trong những lý do mà bạn sẽ xác định dịch vụ mà không có bộ chọn là Bạn muốn trỏ dịch vụ của mình đến một dịch vụ trong Không gian tên khác hoặc trên một cụm khác .
Điều đó gợi ý cho tôi rằng tôi nên:
- Xác định một
serviceX
dịch vụ trong đónamespaceA
, không có bộ chọn (vì POD tôi muốn chọn không có trong đónamespaceA
). - Xác định một dịch vụ (mà tôi cũng đã gọi
serviceX
)namespaceB
, và sau đó - Xác định một đối tượng thiết bị đầu cuối trong
namespaceA
để trỏ đếnserviceX
ởnamespaceB
.
Đây là bước thứ ba mà tôi đã không thể thực hiện được.
Đầu tiên, tôi đã thử xác định đối tượng Endpoints theo cách này:
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
Đó có vẻ là cách tiếp cận hợp lý, và rõ ràng là để làm gì targetRef
. Tuy nhiên, điều này dẫn đến lỗi nói rằng ip
trường trong addresses
mảng là bắt buộc. Vì vậy, lần thử tiếp theo của tôi là gán một địa chỉ ClusterIP cố định serviceX
vào namespaceB
và đặt địa chỉ đó vào trường IP (lưu ý rằng địa chỉ đó service_cluster_ip_range
được định cấu hình 192.168.0.0/16
và 192.168.1.1
được gán là ClusterIP cho serviceX
trong namespaceB
; serviceX
trong namespaceA
được tự động gán một ClusterIP khác trên 192.168.0.0/16
mạng con) :
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
Điều đó đã được chấp nhận, nhưng quyền truy cập serviceX
vào namespaceA
không được chuyển tiếp đến Pod in namespaceB
- chúng đã hết thời gian chờ. Nhìn vào thiết lập iptables, có vẻ như nó sẽ phải thực hiện định tuyến trước NAT hai lần để thực hiện điều đó.
Điều duy nhất tôi đã tìm thấy rằng làm việc - nhưng không phải là một giải pháp thỏa đáng - là để tra cứu địa chỉ IP thực tế của Pod cung cấp serviceX
trong namespaceB
và đưa địa chỉ đó trong đối tượng thiết bị đầu cuối trong namespaceA
. Tất nhiên, điều đó không thỏa đáng vì địa chỉ IP của Pod có thể thay đổi theo thời gian. Đó là vấn đề mà IP dịch vụ phải giải quyết.
Vì vậy, có cách nào để đáp ứng những gì dường như là lời hứa của tài liệu rằng tôi có thể trỏ một dịch vụ trong một không gian tên đến một dịch vụ đang chạy trong một không gian tên khác không?
Một người bình luận đã đặt câu hỏi tại sao bạn muốn làm điều này - đây là một trường hợp sử dụng có ý nghĩa đối với tôi, ít nhất là:
Giả sử bạn có một hệ thống nhiều người thuê, cũng bao gồm một chức năng truy cập dữ liệu chung có thể được chia sẻ giữa những người thuê. Bây giờ hãy tưởng tượng rằng có những hương vị khác nhau của chức năng truy cập dữ liệu này với các API thông thường, nhưng các đặc điểm hiệu suất khác nhau. Một số người thuê có quyền truy cập vào một trong số chúng, những người thuê khác có quyền truy cập vào một cái khác.
Mỗi nhóm của người thuê chạy trong không gian tên riêng của họ, nhưng mỗi nhóm cần phải truy cập một trong những dịch vụ truy cập dữ liệu chung này, nhất thiết sẽ nằm trong một không gian tên khác (vì nó được nhiều người thuê truy cập). Tuy nhiên, bạn sẽ không muốn người thuê phải thay đổi mã của họ nếu đăng ký của họ thay đổi để truy cập dịch vụ có hiệu suất cao hơn.
Một giải pháp tiềm năng (giải pháp sạch nhất mà tôi có thể nghĩ đến, nếu chỉ nó hoạt động) là bao gồm định nghĩa dịch vụ trong không gian tên của mỗi đối tượng thuê cho dịch vụ truy cập dữ liệu, với mỗi giải pháp được định cấu hình cho điểm cuối thích hợp. Định nghĩa dịch vụ này sẽ được cấu hình để trỏ đến dịch vụ truy cập dữ liệu thích hợp mà mỗi người thuê được quyền sử dụng.