雙埠轉發kubernetes + docker
概括:
我有一個執行 kubectl port-forward 的 docker 容器,它將作為 k8s 服務執行的 postgres 服務的埠(5432)轉發到本地埠(2223)。在 Dockerfile 中,我已經暴露了相關的 2223 埠。然後我通過發布所述埠 (
-p 2223:2223
)來執行容器現在,當我嘗試通過 訪問 postgres
psql -h localhost -p 2223
時,出現以下錯誤:psql: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
但是,當我
docker exec -ti
對上述容器執行上述操作並執行上述 psql 命令時,我可以連接到 postgres。Dockerfile 命令:
EXPOSE 2223 CMD ["bash", "-c", "kubectl -n namespace_test port-forward service/postgres-11-2 2223:5432"]
Docker 執行命令:
docker run -it --name=k8s-conn-12 -p 2223:2223 my_image_name:latest
docker run 命令的輸出:
Forwarding from 127.0.0.1:2223 -> 5432
所以埠轉發成功,我可以從 docker 容器內部連接到 postgres 實例。我不能做的是從容器外部連接到暴露和發布的埠
我認為有兩種可能的解決方案可能對您的情況有所幫助:
- 您可以使用執行此命令的容器的 IP 地址將
--address
參數添加到kubectl port-forward
命令中。預設情況下,kubectl
僅綁定到 localhost,因此它不會按您的預期工作(請參閱:Kubectl 參考文件)。bridge
除非另有說明,否則所有新啟動的容器都連接到預設網路。要解決您的問題,您可以使用host
網路而不是bridge
網路。可以在Docker 主機網路文件中找到:如果您對容器使用主機網路模式,則該容器的網路堆棧不會與 Docker 主機隔離(容器共享主機的網路命名空間),並且容器不會獲得自己的 IP 地址分配。
我將簡要介紹這兩種解決方案,向您展示它是如何工作的。
首先,我準備了
postgres
:# kubectl get pod,svc NAME READY STATUS RESTARTS AGE pod/postgres 1/1 Running 0 155m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/postgres ClusterIP 10.110.151.73 <none> 5432/TCP 2s
廣告 1。
這種方法與您的方法非常相似,我只是添加了
--address
參數:**注意:**我使用了一個
kubectl
已經安裝的容器。我只是想讓你注意kubectl port-forward --address $(hostname -i),localhost service/postgres 2223:5432
命令。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 $(hostname -i),localhost service/postgres 2223:5432 --kubeconfig=config Forwarding from 127.0.0.1:2223 -> 5432 Forwarding from 172.17.0.2:2223 -> 5432
從另一個終端選項卡我們可以檢查它是否有效:
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), server 13.3 (Debian 13.3-1.pgdg100+1)) WARNING: psql major version 12, server major version 13. Some psql features might not work. Type "help" for help. postgres=#
此外,我們可以在主機上執行相同的操作(從具有公開和發布埠的容器外部):
root@kworker:~# psql -U postgres -h localhost -p 2223 psql (11.12 (Debian 11.12-0+deb10u1), server 13.3 (Debian 13.3-1.pgdg100+1)) WARNING: psql major version 11, server major version 13. Some psql features might not work. Type "help" for help. postgres=#
廣告 2。
這種方法需要使用主機網路:
host:對於獨立容器,去掉容器和Docker主機之間的網路隔離,直接使用主機的網路。
**注意:**我只是想讓您注意
--network=host
選項(我使用與以前相同的容器):root@kworker:~# docker run -it --name=k8s-conn-12 --network=host -v /config:/config mattjcontainerregistry/forward:latest bash root@kworker:/# kubectl port-forward service/postgres 2223:5432 --kubeconfig=config Forwarding from 127.0.0.1:2223 -> 5432 Forwarding from [::1]:2223 -> 5432
同樣,我們可以檢查它是否在容器外部按預期工作:
root@kworker:~# psql -U postgres -h localhost -p 2223 psql (11.12 (Debian 11.12-0+deb10u1), server 13.3 (Debian 13.3-1.pgdg100+1)) WARNING: psql major version 11, server major version 13. Some psql features might not work. Type "help" for help. postgres=#
此外,如果您真的需要 docker 容器進行埠轉發,則值得考慮。也許
kubectl port-forward
在後台執行會更好(請參閱:在後台執行 kubectl port-forward)。