Điểm:0

Double port forwarding kubernetes + docker

lá cờ au

Summary:

I have a docker container which is running kubectl port-forward, forwarding the port (5432) of a postgres service running as a k8s service to a local port (2223). In the Dockerfile, I have exposed the relevant port 2223. Then I ran the container by publishing the said port (-p 2223:2223)

Now when I am trying to access the postgres through psql -h localhost -p 2223, I am getting the following error:

psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.

However, when I do docker exec -ti to the said container and run the above psql command, I am able to connect to postgres.

Dockerfile CMD:

EXPOSE 2223
CMD ["bash", "-c", "kubectl -n namespace_test port-forward service/postgres-11-2 2223:5432"]

Docker Run command:

docker run -it --name=k8s-conn-12 -p 2223:2223 my_image_name:latest

Output of the docker run command:

Forwarding from 127.0.0.1:2223 -> 5432

So the port forwarding is successful, and I am able to connect to the postgres instance from inside the docker container. What I am not able to do is to connect from outside the container with the exposed and published port

Điểm:2
lá cờ in

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:

  1. 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).
  2. 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).

Chayan Ghosh avatar
lá cờ au
Cảm ơn rất nhiều @matt_i đặc biệt cho lời giải thích. Làm việc như người ở.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.