1. 程式人生 > 實用技巧 >Docker for Mac k8s 網路不通

Docker for Mac k8s 網路不通

前言

從 macOS 的 Docker Desktop 啟動 k8s,並設定了 ingress 做 app 的訪問測試時,發現宿主機訪問不了目標 url,開始以為是 ingress 沒設定好,經過排查之後發現是網路不通。

問題所在

在查找了 Docker Desktop 的相關文件後,看到這段說明:

Because of the way networking is implemented in Docker Desktop for Mac, you cannot see a docker0 interface on the host. This interface is actually within the virtual machine.
由於網路是在 Mac 的 Docker Desktop 中實現的,所以在主機上看不到 docker0 介面。這個介面實際上在虛擬機器中。

這裡解釋為在「虛擬機器」中,即,實際上 macOS 上執行的 Docker 是虛擬機器架構的,通過虛擬機器 Linux 的 Namespace、CGroups 等資源來實現在 macOS 上執行 Docker,結構如下圖:

故此,宿主機與 Docker 及 K8s 中的網段是不相通的。

解決

在 Github 上找到一種解決辦法——在 Docker 中啟用 SOCKS 服務。在此之間留意自己的 Docker 版本,該功能釋出的版本:Version 18.03.0-ce-rc2-mac56 (23206)

需要使用 jq 命令,若無,可用 berw 安裝

$ brew install jq

關閉 Docker,編輯檔案啟用 SOCKS Server

$ cd ~/Library/Group\ Containers/group.com.docker/
$ mv settings.json settings.json.backup
$ cat settings.json.backup | jq '.["socksProxyPort"]=8888' > settings.json

修改完成後重啟 Docker & k8s,接下來開始設定代理,依次開啟:系統偏好設定 -> 網路 -> 高階 -> 代理,設定 SOCKS Server 資訊。

網頁中再訪問 ingress 目標 url 時,便能正常訪問了。

如終端需要使用代理時,編輯 ~/.zshrc 加入代理配置即可:

$ vim ~/.zshrc
export all_proxy=socks5://127.0.0.1:8888
$ source ~/.zshrc

參考自:
https://docs.docker.com/docker-for-mac/networking/#there-is-no-docker0-bridge-on-macos
https://github.com/docker/for-mac/issues/2670