#背景
kubectlって意外と長い。。。こんなすごく省略したものもあるけど https://containerized.me/600-kubectl-aliases-for-devops-ninjas/
うちではkubectlをkubeに+カスタムコマンドでデプロイとデストロイを使ってマネージしてます。
最近cronjobsを追加したりモニタリングを入れてfalse alertが出るようになってしまったので今まで使っていたコマンドを見直すことに。この過程でkubectl get/delete allが全部じゃないことに気付いたのでメモ。
##original destroy/deploy command
- "kube destroy namespace" - namespaceごと消す
kubectl delete -R -f path/to/the/file/
- "kube destroy namespace app" - アプリだけ消す
kubectl delete -R -f path/to/the/file/(appN)/
- "kube deploy namespace" - アプリの起動する順番を考慮してるのかとりあえずsleepしてたが、
最近入れたモニタリングでこれだけではうまくいかずアプリNのfalse alertが出てしまうようになり見直すことに
kubectl apply -R -f path/to/the/file/namespace/
kubectl apply -R -f path/to/the/file/(appA)/
kubectl apply -R -f path/to/the/file/(appB)/
time.sleep(5)
kubectl apply -R -f path/to/the/file/(appN)/
...
##improved destroy command
destroyにing追加
1) kubectl delete namespace/
2) kubectl delete all,ing -l name=appN -n <namespace>
さらにdestroyにcm追加
2) kubectl delete all,ing,cm -l name=appN -n <namespace>
最終的に"kube destroy namespace app"はbackend appにlabelをつけて先に消すことに。これでfalse alertが出なくなった。
2) kubectl delete all,ing,cm -l type=backend -n <namespace>
##improved deploy command
deployにwait追加、これによってappB podのconditionがreadyになるまで待機させる。
3) kubectl wait --for=condition=ready --timeout=1h -l name=appB'
上だけでは不十分だったのでさらにdeployにuntil追加。
3) until kubectl wait -n <namespace> --for=condition=ready --timeout=1h -l name=appB ; do echo "waiting for pod" && sleep 5; done
##参考にしたもの
- https://medium.com/@reuvenharrison/how-to-wait-for-a-kubernetes-pod-to-be-ready-one-liner-144bbbb5a76f
- https://stackoverflow.com/questions/47691479/listing-all-resources-in-a-namespace
- https://github.com/kubernetes/kubectl/issues/151#issuecomment-402003022
kubectl get/delete all ではなくkubectl api-resourcesを使う以下の方法が薦められてます。
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -l <label>=<value> -n <namespace>
##学んだこと
- kubectl get/delete all
- kubectl api-resources
- kubectl wait