前回投稿の続き。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クラスタにおいて片方のみで運用するのか、その検討のために頭を使うことになる。やはり夢は見ちゃいけないのである。

 

三島 三島 三島


関連がありそうな記事