Docker

雙埠轉發kubernetes + docker

  • June 7, 2021

概括:

我有一個執行 kubectl port-forward 的 docker 容器,它將作為 k8s 服務執行的 postgres 服務的埠(5432)轉發到本地埠(2223)。在 Dockerfile 中,我已經暴露了相關的 2223 埠。然後我通過發布所述埠 ( -p 2223:2223)來執行容器

現在,當我嘗試通過 訪問 postgrespsql -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 實例。我不能做的是從容器外部連接到暴露和發布的埠

我認為有兩種可能的解決方案可能對您的情況有所幫助:

  1. 您可以使用執行此命令的容器的 IP 地址將--address參數添加到kubectl port-forward命令中。預設情況下,kubectl僅綁定到 localhost,因此它不會按您的預期工作(請參閱:Kubectl 參考文件)。
  2. 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)。

引用自:https://serverfault.com/questions/1065922