在 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 的安裝問題。
留言
張貼留言