🚀

kube-fledgedでイメージキャッシュを作ってPodの起動を速くする

2022/07/20に公開

はじめに

コンテナイメージのキャッシュが無い状態でPodが起動する場合、イメージのpullで時間がかかる

$ kubectl create deploy nginx --image=nginx:1.23
$ kubectl describe po nginx-6c7985744b-8kmms
...
  Normal  Pulled  7s  kubelet  Successfully pulled image "nginx:1.23" in 1.73102875s
...

キャッシュが効いていれば起動時間を短縮できる

$ kubectl rollout restart deploy nginx
$ kubectl describe po nginx-584954c74c-65tll
...
  Normal  Pulled  4s  kubelet  Container image "nginx:1.23" already present on machine
...

初めてデプロイするアプリケーションや、Workerノードの入れ替えなどでイメージのpullが走ることはありますが、ユースケースによっては起動時間が遅いことが許容できない場合もあると思います

このOSSでその課題を解決できる
https://github.com/senthilrch/kube-fledged

デプロイ

kindにkube-fledgedをデプロイしてみます

$ git clone git@github.com:senthilrch/kube-fledged.git && cd kube-fledged
$ make deploy-using-yaml
$ kubectl get po -n kube-fledged
NAME                                      READY   STATUS    RESTARTS   AGE
kubefledged-controller-65c897c5ff-ghbvk   1/1     Running   0          1m18s

オプショナルでwebhookもデプロイすれば、カスタムリソースに対してのバリデーションができるようです

動作確認

deploy/kubefledged-imagecache.yaml
apiVersion: kubefledged.io/v1alpha2
kind: ImageCache
metadata:
  name: imagecache1
  namespace: kube-fledged
  labels:
    app: kubefledged
    kubefledged: imagecache
spec:
  cacheSpec:
  - images:
    - nginx:1.22
$ kubectl apply -f deploy/kubefledged-imagecache.yaml
$ kubectl get imagecaches -n kube-fledged
NAME          AGE
imagecache1   1m

ImageCacheを監視しているkubefledged-controllerがJobを作成して、imagesに記載したコンテナイメージを起動するだけのPodが作成されるようです

$ kubectl get event -n kube-fledged | grep 'Successfully pulled image'
5m  Normal  Pulled  pod/imagecache1-6hgrl-fcxmb  Successfully pulled image "nginx:1.22" in 7.394789479s

これでイメージのキャッシュができたので、アプリケーションをデプロイする際にpullは実行されません

$ kubectl create deploy nginx --image=nginx:1.22
$ kubectl describe po nginx-55fb6488cb-mdbpg
...
  Normal  Pulled  9s  kubelet  Container image "nginx:1.22" already present on machine
...

定期的にイメージのリフレッシュが走りますが、間隔はフラグ--image-cache-refresh-frequencyで変更可能です(Workerノードの入れ替わりは監視しておらず、リフレッシュのタイミングでキャッシュを作りにいきます)

アーキテクチャ

design-proposalに詳しく書いてあります

Discussion