ワークロードのスケーリング
Fargateのもう一つの利点は、簡素化された水平スケーリングモデルです。EC2をコンピュートとして使用する場合、Podのスケーリングでは、Podだけでなく基盤となるコンピュートがどのようにスケールするかも考慮する必要があります。Fargateは基盤となるコンピュートを抽象化するため、Pod自体のスケーリングのみを考慮すればよいのです。
これまで見てきた例では、単一のPodレプリカのみを使用していました。実際のシナリオで一般的に想定されるように、これを水平方向にスケールするとどうなるでしょうか?checkoutサービスをスケールアップして確認してみましょう:
- Kustomize Patch
- Deployment/checkout
- Diff
~/environment/eks-workshop/modules/fundamentals/fargate/scaling/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: checkout
spec:
replicas: 3
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: 3
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
app.kubernetes.io/type: app
name: checkout
namespace: checkout
spec:
- replicas: 1
+ replicas: 3
selector:
matchLabels:
app.kubernetes.io/component: service
app.kubernetes.io/instance: checkout
Kustomizationを適用し、ロールアウトが完了するまで待ちます:
~$kubectl apply -k ~/environment/eks-workshop/modules/fundamentals/fargate/scaling
[...]
~$kubectl rollout status -n checkout deployment/checkout --timeout=200s
ロールアウトが完了したら、Podの数を確認できます:
~$kubectl get pod -n checkout -l app.kubernetes.io/component=service
NAME READY STATUS RESTARTS AGE
checkout-585c9b45c7-2c75m 1/1 Running 0 2m12s
checkout-585c9b45c7-c456l 1/1 Running 0 2m12s
checkout-585c9b45c7-xmx2t 1/1 Running 0 40m
これらのPodはそれぞれ別々のFargateインスタンスにスケジュールされています。以前と同様のステップに従って、特定のPodのノードを識別することでこれを確認できます。