前言
從 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
命令,若無,可用 brew
安裝
$ 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 時,便能正常訪問了。

注意:在網絡設置的 SOCKS 代理,會影響你的網絡從而上不了網,當不需要連通 Docker 網絡的時候,得把這個代理設置給取消掉。筆者為了省事,不直接在網絡設置中設置代理,而是用了另外一個瀏覽器單獨設置代理來進行調試(主力 Firefox,所以這里用 Firefox Nightly 版來調試)

僅 Firefox Nightly 中可訪問,且不影響本機的網絡環境:
如終端需要使用代理時,編輯 ~/.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