スポットでワークロードを実行する
次に、サンプル小売店アプリケーションを変更して、カタログコンポーネントを新しく作成したスポットインスタンスで実行してみましょう。そのためには、Kustomizeを使用してcatalogデプロイメントにパッチを適用し、nodeSelectorフィールドにeks.amazonaws.com/capacityType: SPOTを追加します。
- Kustomize Patch
- Deployment/catalog
- Diff
~/environment/eks-workshop/modules/fundamentals/mng/spot/deployment/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: catalog
spec:
template:
spec:
nodeSelector:
eks.amazonaws.com/capacityType: SPOT
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/type: app
name: catalog
namespace: catalog
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/component: service
app.kubernetes.io/instance: catalog
app.kubernetes.io/name: catalog
template:
metadata:
annotations:
prometheus.io/path: /metrics
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: catalog
app.kubernetes.io/name: catalog
spec:
containers:
- envFrom:
- configMapRef:
name: catalog
- secretRef:
name: catalog-db
image: public.ecr.aws/aws-containers/retail-store-sample-catalog:1.2.1
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 3
name: catalog
ports:
- containerPort: 8080
name: http
protocol: TCP
readinessProbe:
httpGet:
path: /health
port: 8080
periodSeconds: 5
successThreshold: 3
resources:
limits:
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- mountPath: /tmp
name: tmp-volume
nodeSelector:
eks.amazonaws.com/capacityType: SPOT
securityContext:
fsGroup: 1000
serviceAccountName: catalog
volumes:
- emptyDir:
medium: Memory
name: tmp-volume
runAsUser: 1000
volumeMounts:
- mountPath: /tmp
name: tmp-volume
+ nodeSelector:
+ eks.amazonaws.com/capacityType: SPOT
securityContext:
fsGroup: 1000
serviceAccountName: catalog
volumes:
次のコマンドでKustomizeパッチを適用します。
~$kubectl apply -k ~/environment/eks-workshop/modules/fundamentals/mng/spot/deployment
namespace/catalog unchanged
serviceaccount/catalog unchanged
configmap/catalog unchanged
secret/catalog-db unchanged
service/catalog unchanged
service/catalog-mysql unchanged
deployment.apps/catalog configured
statefulset.apps/catalog-mysql unchanged
以下のコマンドで、アプリケーションが正常にデプロイされたことを確認します。
~$kubectl rollout status deployment/catalog -n catalog --timeout=5m
最後に、カタログポッドがスポットインスタンス上で実行されていることを確認しましょう。次の2つのコマンドを実行します。
~$kubectl get pods -l app.kubernetes.io/component=service -n catalog -o wide
NAME READY STATUS RESTARTS AGE IP NODE
catalog-6bf46b9654-9klmd 1/1 Running 0 7m13s 10.42.118.208 ip-10-42-99-254.us-east-2.compute.internal
~$kubectl get nodes -l eks.amazonaws.com/capacityType=SPOT
NAME STATUS ROLES AGE VERSION
ip-10-42-139-140.us-east-2.compute.internal Ready <none> 16m v1.33-eks-036c24b
ip-10-42-99-254.us-east-2.compute.internal Ready <none> 16m v1.33-eks-036c24b
最初のコマンドは、カタログポッドがノードip-10-42-99-254.us-east-2.compute.internalで実行されていることを示しています。2番目のコマンドの出力と照合すると、これがスポットインスタンスであることが確認できます。
このラボでは、スポットインスタンスを作成するマネージドノードグループをデプロイし、catalogデプロイメントを変更して新しく作成されたスポットインスタンス上で実行するようにしました。このプロセスに従って、クラスター内で実行中の任意のデプロイメントを、上記のKustomizationパッチで指定されているnodeSelectorパラメータを追加することで変更することができます。