🚀
kube-fledgedでイメージキャッシュを作ってPodの起動を速くする
はじめに
コンテナイメージのキャッシュが無い状態で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でその課題を解決できる
デプロイ
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