在創建 Pod 時在 GKE 中獲取“x509:由未知機構簽署的證書”拉取鏡像(私有系統資料庫)
我生成了一個 CA 證書,然後基於它為位於同一 GKE 集群中的私有系統資料庫頒發了證書。將伺服器證書放入私有系統資料庫,將 CA 證書放入所有 GKE 節點並執行:
update-ca-certificates && systemctl restart docker
圖像正在建構並毫無問題地放入私有系統資料庫。當 pod 嘗試從儲存庫中提取圖像時,我收到錯誤消息:
x509: certificate signed by unknown authority
此外,我嘗試將 CA 證書放入
certs.d
docker 目錄(10.3.240.100:3000 — 私有系統資料庫的 IP 地址)並在 GKE 集群的每個節點上重新啟動 docker,但這也無濟於事:/etc/docker/certs.d/10.3.240.100:3000/ca.cert
如何解決這個問題呢?我是否正確理解 GKE 節點的 docker 在創建 pod 時負責拉取圖像?
在伺服器上安裝根 CA 證書。就是這樣——現在錯誤應該消失了。如果您不知道根 CA,請在瀏覽器(即 Chrome)中打開出現錯誤的 URL。點擊 URL 旁邊的鎖並選擇證書(有效)。
參考連結:
https://docs.docker.com/registry/insecure/
https://writeabout.net/2020/03/25/x509-certificate-signed-by-unknown-authority/
通過將根 CA 證書文件移動到 /usr/local/share/ca-certificates 然後執行 sudo update-ca-certificates,確保您已添加證書。
解決此問題的第一步是重新啟動 docker,以便系統可以檢測到作業系統證書的更改。docker 有一個額外的位置,我們可以使用它來信任單個系統資料庫伺服器 CA。CA證書需要放在:
/etc/docker/certs.d/<docker registry>/ca.crt
如果我們需要包含埠號,我們需要在圖像標籤中指定它。例如:
/etc/docker/certs.d/my-registry.example.com:5000/ca.crt
如果上述解決方案不能解決問題,則需要執行以下步驟 -
X509 錯誤通常表明您嘗試使用自簽名證書而未正確配置 Docker 守護程序
1:創建文件 /etc/docker/daemon.json 並添加 insecure-registries
{ “insecure-registries” : [“docker.domain.com:3000”] }
將“docker.domain.com”替換為您的 Docker Registry 實例主機名,將埠“3000”替換為執行 Docker Registry 的埠。
啟用不安全的系統資料庫後,Docker 會執行以下步驟:
- 首先,嘗試使用 HTTPS。
- 如果 HTTPS 可用但證書無效,則忽略證書錯誤。如果 HTTPS 不可用,請回退到 HTTP。
2:通過執行命令重啟docker守護程序
systemctl restart docker
3:創建與主機同名的目錄
mkdir -p /etc/docker/certs.d/docker.domain.com
4:將證書保存在新創建的目錄中
ex +’/BEGIN CERTIFICATE/,/END CERTIFICATE/p’ <(echo | OpenSSL s_client -show certs -connect docker.domain.com:443) -suq > /etc/docker/certs.d/docker.domain.com /docker_registry.crt
- 如果您從私有系統資料庫中提取圖像,請確保您已創建一個包含您需要訪問的憑據的 Secret。還要確保您已在適當的命名空間中添加了 Secret。
- 您還需要在 Pod 上設置imagePullSecrets 欄位。該欄位告訴 Kubernetes 在向系統資料庫進行身份驗證時應該使用哪個 Secret。