Tôi nghĩ rằng có hai giải pháp khả thi có thể giúp ích trong trường hợp của bạn:
- Bạn có thể thêm
--Địa chỉ
tranh luận với chuyển tiếp cổng kubectl
lệnh bằng địa chỉ IP của vùng chứa đang chạy lệnh này. Theo mặc định, kubectl
chỉ liên kết với localhost và do đó nó không hoạt động như bạn mong đợi (xem: Tài liệu tham khảo Kubectl).
- Tất cả các vùng chứa mới bắt đầu kết nối với một vùng chứa mặc định
cầu
mạng trừ khi có quy định khác. Để giải quyết vấn đề của bạn, bạn có thể sử dụng chủ nhà
mạng thay vì cầu
mạng. Như có thể được tìm thấy trong Mạng máy chủ Docker tài liệu:
Nếu bạn sử dụng chế độ mạng máy chủ cho một bộ chứa, ngăn xếp mạng của bộ chứa đó không bị cô lập khỏi máy chủ Docker (bộ chứa chia sẻ không gian tên mạng của máy chủ) và bộ chứa không được cấp phát địa chỉ IP riêng .
Tôi sẽ mô tả ngắn gọn cả hai giải pháp để cho bạn thấy nó hoạt động như thế nào.
Đầu tiên, tôi chuẩn bị postgres
:
# kubectl get pod,svc
TÊN TÌNH TRẠNG SẴN SÀNG KHỞI ĐỘNG LẠI TUỔI
pod/postgres 1/1 Đang chạy 0 155m
TÊN LOẠI CLUSTER-IP (CỔNG IP NGOÀI) TUỔI
dịch vụ/postgres ClusterIP 10.110.151.73 <không có> 5432/TCP 2s
Quảng cáo 1.
Cách tiếp cận này rất giống với cách của bạn, tôi chỉ thêm --Địa chỉ
tranh luận:
GHI CHÚ: Tôi đã sử dụng một container với kubectl
đã được cài đặt. Tôi chỉ muốn bạn chú ý đến chuyển tiếp cổng kubectl --address $(tên máy chủ -i),dịch vụ localhost/postgres 2223:5432
chỉ huy.
root@kworker:~# docker run -it --name=k8s-conn-12 -p 2223:2223 -v /config:/config mattjcontainerregistry/forward:latest bash
root@31b05af956ab:/# kubectl port-forward --address $(tên máy chủ -i),dịch vụ localhost/postgres 2223:5432 --kubeconfig=config
Chuyển tiếp từ 127.0.0.1:2223 -> 5432
Chuyển tiếp từ 172.17.0.2:2223 -> 5432
Từ một tab đầu cuối khác, chúng tôi có thể kiểm tra xem nó có hoạt động không:
root@kworker:~# docker exec -it k8s-conn-12 bash
root@31b05af956ab:/# psql -U postgres -h localhost -p 2223
psql (12.7 (Ubuntu 12.7-0ubuntu0.20.04.1), máy chủ 13.3 (Debian 13.3-1.pgdg100+1))
CẢNH BÁO: psql phiên bản chính 12, máy chủ phiên bản chính 13.
Một số tính năng psql có thể không hoạt động.
Nhập "trợ giúp" để được trợ giúp.
postgres=#
Ngoài ra, chúng ta có thể thực hiện tương tự từ máy chủ (từ bên ngoài vùng chứa có cổng được xuất bản và hiển thị):
root@kworker:~# psql -U postgres -h localhost -p 2223
psql (11.12 (Debian 11.12-0+deb10u1), máy chủ 13.3 (Debian 13.3-1.pgdg100+1))
CẢNH BÁO: psql phiên bản chính 11, máy chủ phiên bản chính 13.
Một số tính năng psql có thể không hoạt động.
Nhập "trợ giúp" để được trợ giúp.
postgres=#
Quảng cáo 2.
Cách tiếp cận này yêu cầu sử dụng một chủ nhà mạng:
máy chủ lưu trữ: Đối với các bộ chứa độc lập, hãy xóa cách ly mạng giữa bộ chứa và máy chủ Docker và sử dụng mạng của máy chủ trực tiếp.
GHI CHÚ: Tôi chỉ muốn bạn chú ý đến --mạng=máy chủ
tùy chọn (Tôi đã sử dụng cùng một thùng chứa như trước):
root@kworker:~# docker run -it --name=k8s-conn-12 --network=host -v /config:/config mattjcontainerregistry/forward: bash mới nhất
root@kworker:/# dịch vụ chuyển tiếp cổng kubectl/postgres 2223:5432 --kubeconfig=config
Chuyển tiếp từ 127.0.0.1:2223 -> 5432
Chuyển tiếp từ [::1]:2223 -> 5432
Một lần nữa, chúng ta có thể kiểm tra xem nó có hoạt động như mong đợi từ bên ngoài vùng chứa hay không:
root@kworker:~# psql -U postgres -h localhost -p 2223
psql (11.12 (Debian 11.12-0+deb10u1), máy chủ 13.3 (Debian 13.3-1.pgdg100+1))
CẢNH BÁO: psql phiên bản chính 11, máy chủ phiên bản chính 13.
Một số tính năng psql có thể không hoạt động.
Nhập "trợ giúp" để được trợ giúp.
postgres=#
Ngoài ra, bạn nên cân nhắc nếu thực sự cần một bộ chứa docker để chuyển tiếp cổng. có lẽ đang chạy chuyển tiếp cổng kubectl
trong nền sẽ tốt hơn (xem: Thực hiện chuyển tiếp cổng kubectl trong nền).