(volDevices를 통해) 볼륨을 원시 블록으로 마운트하는 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을 마운트하고 싶습니다.
기본 이미지에 대한 모든 권한이 있으며 기본 사용자는 루트가 아닌 그룹에 추가된 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을 공유해야 하지만 데이터가 마운트된 볼륨에 존재하므로 작동하지 않습니다.
아직 시도하지 않은 것들:
한 가지 가능한 실패 지점은 잘못된 /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를 사용하여 동일한 동작을 복제하면 됩니다.