K8Sは初めてです。投影されたボリュームにマウントされたkubernetesシークレットを生成するyamlファイルがあります。実行すると、シークレットファイル(シークレットと共にパッケージ化されている)がファイルの所有者およびグループの所有者として「root」を表示していることがわかりました。ファイルの所有者とグループの所有者を同じ特定のユーザーに変更したい(450など)。
Initコンテナから「chown」を使用しようとしましたが(試してみましたが失敗しました)、「読み取り専用ファイルシステム」というエラーが表示され、ファイルとグループの所有者を変更できませんでした。セキュリティコンテキストで「fsGroup」を使用したくありません。 fsGroupを使用すると、「items」の「mode:」オプションが予期しない動作をすることがわかりました。
予測ボリュームを介してマウントされているkubernetesシークレットファイルのデフォルトファイルとグループオーナーを変更する方法はありますか?
以下のサンプルコードを提供しています。以下のサンプルの「mysecret2」の下にある「パスワード」ファイルのファイルとグループ所有者を変更したいとします。それを達成する方法?
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: username
- secret:
name: mysecret2
items:
- key: password
path: password
mode: 511
私の知る限り、シークレットの所有者UIDを変更する方法はありません。
回避策は、シークレットを通常のファイルにコピーしてから、次のようにその所有権とモードを変更することです。
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox
command: |
- "/bin/bash"
- "-exc"
cp /etc/secrets-mount/*_pgpass /etc/secrets
chown my-user /etc/*_pgpass
chmod 600 /etc/*_pgpass
exec su-exec my-user /entrypoint.sh
volumeMounts:
- name: secrets
mountPath: /etc/secrets-mount/
....
Alexeyが言ったように、github.com/kubernetes/kubernetes/issues/81089が完了するまで、現時点では不可能です。
securityContraint.runAsNonRoot
が設定されていない限り、彼のソリューションは完全に機能しています。その場合、コンテナはシークレットに対する権限を持ちません。
私の場合、私は次のことをしなければなりませんでした:
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
##########################################
# Volumes definitions
volumes:
- name: key-volume
emptyDir:
sizeLimit: "8k"
- name: root-owned-key-volume
secret:
secretName: my-secret
items:
- key: a_key_file
path: a_key_file
mode: 0600
##########################################
# initContainers definitions
initContainers:
- name: set-key-ownership
image: Alpine:3.6
command: ["sh", "-c", "cp /root-key/* /key && chown -R 33:33 /key"]
volumeMounts:
- mountPath: /key
name: key-volume
- mountPath: /root-key
name: root-owned-key-volume
##########################################
# Containers definitions
containers:
- name: my-main-container
(...)
securityContext:
runAsNonRoot: true
runAsUser: 33
(...)
volumeMounts:
- mountPath: /key
name: key-volume
基本的に、シークレットファイルの所有権を変更することは不可能であることを知って、initContainerはそれを別の一時フォルダにコピーし、この新しいファイルの所有権を変更します。
全体としては、少なくとも、それは機能しています。