kubernetesのデモをたまにすることがあるのだが、いかんせん、その場で構築して、デモということなので、設定の漏れがあるとハマる。なので、スクリプト化してしまった。そのプロトタイプが実は、これ。
https://github.com/masezou/k8s-study-vanilla
同僚が使っているかもしれないので、多少なりと最低限のメンテナンスをしているのだが、実際のデモ用の構築パッケージはまた別。実はそっちしかメンテナンスしていない。
閑話休題
スクリプトをいじっているとき、必要なのが、「podが立ち上がったのを確認して次」というステップがある。一度、コマンドを走らせてしまえば、結果はどうであれプロンプトが返ってきてしまう。一応待ちたい。
中国の同僚が教えてくれたのはこんな感じのスクリプト
while [ "$(kubectl -n ${MYSQL_NAMESPACE} get pod mysql-release-0 --output="jsonpath={.status.containerStatuses[*].ready}" | cut -d' ' -f2)" != "true" ]; do
echo "Deploying MySQL, Please wait...."
sleep 30
done
結構力ずくではある。ただ、jsonpathの使い方ではいい勉強にはなった。
シンガポールの同僚が教えてくれたのはこれ。
kubectl -n ${MYSQL_NAMESPACE} wait pod -l app\.kubernetes\.io\/name=mysql --for condition=Ready
事前に、
kubectl -n ${MYSQL_NAMESPACE} describe pod
Labels: app.kubernetes.io/component=primary
app.kubernetes.io/instance=mysql-release
app.kubernetes.io/managed-by=Helm
app.kubernetes.io/name=mysql
controller-revision-hash=mysql-release-d47b6cdb6
helm.sh/chart=mysql-8.9.0
statefulset.kubernetes.io/pod-name=mysql-release-0
でLabelを調べておく必要があるが、利用は簡単。while文はShellでしか使えないけど、途中経過を入れられる。kubectlの方は、コンディションがマッチするまで途中がわからないがシェルに依存しない。
どっちがいいかなんだけど、シンガポールの同僚が教えてくれた方法の方がスマートだなと思う。
ちなみに、kubectl wait podの方は、タイムアウトを入れることも可能