Kopsを使用してAWSでKubernetesクラスターを実行しています。 EBSボリュームをコンテナにマウントし、アプリケーションから表示できますが、アプリケーションがルートとして実行されないため、読み取り専用です。ルート以外のユーザーとしてPersistentVolumeClaim
をマウントするにはどうすればよいですか? VolumeMount
には、マウントされたパスのユーザー、グループ、またはファイルのアクセス許可を制御するオプションがないようです。
これが私のデプロイメントyamlファイルです:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: notebook-1
spec:
replicas: 1
template:
metadata:
labels:
app: notebook-1
spec:
volumes:
- name: notebook-1
persistentVolumeClaim:
claimName: notebook-1
containers:
- name: notebook-1
image: jupyter/base-notebook
ports:
- containerPort: 8888
volumeMounts:
- mountPath: "/home/jovyan/work"
name: notebook-1
ポッドセキュリティコンテキストは、fsGroup
の設定をサポートします。これにより、ボリュームを所有するグループIDを設定できるため、誰がそれに書き込むことができます。ドキュメントの例:
apiVersion: v1
kind: Pod
metadata:
name: hello-world
spec:
containers:
# specification of the pod's containers
# ...
securityContext:
fsGroup: 1234
これに関する詳細は こちら
私の場合、カスタムGrafanaイメージに適切な権限を設定するために、メインコンテナと同じvolumeMountを持つinitContainer
になりました。
initContainers:
- name: take-data-dir-ownership
image: Alpine:3.6
# Give `grafana` user (id 472) permissions a mounted volume
# https://github.com/grafana/grafana-docker/blob/master/Dockerfile
command:
- chown
- -R
- 472:472
- /var/lib/grafana
volumeMounts:
- name: data
mountPath: /var/lib/grafana
これは、ポッドのメインイメージがルート以外のユーザーとして実行されており、マウントされたボリュームへの書き込み権限が必要な場合に必要です。
K8sバージョン1.10以降では、fsGroup
がrunAsGroup
に置き換えられました。
実装はここで追跡できます: https://github.com/kubernetes/features/issues/21
これは、非rootユーザーとしてコンテナ内でプロセスを実行する必要がある場合のKubernetesの展開/ステートフルセットの課題の1つとしてもたらされました。ただし、ボリュームをポッドにマウントすると、常にroot:rootの許可でマウントされます。そのため、非rootユーザーは、データの読み取りおよび書き込みを行うフォルダーへのアクセス権を持っている必要があります。
同じために以下の手順に従ってください。
ポッド仕様コンテキストのdeployment/Statefulsetに以下の行を追加します。
spec:securityContext:runAsUser:1099 runAsGroup:1099 fsGroup:1099
runAsUser:ポッド内の任意のコンテナに対して、すべてのプロセスがユーザーID 1099で実行されることを指定しますrunAsGroup:ポッドの任意のコンテナ内のすべてのプロセスに対して1099のプライマリグループIDを指定します(このフィールドが省略された場合、コンテナはroot(0)になり、runAsGroupが指定されている場合、作成されたファイルはすべてユーザー1099およびグループ1099によって所有されます)fsGroup:接続されたボリュームの所有者がGroupId 1099によって所有者になることを指定し、その下で作成されたファイルには許可が与えられます非rootgroup:nonrootgroupの。