解決權限引起的 OpenShift Docker Registry 500 錯誤一例

下午正在摸魚的時候,突然收到報告,在 OpenShift 上 Build Image 成功,但 Push 時 Docker Registry 出現 500 錯誤。

Pushing image docker-registry.default.svc:5000/sakuragawa/asaba:latest ...
Pushed 5/10 layers, 50% complete
Pushed 6/10 layers, 60% complete
Pushed 7/10 layers, 70% complete
Registry server Address: 
Registry server User Name: serviceaccount
Registry server Email: [email protected]
Registry server Password: <<non-empty>>
error: build error: Failed to push image: received unexpected HTTP status: 500 Internal Server Error

這個 OpenShift 實例因爲淺羽偷懶的關係,用的是 Hosted Docker Registry,並且從設定好一來一直都沒有動過其他設定。開始懷疑是 Docker Registry 的 Pod 異常退出了,但是看到 Web Console 裏兩個 Pod 都是藍的,並且 Docker Registry 也在工作,所以排除。隨後懷疑 Build 的設定出問題,但是這部分也是沒有更新過的,並且檢查了之間的 Build 記錄也是類似的,於是索性去檢查 Docker Registry Pod 的記錄。

....
time="2019-01-24T09:44:04.766206734Z" level=error msg="response completed with error" err.code=UNKNOWN err.detail="filesystem: mkdir /registry/docker/registry/v2/repositories/test: permission denied" err.message="unknown error" go.version=go1.4.2 http.request.host="172.30.77.44:5000" .... http.response.status=500 ....
....

看到 filesystem: mkdir .... permission denied,直覺是檔案系統的權限出問題,但是容器自己管理的 GlusterFS 怎麼會出問題呢?仔細一看,Pod 自己更新之後,引入了一個 upstream 提交,導致容器運行時身份從 root:1000000000 改變成 1001:0,導致無權限、無法寫入資料夾。

知道了原因,解決起來就簡單了。由於 OpenShift 的 CLI 客戶端不支援切換用戶身份,確認 Docker Registry Pod 所在的 Host 之後直接登入進去,然後以 root 身份進入容器修改資料夾權限。

$ sudo docker exec -it -u root k8s_registry_docker-registry-1-h7vln_default_734aa8f3-1fb7-11e9-bb46-a02bb81f82fc_0 bash
# chown -R root /registry/
# chgrp -R root /registry/

檢查一下所有的 Pod 以保證沒有在運行的舊版本映像,連 Pod 都不用重啓就可以繼續 Push Image 了。

不過這說更新就更新,還動不動就亂改的做法,可真社羣啊。

Comments

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

To respond on your own website, enter the URL of your response which should contain a link to this post’s permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post’s URL again. (Find out more about Webmentions.)