前回投稿の続き。Terraformから構築したEKSクラスタで、Fargate Podを起動してみる。
EKS FargateクラスタをTerraformで作成する(1)
この時点ではノードグループ、Fargateプロファイルを含めてEKSクラスタが構築完了した状態である。まずはupdate-kubeconfig実行して状態を確認。(kubectlのセットアップは割愛。前からあったv1.19で今回のクラスタのバージョンv1.21に対応していないが、一応動作した)
$ aws eks update-kubeconfig --name eks-test-cluster
$ kubectl get no
NAME STATUS ROLES AGE VERSION
ip-10-0-2-99.ap-northeast-1.compute.internal Ready <none> 19m v1.21.5-eks-bc4871b
ip-10-0-3-18.ap-northeast-1.compute.internal Ready <none> 19m v1.21.5-eks-bc4871b
$ kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system aws-node-6fp74 1/1 Running 0 19m
kube-system aws-node-ncjhh 1/1 Running 0 19m
kube-system coredns-76f4967988-7pr2d 1/1 Running 0 48m
kube-system coredns-76f4967988-t4lmc 1/1 Running 0 48m
kube-system kube-proxy-58kvx 1/1 Running 0 19m
kube-system kube-proxy-pfw7j 1/1 Running 0 19m
ここまではいつもと同じ。最小限のノードに、システム系のPodが起動している。ではFargate Podを起動!…の前に、前回の構築時にSelectorとしてNamespace[fargate-test]を指定しているため、fargate-testネームスペースが必要である。この時点では対象ネームスペースが存在しないため新規作成する。
# 作業前のネームスペース確認
$ kubectl get namespace
NAME STATUS AGE
default Active 54m
kube-node-lease Active 54m
kube-public Active 54m
kube-system Active 54m
# ネームスペース fargate-testを作成
$ kubectl create namespace fargate-test
namespace/fargate-test created
# 確認
$ kubectl get namespace | grep fargate
fargate-test Active 53s
ネームスペースが作成されたので、これを指定してFargate Podを起動する。マニフェストは何も用意していないからこんなんで。
$ kubectl create deployment test-app --namespace fargate-test --image=nginx
deployment.apps/test-app created
やっとRunningになった。
$ kubectl get po -n fargate-test
NAME READY STATUS RESTARTS AGE
test-app-f8c9656cd-ph7vg 1/1 Running 0 96s
get noしてみると、Fargage専用ノードが起動しているのが確認できた。
$ kubectl get no
NAME STATUS ROLES AGE VERSION
fargate-ip-10-0-2-10.ap-northeast-1.compute.internal Ready <none> 103s v1.21.2-eks-06eac09
ip-10-0-2-99.ap-northeast-1.compute.internal Ready <none> 31m v1.21.5-eks-bc4871b
ip-10-0-3-18.ap-northeast-1.compute.internal Ready <none> 31m v1.21.5-eks-bc4871b
そういえば、get pods に-o wide
つければ一回で確認可能だった。
$ kubectl get po -n fargate-test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-app-f8c9656cd-ph7vg 1/1 Running 0 5m7s 10.0.2.10 fargate-ip-10-0-2-10.ap-northeast-1.compute.internal <none> <none>
最後にPodのdescribe結果を載せておく。リソース割り当てらしき箇所、[CapacityProvisioned: 0.25vCPU 0.5GB]となっている。これがデフォルト値なんだろう。当然実運用に向けては適宜サイジングすることになる。
$ kubectl describe po -n fargate-test test-app-f8c9656cd-ph7vg
Name: test-app-f8c9656cd-ph7vg
Namespace: fargate-test
Priority: 2000001000
Priority Class Name: system-node-critical
Node: fargate-ip-10-0-2-10.ap-northeast-1.compute.internal/10.0.2.10
Start Time: Mon, 03 Jan 2022 12:31:21 +0900
Labels: app=test-app
eks.amazonaws.com/fargate-profile=test-profile
pod-template-hash=f8c9656cd
Annotations: CapacityProvisioned: 0.25vCPU 0.5GB
Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND
kubernetes.io/psp: eks.privileged
Status: Running
IP: 10.0.2.10
IPs:
IP: 10.0.2.10
Controlled By: ReplicaSet/test-app-f8c9656cd
Containers:
nginx:
Container ID: containerd://30f18fbf447144fec406634651e8e7ba0651a285a814419b77bf8c4d1d317f44
Image: nginx
Image ID: docker.io/library/nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Port: <none>
Host Port: <none>
State: Running
Started: Mon, 03 Jan 2022 12:31:30 +0900
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-9c7kb (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-9c7kb:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning LoggingDisabled 14m fargate-scheduler Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
Normal Scheduled 13m fargate-scheduler Successfully assigned fargate-test/test-app-f8c9656cd-ph7vg to fargate-ip-10-0-2-10.ap-northeast-1.compute.internal
Normal Pulling 13m kubelet, fargate-ip-10-0-2-10.ap-northeast-1.compute.internal Pulling image "nginx"
Normal Pulled 13m kubelet, fargate-ip-10-0-2-10.ap-northeast-1.compute.internal Successfully pulled image "nginx" in 7.409339398s
Normal Created 13m kubelet, fargate-ip-10-0-2-10.ap-northeast-1.compute.internal Created container nginx
Normal Started 13m kubelet, fargate-ip-10-0-2-10.ap-northeast-1.compute.internal Started container nginx
ここまで確認できたのでPodを削除
$ kubectl delete deployment test-app --namespace fargate-test
eksクラスタはterraform destroyで一気に削除した。
$ time terraform destroy
:
:
aws_eks_fargate_profile.fargate-test: Destroying... [id=eks-test-cluster:test-profile]
aws_eks_node_group.eks-node: Destroying... [id=eks-test-cluster:eks-test-node]
6m6.166s
次回からは再びterraform apply
でお気軽に検証できるもんな!…と言いつつ、正直Fargateの有り難みってよくわからんな。…ということがわかった検証であった。Podとノードは1:1と決まっていて処理が終わったらノードも消滅するとなれば、バッチ処理に向いていることくらいは想像がつくが。
通常のEKSとFargateは共存可能なため、アプリの処理の特性によってそれぞれどちらを選択するのか、または1クラスタにおいて片方のみで運用するのか、その検討のために頭を使うことになる。やはり夢は見ちゃいけないのである。