web-dev-qa-db-ja.com

投影されたボリュームにマウントされているkubernetesシークレットファイルのデフォルトのファイル所有者とグループ所有者を変更する

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
12
user_2011

私の知る限り、シークレットの所有者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/

....
9

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はそれを別の一時フォルダにコピーし、この新しいファイルの所有権を変更します。

全体としては、少なくとも、それは機能しています。

1
Orabîg