FSx for NetApp ONTAPを使用した動的プロビジョニング
これでKubernetes用のFSx for NetApp ONTAPストレージクラスの理解が深まったところで、Persistent Volumeを作成し、UIコンポーネントを変更してこのボリュームをマウントしましょう。
まず、fsxnpvclaim.yamlファイルを確認しましょう:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: fsxn-nfs-claim
namespace: ui
spec:
accessModes:
- ReadWriteMany
storageClassName: fsxn-sc-nfs
resources:
requests:
storage: 5Gi
定義しているリソースはPersistentVolumeClaimです
これは先ほど作成したfsxn-sc-nfsストレージクラスを参照しています
5GBのストレージを要求しています
次に、UIコンポーネントを更新してFSx for NetApp ONTAP PVCを参照するようにします:
- Kustomize Patch
- Deployment/ui
- Diff
apiVersion: apps/v1
kind: Deployment
metadata:
name: ui
spec:
replicas: 2
template:
spec:
containers:
- name: ui
volumeMounts:
- name: fsxnvolume
mountPath: /fsxn
env:
- name: RETAIL_UI_PRODUCT_IMAGES_PATH
value: /fsxn
volumes:
- name: fsxnvolume
persistentVolumeClaim:
claimName: fsxn-nfs-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: /fsxn
- 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: /fsxn
name: fsxnvolume
- mountPath: /tmp
name: tmp-volume
securityContext:
fsGroup: 1000
serviceAccountName: ui
volumes:
- name: fsxnvolume
persistentVolumeClaim:
claimName: fsxn-nfs-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: /fsxn
- 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: /fsxn
+ name: fsxnvolume
- mountPath: /tmp
name: tmp-volume
securityContext:
fsGroup: 1000
serviceAccountName: ui
volumes:
+ - name: fsxnvolume
+ persistentVolumeClaim:
+ claimName: fsxn-nfs-claim
- emptyDir:
medium: Memory
name: tmp-volume
次のコマンドでこれらの変更を適用します:
namespace/ui unchanged
serviceaccount/ui unchanged
configmap/ui unchanged
service/ui unchanged
persistentvolumeclaim/fsxn-nfs-claim created
deployment.apps/ui configured
デプロイメントのvolumeMountsを調べてみましょう。fsxnvolumeという名前の新しいボリュームが/fsxnにマウントされていることに注目してください:
- mountPath: /fsxn
name: fsxnvolume
- mountPath: /tmp
name: tmp-volume
PersistentVolumeClaim(PVC)を満たすためにPersistentVolume(PV)が自動的に作成されました:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-342a674d-b426-4214-b8b6-7847975ae121 5Gi RWX Delete Bound ui/fsxn-claim fsxn-sc-nfs 2m33s
PersistentVolumeClaim(PVC)の詳細を確認しましょう:
Name: fsxn-claim
Namespace: ui
StorageClass: fsxn-sc-nfs
Status: Bound
Volume: pvc-342a674d-b426-4214-b8b6-7847975ae121
Labels: <none>
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: csi.trident.netapp.io
volume.kubernetes.io/storage-provisioner: csi.trident.netapp.io
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 5Gi
Access Modes: RWX
VolumeMode: Filesystem
Used By: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ExternalProvisioning 34s persistentvolume-controller waiting for a volume to be created, either by external provisioner "csi.trident.netapp.io" or manually created by system administrator
Normal Provisioning 34s csi.trident.netapp.io_trident-csi-6b9cdcddf6-kwx7p_35a063fc-5d91-4ba1-9bce-4d71de597b14 External provisioner is provisioning volume for claim "ui/fsxn-claim"
Normal ProvisioningSucceeded 33s csi.trident.netapp.io_trident-csi-6b9cdcddf6-kwx7p_35a063fc-5d91-4ba1-9bce-4d71de597b14 Successfully provisioned volume pvc-342a674d-b426-4214-b8b6-7847975ae121
この時点で、FSx for NetApp ONTAPファイルシステムは正常にマウントされていますが、現在は空です:
Kubernetes Jobを使用して、FSx for NetApp ONTAPボリュームに画像を追加しましょう:
次に、UIコンポーネントのPodの一つを通じて/fsxnの現在のファイルをリストすることで、共有ストレージ機能を実証してみましょう:
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 NetApp ONTAPボリュームに追加してみましょう:
次に、2番目のUIPodがこの新しく 作成されたファイルにアクセスできることを確認し、FSx for NetApp ONTAPストレージの共有特性を実証します:
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を通じてファイルを作成しましたが、両方のPodが同じFSx for NetApp ONTAPファイルシステムにアクセスしているため、2番目のPodもすぐにそのファイルにアクセスできます。
最後に、UIサービスを通じて画像にアクセスできることを確認しましょう:
http://k8s-ui-uinlb-647e781087-6717c5049aa96bd9.elb.us-west-2.amazonaws.com/assets/img/products/placeholder.jpg
ブラウザでURLにアクセスしてみましょう:
Amazon FSx for NetApp ONTAPがAmazon EKSで実行されるワークロードに永続的な共有ストレージを提供する方法を成功裏に実証しました。このソリューションにより、複数のPodが同時に同じストレージボリュームから読み書きすることができ、共有コンテンツホスティングやエンタープライズグレードの機能とパフォーマンスを備えた分散ファイルシステムアクセスを必要とする他のユースケースに最適です。