ボリュームパーミッションの問題の特定
このステップでは、Kubernetes でよくあるボリュームパーミッションの問題を示すシナリオを作成します。これらの問題は、通常、HostPath ボリュームまたは永続ボリュームを使用し、ファイルシステムのパーミッションがコンテナ内で実行されているユーザー ID と一致しない場合に発生します。
問題の理解
コンテナが非 root ユーザーとして実行されているが、root (または別のユーザー) が所有するボリュームにアクセスしようとすると、パーミッション拒否エラーが発生する可能性があります。これは、コンテナを非 root ユーザーとして実行することがセキュリティのベストプラクティスである本番環境でよくある問題です。
パーミッションの問題がある HostPath ボリュームの作成
root 所有権を持つ HostPath ボリュームにアクセスしようとする Pod を作成してみましょう。
- Pod 設定の YAML ファイルを作成します。
cd ~/project/k8s-volume-demo
nano hostpath-pod.yaml
- 次の内容をファイルにコピーします。
apiVersion: v1
kind: Pod
metadata:
name: hostpath-pod
spec:
containers:
- name: container-1
image: ubuntu:22.04
command:
[
"/bin/bash",
"-c",
"while true; do echo 'Trying to write' >> /data/output.txt; sleep 10; done"
]
volumeMounts:
- name: host-data
mountPath: /data
securityContext:
runAsUser: 1000 ## Run as non-root user
volumes:
- name: host-data
hostPath:
path: /home/labex/project/k8s-volume-demo/data
type: Directory
-
ファイルを保存します (Ctrl+X、次に Y、次に Enter を押します)。
-
Kubernetes クラスターで Pod を作成します。
kubectl apply -f hostpath-pod.yaml
- しばらく待ってから、Pod のステータスを確認します。
kubectl get pods
- Pod が実行されていることがわかりますが、ログを確認すると、エラーが表示される場合があります。
kubectl logs hostpath-pod
次のようなパーミッション拒否エラーが表示される場合があります。
bash: /data/output.txt: Permission denied
- ホストディレクトリのパーミッションを確認して、問題を確認しましょう。
ls -la ~/project/k8s-volume-demo/data
次のような出力が表示されるはずです。
total 12
drwxr-xr-x 2 root root 4096 Jan 1 12:00 .
drwxr-xr-x 3 labex labex 4096 Jan 1 12:00 ..
-rw-r--r-- 1 root root 19 Jan 1 12:00 test.txt
ディレクトリとファイルは root によって所有されていますが、コンテナはユーザー ID 1000 として実行されています。この不一致が、パーミッション拒否エラーの原因となります。
コンテナ内のユーザー ID とグループ ID の理解
Kubernetes では、securityContext 設定を使用して、コンテナを特定のユーザー ID として実行できます。この例では、次のようになります。
securityContext:
runAsUser: 1000 ## Run as non-root user
これは、Kubernetes にコンテナプロセスをユーザー ID 1000 として実行するように指示します。このユーザー ID には、root が所有するファイルへの書き込み権限がありません。
クリーンアップ
次のステップに進む前に、Pod を削除しましょう。
kubectl delete pod hostpath-pod
次のステップでは、これらのパーミッション問題に対するソリューションを探求します。