例えばK8s環境でpodをデプロイするマニフェストをapply
してRunning
になるまで待つとか。
手作業のときにkubectl get pod
でRunning
になるまで何度も再実行して(もしくは-w
つけて)、Running
になったのを目視確認したら次のコマンドを打つ、みたいな作業をAnsibleで実現します。
上記のユーザーガイドのサンプルを見るのが早いけどuntil
を使えばOK
基本的な流れ
- (
shell
などで)状態をチェックする処理を発行 - ↑の結果を
register
で保持 - 保持した値から結果(標準出力やリターンコードなど)を取り出し
until
の条件式で評価- 評価結果が条件を満たさなければ再実行
- 評価結果が条件を満たせば成功として次のtaskへ
言い換えると、「状態をチェックする処理」に対して、プログラミング言語のfor
制御構文みたいな作用がuntil
によって付加されます。
CNIをデプロイしてnodeがReadyになるまで待つ例
(podの例を出しながらnodeですみません)
kubeadm
を使ってKubernetesクラスタをデプロイする際は、CNIをインストールするなどしてノードを跨いだpod間のネットワークを有効にするまでノードはReady
になりません。
そこで、ノードがReady
になるまで処理を待つtaskを作成しました。
(ちなみに以下のplaybookは、nodeが1つの場合前提の処理です)
- hosts: master[0] gather_facts: false tasks: - name: install flannel shell: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml - name: wait for Node-Ready shell: kubectl get node --no-headers | awk '{print $2}' register: node_state until: node_state.stdout == "Ready" retries: 10 delay: 5
こんな感じ。
1つ目のinstall flannel
はCNIをインストールする処理なので今回は割愛。
2つ目のwait for Node-Ready
が、ノードがReady
になるまで待つtask
チェックに使用しているコマンドはkubectl get node
で、普通に実行するとこんな感じ。
$ kubectl get node NAME STATUS ROLES AGE VERSION k8s-master01.esxi.jp-z.jp Ready master 32h v1.18.0
これに--no-headers
を付けてNAME ...
とかのヘッダ行を非表示にして、awk
に突っ込んでステータスの部分のみ取り出し、次のregister
を使ってnode_state
という変数に保持してます。
そして、until
で、node_state
の標準出力(stdout
)がReady
になっているかを評価します。
上の例では5秒おきに10回までリトライ(最大11回実行)
実際に実行するとこんな感じ。
(上記に加えて成功時にchanged
にならないようにchanged_when
を使ってます)
PLAY [master[0]] *************************************************************************************** TASK [install flannel] ********************************************************************************* changed: [master01] TASK [wait for Node-Ready] ***************************************************************************** FAILED - RETRYING: wait for Node-Ready (10 retries left). FAILED - RETRYING: wait for Node-Ready (9 retries left). FAILED - RETRYING: wait for Node-Ready (8 retries left). FAILED - RETRYING: wait for Node-Ready (7 retries left). ok: [master01] PLAY RECAP ********************************************************************************************* master01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
使ったplaybookはこちら
おおまかな処理時間を見積もってsleep
とかしないよーに
kubectl apply
、k8s
モジュール使えるのでは?(セルフツッコミ)
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network
https://docs.ansible.com/ansible/latest/modules/k8s_module.html