権限なしでK8S Podにファイルシステムをマウントする

権限なしでK8S Podにファイルシステムをマウントする

(volDevices経由)ボリュームをrawブロックとしてマウントするK8S展開があります。

apiVersion: apps/v1
kind: Deployment
...
spec:
  replicas: 1
...
  containers:
  - name: somepod
    image: ubuntu:latest
    command: ["sh","-c", "--"]
    args: ["mount /dev/block /data && while true; do sleep 1000000; done"]
    securityContext:
      privileged: true
    volumeDevices:
    - devicePath: /dev/block
      name: vol
  volumes:
  - name: vol
    persistentVolumeClaim:
      claimName: vol

これは期待どおりに機能します。

私が達成したいもの:

特権アクセスを許可する必要なく(したがってルートは必要ありません)、コンテナに/ dev / blockをマウントしたいと思います。

既定のイメージに対するすべての権限があり、デフォルトのユーザーは root ではなくグループに追加された 1001 です。

k8sがコンテナに/dev/blockを追加すると、私が知っている限り、993のようなランダムなグループが割り当てられます。

brw-rw----. 1 root  993 259,  16 Dec 15 09:00 block

私が理解しているように、これは私のコントロールの範囲外です(例えば、k8sに既知のグループにインストールするように指示することはできません)。

私が試したこと:

  • ファイルシステムをext4としてフォーマットし、/ etc / fstab行を追加します。/dev/block /data ext4 user,uid=1001,auto 0 0
  • 次へ追加securityContext: fsGroup:1001
  • ファイルシステムをntfsにフォーマットし、/etc/fstab行を追加します。 /dev/block /data ntfs user,uid=1001,auto 0 0
  • pmount容器に設置して使用してください。私のユーザーが/dev/blockグループに属していないので失敗しました。
  • postStartフックを使用する(デフォルトのランタイムと同じ権限を共有するので役に立たない)
  • 特権 initContainer を使用して、ボリュームを /dev/block から emptyDir /data にマウントします。私が理解したように、initContainerとコンテナはemptyDirを共有する必要がありますが、データがマウントされたボリュームに存在するため、機能しません。

まだ試していないこと:

考えられる障害の1つは、誤った/ etc / fstab設定がある可能性があることです。ユーザーとしてマウントしようとするたびに、/dev/block に対する権限の問題が引き続き発生するためです。

ブロックボリュームを使用する理由:

EKSを実行しており、同じアベイラビリティーゾーンにある複数のポッド間で「ReadWriteMany」のデータを共有したいと思います。私はio2でEBSの代わりにEFSボリュームを試しましたが、価格/遅延の問題があります。

関連質問:

答え1

私に役立つソリューションは、特定のボリュームスナップショットのコピーでノードを設定できるAWS EC2機能(Karpenterからエクスポート)を使用することでした。

私のKarpenterのec2 NodeClassは次のとおりです。

apiVersion: karpenter.k8s.aws/v1beta1
kind: EC2NodeClass
metadata:
  name: test
spec:
  amiFamily: AL2
  ...
  blockDeviceMappings:
  - deviceName: /dev/xvda
    ebs:
      deleteOnTermination: true
      volumeSize: 100Gi
      volumeType: gp2
  - deviceName: /dev/xvdc
    ebs:
      deleteOnTermination: true
      snapshotID: snap-ID-NUMBER
      volumeSize: 40Gi
      volumeType: gp2
 ...
  userData: |-
    #!/bin/bash
    set -x
    ...
    mkdir -p /home/ec2-user/data/
    mount -o defaults /dev/nvme2n1 /home/ec2-user/data/
    ...

これにはいくつかの試行錯誤がありましたが、主な示唆点は次のとおりです。

  • AWSは、私が提供した特定のsnapshotIDからコピーされたディスクを提供します。
  • 私のAMIでは、/dev/xvdcの下に追加されます。これは/dev/nvme2n1と同じですが、すべてのAMIS / Archに対して保証されるわけではありません。
  • EC2のユーザーデータにファイルシステムを搭載しました。

また、データが更新されたことを確認するために、userDataの一部としてaws s3同期を実行します。 Karpenterは必要ありません。 AWS EC2のAPIを使用して同じ動作を複製するだけです。

関連情報