FSx for Lustre を使用した動的プロビジョニング
Kubernetes 用の FSx for Lustre ストレージクラスについて理解したので、UI コンポーネントを変更して FSx for Lustre ボリュームをマウントしましょう。
FSx for Lustre PVC を参照するように UI コンポーネントを更新します:
- Kustomize Patch
- Deployment/ui
- Diff
apiVersion: apps/v1
kind: Deployment
metadata:
name: ui
spec:
replicas: 2
template:
spec:
initContainers:
- name: fix-permissions
image: public.ecr.aws/docker/library/busybox:1.37
command: ["sh", "-c", "chown 1000:1000 /fsxl"]
volumeMounts:
- name: fsxlvolume
mountPath: /fsxl
securityContext:
runAsUser: 0
containers:
- name: ui
volumeMounts:
- name: fsxlvolume
mountPath: /fsxl
env:
- name: RETAIL_UI_PRODUCT_IMAGES_PATH
value: /fsxl
volumes:
- name: fsxlvolume
persistentVolumeClaim:
claimName: fsxl-claim
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/type: app
name: ui
namespace: ui
spec:
replicas: 2
selector:
matchLabels:
app.kubernetes.io/component: service
app.kubernetes.io/instance: ui
app.kubernetes.io/name: ui
template:
metadata:
annotations:
prometheus.io/path: /actuator/prometheus
prometheus.io/port: "8080"
prometheus.io/scrape: "true"
labels:
app.kubernetes.io/component: service
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/instance: ui
app.kubernetes.io/name: ui
spec:
containers:
- env:
- name: RETAIL_UI_PRODUCT_IMAGES_PATH
value: /fsxl
- name: JAVA_OPTS
value: -XX:MaxRAMPercentage=75.0 -Djava.security.egd=file:/dev/urandom
- name: METADATA_KUBERNETES_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: METADATA_KUBERNETES_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: METADATA_KUBERNETES_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
envFrom:
- configMapRef:
name: ui
image: public.ecr.aws/aws-containers/retail-store-sample-ui:1.2.1
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 45
periodSeconds: 20
name: ui
ports:
- containerPort: 8080
name: http
protocol: TCP
resources:
limits:
memory: 1.5Gi
requests:
cpu: 250m
memory: 1.5Gi
securityContext:
capabilities:
add:
- NET_BIND_SERVICE
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- mountPath: /fsxl
name: fsxlvolume
- mountPath: /tmp
name: tmp-volume
initContainers:
- command:
- sh
- -c
- chown 1000:1000 /fsxl
image: public.ecr.aws/docker/library/busybox:1.37
name: fix-permissions
securityContext:
runAsUser: 0
volumeMounts:
- mountPath: /fsxl
name: fsxlvolume
securityContext:
fsGroup: 1000
serviceAccountName: ui
volumes:
- name: fsxlvolume
persistentVolumeClaim:
claimName: fsxl-claim
- emptyDir:
medium: Memory
name: tmp-volume
app.kubernetes.io/type: app
name: ui
namespace: ui
spec:
- replicas: 1
+ replicas: 2
selector:
matchLabels:
app.kubernetes.io/component: service
app.kubernetes.io/instance: ui
[...]
app.kubernetes.io/name: ui
spec:
containers:
- env:
+ - name: RETAIL_UI_PRODUCT_IMAGES_PATH
+ value: /fsxl
- name: JAVA_OPTS
value: -XX:MaxRAMPercentage=75.0 -Djava.security.egd=file:/dev/urandom
- name: METADATA_KUBERNETES_POD_NAME
valueFrom:
[...]
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
+ - mountPath: /fsxl
+ name: fsxlvolume
- mountPath: /tmp
name: tmp-volume
+ initContainers:
+ - command:
+ - sh
+ - -c
+ - chown 1000:1000 /fsxl
+ image: public.ecr.aws/docker/library/busybox:1.37
+ name: fix-permissions
+ securityContext:
+ runAsUser: 0
+ volumeMounts:
+ - mountPath: /fsxl
+ name: fsxlvolume
securityContext:
fsGroup: 1000
serviceAccountName: ui
volumes:
+ - name: fsxlvolume
+ persistentVolumeClaim:
+ claimName: fsxl-claim
- emptyDir:
medium: Memory
name: tmp-volume
以下のコマンドでこれらの変更を適用します:
namespace/ui unchanged
serviceaccount/ui unchanged
configmap/ui unchanged
service/ui unchanged
deployment.apps/ui configured
Deployment の volumeMounts を確認しましょう。fsxlvolume という名前の新しいボリュームが /fsxl にマウントされていることに注目してください:
- mountPath: /fsxl
name: fsxlvolume
- mountPath: /tmp
name: tmp-volume
PersistentVolume (PV) が静的にプロビジョニングされ、PersistentVolumeClaim (PVC) にバインドされています:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS AGE
fsxl-pv 1200Gi RWX Retain Bound ui/fsxl-claim fsx-lustre-sc 5m
PersistentVolumeClaim (PVC) の詳細を確認しましょう:
Name: fsxl-claim
Namespace: ui
StorageClass: fsx-lustre-sc
Status: Bound
Volume: fsxl-pv
Labels: <none>
Annotations: pv.kubernetes.io/bind-completed: yes
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 1200Gi
Access Modes: RWX
VolumeMode: Filesystem
Used By: ui-5d4687cf64-phs2w
ui-5d4687cf64-rc29s
Events: <none>
この時点で、FSx for Lustre ファイルシステムは正常にマウントされていますが、現在は空です:
Kubernetes Job を使用して、FSx for Lustre ボリュームに画像を追加しましょう:
それでは、UI コンポーネントの Pod の 1 つを通じて /fsxl 内の現在のファイルを一覧表示することで、共有ストレージ機能を実証しましょう:
1ca35e86-4b4c-4124-b6b5-076ba4134d0d.jpg
4f18544b-70a5-4352-8e19-0d070f46745d.jpg
631a3db5-ac07-492c-a994-8cd56923c112.jpg
79bce3f3-935f-4912-8c62-0d2f3e059405.jpg
8757729a-c518-4356-8694-9e795a9b3237.jpg
87e89b11-d319-446d-b9be-50adcca5224a.jpg
a1258cd2-176c-4507-ade6-746dab5ad625.jpg
cc789f85-1476-452a-8100-9e74502198e0.jpg
d27cf49f-b689-4a75-a249-d373e0330bb5.jpg
d3104128-1d14-4465-99d3-8ab9267c687b.jpg
d4edfedb-dbe9-4dd9-aae8-009489394955.jpg
d77f9ae6-e9a8-4a3e-86bd-b72af75cbc49.jpg
共有ストレージ機能をさらに実証するために、placeholder.jpg という名前の新しい画像を作成し、最初の Pod を通じて FSx for Lustre ボリュームに追加しましょう:
次に、2 番目の UI Pod が新しく作成されたファイルにアクセスできることを確認し、FSx for Lustre ストレージの共有性を実証しましょう:
1ca35e86-4b4c-4124-b6b5-076ba4134d0d.jpg
4f18544b-70a5-4352-8e19-0d070f46745d.jpg
631a3db5-ac07-492c-a994-8cd56923c112.jpg
79bce3f3-935f-4912-8c62-0d2f3e059405.jpg
8757729a-c518-4356-8694-9e795a9b3237.jpg
87e89b11-d319-446d-b9be-50adcca5224a.jpg
a1258cd2-176c-4507-ade6-746dab5ad625.jpg
cc789f85-1476-452a-8100-9e74502198e0.jpg
d27cf49f-b689-4a75-a249-d373e0330bb5.jpg
d3104128-1d14-4465-99d3-8ab9267c687b.jpg
d4edfedb-dbe9-4dd9-aae8-009489394955.jpg
d77f9ae6-e9a8-4a3e-86bd-b72af75cbc49.jpg
placeholder.jpg <----------------
ご覧のように、最初の Pod を通じてファイルを作成したにもかかわらず、2 番目の Pod はすぐにそれにアクセスできます。これは、両方が同じ共有 FSx for Lustre ファイルシステムにアクセスしているためです。
最後に、UI サービスを通じて画像にアクセスできることを確認しましょう:
http://k8s-ui-uinlb-647e781087-6717c5049aa96bd9.elb.us-west-2.amazonaws.com/assets/img/products/placeholder.jpg
ブラウザで URL にアクセスしてください:
Amazon FSx for Lustre が Amazon EKS 上で実行されるワークロードに高性能な共有並列ストレージを提供する方法を実証することに成功しました。このソリューションにより、複数の Pod が同じストレージボリュームに同時に読み書きできるため、機械学習のトレーニングデータ、HPC ワークロード、メディア処理、および高スループットの並列ファイルシステムアクセスを必要とするその他のユースケースに最適です。