(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を使用して同じ動作を複製するだけです。