在 RHEL / CentOS 系統安裝 UCP 3.1.x 碰到的 SELinux 問題


之前在客戶端協助運維時,突然碰到的一個新問題,雖然目前來看時間點已過,可能最新版不會有這樣的問題了,在這做個記錄,未來有類似情況可以參考,同時作為前面安裝 UCP 一文的補充。

客戶端的作業系統是 RHEL 7.5 , 所要安裝的 UCP 版本是 3.1.8 ,  執行下面命令的時候...

[root@ucp]# docker run --name ucp --rm -it -v /var/run/docker.sock:/var/run/docker.sock docker/ucp:3.1.8 install --host-address [node-ip-addr] --interactive
Unable to find image 'docker/ucp:3.1.8' locally
3.1.8: Pulling from docker/ucp
c87736221ed0: Pull complete
831158f6c3f0: Pull complete
7eaca31ce090: Pull complete
Digest: sha256:048414d9d3fd5cc93b3a762582c2cea73b94ef5449072b16231f13b9e355c1e4
Status: Downloaded newer image for docker/ucp:3.1.8
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init caused \"write /proc/self/attr/keycreate: permission denied\"": unknown.

出現如上列紅字標示的錯誤。

看起來是 UCP 3.1.x 安裝程式與當前系統上容器運行環境(container runtime)的 SELinux policy 設定不兼容。

經過測試發現有幾個解決方法。

首先依照經驗法則,可以想到先能做的是,在安裝 UCP 前先暫時改變 SELinux 的設定。當然這是比較不建議的做法。

在 RHEL 或是 CentOS 環境使用 sestatus 可查到 SELinux 狀態。

[root@ucp]# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31

要轉為 permissive 模式,執行下面命令。(這麼做只是暫時的,下次作業系統重新開機以後就會回復成 enforcing 模式。)然後再執行上述的安裝 UCP 命令。

[root@ucp]# setenforce 0

上述做法是比較不推薦的。不過通過上述方法至少我們已確認了 “ UCP 3.1.x 安裝程式與當前系統上容器運行環境(container runtime)的 SELinux policy 設定不兼容。”  這個推測。

長期且可靠的方法是,先更新 container-selinux RPM 軟體包到比較新的版本,然後再安裝UCP。

container-selinux RPM 軟體包包含了關於容器運行環境的 SELinux policy 安全設定模組,它是 Docker 引擎依賴的軟體包之一。

要確認系統上目前使用的 container-selinux RPM 軟體包版本,可以用以下命令查看:

[root@ucp]# rpm -qa | grep container
container-selinux-2.74-1.el7.noarch
containerd.io-1.2.6-3.3.el7.x86_64

上述例子顯示 container-selinux  版本 2.74.

目前尚無所有版本的兼容性完整測試,下面列出目前常見的幾種情況:

【 X】  CentOS 7.5 + container-selinux 2.74
【 X  RHEL 7.5 + container-selinux 2.77
【   CentOS 7.6 + container-selinux 2.95
【 O  CentOS 7.6 + container-selinux 2.99
【 O  CentOS 7.6 + container-selinux 2.107


RHEL 7.5 + container-selinux 2.77 這個組合一定不能用。

CentOS 7.6 + container-selinux 2.95 這個組合我使用過是OK的,但曾聽過有人說
RHEL 7.6 + container-selinux 2.95 無法用。這組合待商榷。

CentOS 7.6 + container-selinux 2.99 以及 CentOS 7.6 + container-selinux 2.107 目前就我手邊接觸到的環境,數次測試之後看來是可以成功安裝UCP。

搭配比較新的版本是比較好的。通過 offline (如air-gapped環境)或是 online 以 yum 或類似工具透過 CentOS Extras Repository 更新 container-selinux 到比較新的版本如上述的 2.107,便能解決這個 UCP 的安裝問題。

留言

這個網誌中的熱門文章

Docker 環境下的 Proxy 配置