最近DockerからDockerに切り替えました。ボードマンKubernetes互換製品を作成しました。ポッドの定義yamlファイル。
rootlessを使用して定義を正常にロードしました。podman play kube
その後、命令はポッドとコンテナが起動したと宣言しますが、読み取りアクセスが拒否されました。何かをリストしようとするとホストパスコンテナ内のバインドされたボリューム。
⋄定義のロードと「フロントエンド」コンテナログダンプ
$ podman play kube ./my-pod.yaml ; sleep 1 ; podman logs front
/var/www # pwd
0 0 # echo `id -u` `id -g`
total 0 # ls -lha
ls: cannot open '.': Permission denied
私は拒否が以下に関連していると思います。SELinuxファイルランダムアクセス制御は、ホストディレクトリに対して十分に許可されているように見えるため、制限されたポリシーです。
$ pwd ; ls -lhaZ
/home/stph/my-project
drwxrwxr-x. 9 stph stph unconfined_u:object_r:user_home_t:s0 4.0K Apr 15 22:30 .
drwxrwxr-x. 4 stph stph unconfined_u:object_r:user_home_t:s0 4.0K Apr 15 22:30 ..
drwxr-xr-x. 5 stph stph unconfined_u:object_r:user_home_t:s0 4.0K Apr 3 14:11 ui
だから素朴に同じことを適用しました。SELinuxホストディレクトリからポッドにラベルを付けましたが、当然ながら何も解決しませんでした。
によると、個人のラベリングに関する内容があるかもしれません。PodmanがKubeを演じる。文書:
注:HostPathボリュームタイプジェネレータキューブをプレイする与えられるSELinux個人商標
私はこれがただ意味すると信じていますホストパスボリュームは複数のコンテナで共有できません(ここでは私が間違っている可能性があります)。
⋄Podman Pod yaml 定義ファイル
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
hostname: my-pod-host
volumes:
- name: projdir
hostPath:
path: /home/stph/my-project
type: Directory
securityContext:
seLinuxOptions:
level: s0
role: object_r
type: user_home_t
user: unconfined_u
containers:
- name: front
image: node:lts-alpine
workingDir: /var/www
env:
- name: API_ENTRYPOINT
value: "http://localhost:80/api"
ports:
- containerPort: 5000
hostIP: 127.0.0.1
hostPort: 5000
protocol: TCP
volumeMounts:
- name: projdir
mountPath: /var/www
subPath: ui
command: ['/bin/sh', '-c', 'pwd ; echo `id -u` `id -g` ; ls -lha']
⋄/etc/subuid マッピング
cat /etc/subuid
stph:1000:1
stph:100000:65536
⋄podman inspect front
出力抜粋
{
"Id": "c93a3d6...",
"Created": "2020-04-15T19:01:14.034867742+02:00",
"Path": "docker-entrypoint.sh",
"Args": [
"/bin/sh",
"-c",
"pwd ; echo `id -u` `id -g` ; ls -lha"
],
"State": {
"OciVersion": "1.0.1-dev",
"Status": "exited",
...
},
"Image": "f77abbe...",
"ImageName": "node:lts-alpine",
"Rootfs": "",
"Pod": "26bd784...",
"ResolvConfPath": "/run/user/1000/containers/overlay-containers/93c4707.../userdata/resolv.conf",
"HostnamePath": "/run/user/1000/containers/overlay-containers/c93a3d.../userdata/hostname",
"HostsPath": "/run/user/1000/containers/overlay-containers/93c4707.../userdata/hosts",
"StaticDir": ".../containers/storage/overlay-containers/c93a3d.../userdata",
"OCIConfigPath": ".../containers/storage/overlay-containers/c93a3d.../userdata/config.json",
"OCIRuntime": "crun",
"LogPath": ".../containers/storage/overlay-containers/c93a3d.../userdata/ctr.log",
"LogTag": "",
"ConmonPidFile": "/run/user/1000/containers/overlay-containers/c93a3d.../userdata/conmon.pid",
"Name": "front",
"RestartCount": 0,
"Driver": "overlay",
"MountLabel": "system_u:object_r:container_file_t:s0:c57,c80",
"ProcessLabel": "system_u:system_r:container_t:s0:c57,c80",
"Mounts": [
{
"Type": "bind",
"Name": "",
"Source": "/home/stph/my-project",
"Destination": "/var/www",
"Driver": "",
"Mode": "",
"Options": [
"rbind"
],
"RW": true,
"Propagation": "rprivate"
}
],
"Namespace": "",
"IsInfra": false,
"Config": {
"Hostname": "ski-pod-host",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"TERM=xterm",
"NODE_VERSION=12.16.1",
"YARN_VERSION=1.22.0",
"API_ENTRYPOINT=http://localhost:80",
"HOSTNAME=ski-pod-host",
"HOME=/root",
"container=libpod"
],
"Cmd": [
"docker-entrypoint.sh", "/bin/sh", "-c", "pwd ; echo `id -u` `id -g` ; ls -lha"
],
"Image": "node:lts-alpine",
"Volumes": null,
"WorkingDir": "/var/www",
"Entrypoint": "",
"StopSignal": 15
...
},
"HostConfig": {
"Binds": [
"/home/stph/my-project:/var/www:rw,rprivate,rbind"
],
"NetworkMode": "container:93c4707...",
"RestartPolicy": {
"Name": "",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"IpcMode": "container:93c4707...",
"Cgroup": "",
"Cgroups": "default",
"Privileged": false,
"ReadonlyRootfs": false,
"SecurityOpt": [],
...
}
...
}
⋄関連journalctl -a -r
履歴には、アクセス拒否や不正操作に関する内容は表示されません。
この状況をデバッグ/解決する方法に関する提案はありますか?ありがとうございます。
ベストアンサー1
私は同じ問題があり、この解決策を見つけました。ホストで同じタグを適用する必要はなく、タグを無効にするだけです。
securityContext:
seLinuxOptions:
type: spc_t
SELinuxタグを無効にしますtype: spc_t
。これはpodman
、引数を使用してコマンドを実行するのと同じです--security-opt label=disable
。たとえば、
podman run -it --security-opt label=disable -v .:/foo alpine
ここで解決策を見つけました。https://github.com/containers/libpod/pull/5307#issuecomment-590830455
参考になれば幸いです。