リソース割り当て
Fargate の料金の主な要素は CPU とメモリに基づいており、Fargate インスタンスに割り当てられるリソース量は Pod で指定されるリソースリクエストに依存します。Fargate にはドキュメント化された有効な CPU とメモリの組み合わせがあり、ワークロードが Fargate に適しているかを評価する際に考慮する必要があります。
前回のデプロイメントで Pod に割り当てられたリソースを、そのアノテーションを調べることで確認できます:
~$kubectl get pod -n checkout -l app.kubernetes.io/component=service -o json | jq -r '.items[0].metadata.annotations'
{"CapacityProvisioned": "0.25vCPU 0.5GB",
"Logging": "LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND",
"kubernetes.io/psp": "eks.privileged",
"prometheus.io/path": "/metrics",
"prometheus.io/port": "8080",
"prometheus.io/scrape": "true"
}
この例(上記)では、CapacityProvisioned アノテーションが 0.25 vCPU と 0.5 GB のメモリが割り当てられていることを示しています。これは Fargate インスタンスの最小サイズです。しかし、Pod がより多くのリソースを必要とする場合はどうなるでしょうか?幸いなことに、Fargate はリソースリクエストに応じて様々なオプションを提供しており、試してみることができます。
次の例では、checkout コンポーネントがリクエストするリソース量を 1 vCPU と 2.5G のメモリに増やし、Fargate スケジューラがどのように適応するかを見てみましょう:
- Kustomize Patch
- Deployment/checkout
- Diff
~/environment/eks-workshop/modules/fundamentals/fargate/sizing/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: checkout
spec:
template:
spec:
containers:
- name: checkout
resources:
requests:
cpu: "1"
memory: 2.5G
limits:
memory: 2.5G
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/type: app
name: checkout
namespace: checkout
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/component: service
app.kubernetes.io/instance: checkout
app.kubernetes.io/name: checkout
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: checkout
app.kubernetes.io/name: checkout
fargate: yes
spec:
containers:
- envFrom:
- configMapRef:
name: checkout
image: public.ecr.aws/aws-containers/retail-store-sample-checkout:1.2.1
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 3
name: checkout
ports:
- containerPort: 8080
name: http
protocol: TCP
resources:
limits:
memory: 2.5G
requests:
cpu: "1"
memory: 2.5G
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
volumeMounts:
- mountPath: /tmp
name: tmp-volume
securityContext:
fsGroup: 1000
serviceAccountName: checkout
volumes:
- emptyDir:
medium: Memory
name: tmp-volume
name: http
protocol: TCP
resources:
limits:
- memory: 512Mi
+ memory: 2.5G
requests:
- cpu: 250m
- memory: 512Mi
+ cpu: "1"
+ memory: 2.5G
securityContext:
capabilities:
drop:
- ALL
kustomization を適用し、ロールアウトが完了するまで待ちます:
~$kubectl apply -k ~/environment/eks-workshop/modules/fundamentals/fargate/sizing
[...]
~$kubectl rollout status -n checkout deployment/checkout --timeout=200s
では、Fargate によって割り当てられたリソースを再度確認しましょう。上記の変更に基づいて、何が表示されると予想しますか?
~$kubectl get pod -n checkout -l app.kubernetes.io/component=service -o json | jq -r '.items[0].metadata.annotations'
{"CapacityProvisioned": "1vCPU 3GB",
"Logging": "LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND",
"kubernetes.io/psp": "eks.privileged",
"prometheus.io/path": "/metrics",
"prometheus.io/port": "8080",
"prometheus.io/scrape": "true"
}
Pod によってリクエストされたリソースは、上記で説明された有効な組み合わせセットの中で、最も近い Fargate 構成に切り上げられています。