Fargate for EKSでProbeが実行できるか検証してみた #reinvent

2019.12.05

Fargate for EKSでProbeが実行できるか検証してみました。

検証の背景

k8s上でサーバーレスコンテナプラットフォームを利用するための手段としてvirtual-kubeletというものが存在しています。 このvirtual-kubeletを利用するとコンテナの実行基盤としてFargateやACIなどを実行するとこができますが、Probeが使えず、コンテナの診断は自分たちで実装するしかありませんでした。

んじゃあ、Fargate for EKSではどうなってるの??というのが気になったので検証してみました。

参考

やってみた

以下の環境で確認します。

  • aws cli: 1.16.296
  • eksctl: 0.11.0

クラスタ作成

eksctlの0.11.0より--fargateオプションが追加されているので、これを使ってクラスタを作成します。

$ eksctl create cluster --fargate --name eks-fargete-cluster
$ kubectl version --short
Client Version: v1.14.8
Server Version: v1.14.8-eks-b8860f

--fargateオプションを使うことによりfargateProfileも作成されるようになります。

$ aws eks list-fargate-profiles --cluster-name eks-fargete-cluster
{
    "fargateProfileNames": [
        "fp-default"
    ]
}

k8sは以下のような状態となります。

$ kubectl get nodes
NAME                                                         STATUS   ROLES    AGE   VERSION
fargate-ip-192-168-119-150.ap-northeast-1.compute.internal   Ready    <none>   25m   v1.14.8-eks
fargate-ip-192-168-165-66.ap-northeast-1.compute.internal    Ready    <none>   26m   v1.14.8-eks

$ kubectl get pod --all-namespaces
NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE
kube-system   coredns-6d75bbbf58-45bmk   1/1     Running   0          26m
kube-system   coredns-6d75bbbf58-9cwz8   1/1     Running   0          26m

Probeの実行

livenessProbeはコンテナの死活監視の設定です。livenessProbeに失敗するとコンテナは削除されます。 livenessを確認するため以下のPodをデプロイします。定義ファイルは公式ドキュメントのものを利用します。

コンテナは起動時に/tmp/healthyというファイルを作成しlivenessProbeではそのファイルを監視します。30秒後に/tmp/healthyを削除することでlivenessProbeが失敗し、コンテナが再起動されるというのが期待値になります。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

PodをデプロイしPodの状態を監視します。

$ kubectl apply -f exec-liveness.yaml 
pod/liveness-exec created
kubectl$ get pods --watch
NAME            READY   STATUS    RESTARTS   AGE
liveness-exec   0/1     Pending   0          7s
liveness-exec   0/1     Pending   0          24s
liveness-exec   0/1     ContainerCreating   0          24s
liveness-exec   1/1     Running             0          27s
liveness-exec   1/1     Running             1          103s
liveness-exec   1/1     Running             2          2m58s
liveness-exec   1/1     Running             3          4m13s

定期的に再起動されておりlivenessProbeが有効であることが確認できます。イベントにもLivenessの結果が出力されてます。

$ kubectl describe pod liveness-exec
Events:
  Type     Reason     Age                  From                                                                Message
  ----     ------     ----                 ----                                                                -------
  Normal   Pulling    55s (x3 over 3m26s)  kubelet, fargate-ip-192-168-191-91.ap-northeast-1.compute.internal  Pulling image "k8s.gcr.io/busybox"
  Normal   Pulled     54s (x3 over 3m25s)  kubelet, fargate-ip-192-168-191-91.ap-northeast-1.compute.internal  Successfully pulled image "k8s.gcr.io/busybox"
  Normal   Created    54s (x3 over 3m24s)  kubelet, fargate-ip-192-168-191-91.ap-northeast-1.compute.internal  Created container liveness
  Normal   Started    53s (x3 over 3m24s)  kubelet, fargate-ip-192-168-191-91.ap-northeast-1.compute.internal  Started container liveness
  Warning  Unhealthy  10s (x9 over 2m50s)  kubelet, fargate-ip-192-168-191-91.ap-northeast-1.compute.internal  Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
  Normal   Killing    10s (x3 over 2m40s)  kubelet, fargate-ip-192-168-191-91.ap-northeast-1.compute.internal  Container liveness failed liveness probe, will be restarted

まとめ

Fargate for EKSでProbeは問題なく使えそうです!!