kun432's blog

技術ネタ、読書記録、など。2015年から人生をやり直し中です。

初めて技術同人誌を書いた話 ― 「Voiceflow&VUI 〜虎の巻〜」ができるまで ―

f:id:kun432:20200322212924p:plain

公式のお題企画が「#技術書典」ということで、技術同人誌を書いた話をnoteに書きました。一冊の本を書くまでのなんちゃってドキュメンタリーっぽい感じでまとめてます。

もし興味があればお読みいただければ幸いです

Cheat Sheet for flow/project variables on Voiceflow

This is my cheat sheet for flow/project variables on Voiceflow, I posted on Voiceflow's official Facebook Group before.

f:id:kun432:20200322152846j:plain

Voiceflow has 2 types of variables: flow variable and project variable. If you use flow block with these variables, you need to know the difference between those.

BTW, if you use project variables only, you don't need this. However, that means all the variables are global and persistent. In that case, you will need to care about initialization of variables and if you forget it, sometimes it may cause what you don't expect.

May be some help!

kubernetesでいろんな障害を想定してみる ① workerノード

前回kubeadmでマルチマスターのクラスタを構築しましたので、いろいろな障害を想定して試していきたいと思います。今回はworkerに限ったところだけです。

前提

  • 上記にも記載の通り、workerだけです。masterは今回何もしません。
  • ちょっとリソースが苦しいので、master x 1、worker x 2にしてます。masterの障害テストを行う際にはマルチマスターでやります。
  • 前回の最後で実施したkubernetesチュートリアルでいくつかのpodがたった状態からスタートします。
    • serviceで公開している
    • replicas=4を設定している

障害テスト

podの強制終了

pod削除はkubectl delete podでできますが、gracefulにやってくれるようなので、 --grace-period=0 --forceをつけて強制削除してみます。実行前はこうなってます。

$ kubectl get pod -o wide
NAME                                   READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Running   0          18m   192.168.226.66   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          18m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Running   0          18m   192.168.226.65   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rhcth   1/1     Running   0          39m   192.168.43.1     worker-0   <none>           <none>

4台のpodが2台のnodeに分散してます。では1台削除します。

$ kubectl delete pod kubernetes-bootcamp-69fbc6f4cf-rhcth --grace-period=0 --force
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "kubernetes-bootcamp-69fbc6f4cf-rhcth" force deleted

はい、削除しました。podの状態を見てみます。

$ kubectl get pod -o wide
NAME                                   READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Running   0          18m   192.168.226.66   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          18m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Running   0          18m   192.168.226.65   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rhcth   1/1     Running   0          39m   192.168.43.1     worker-0   <none>           <none>

すぐに新しいpodが追加されています。

強制削除の場合はリソースが残るかも、とありましたが、そこはちょっと置いときます。

nodeの強制リブート

nodeを強制リブートしてみたいと思います。リブートなので一定時間後に上がってくる想定ですね。Vagrantを使っているのでvirtualboxからリセットしてみたいと思います。

まず、pod・リセット前は以下の状態です。

NAME                                   READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Running   1          45m   192.168.226.67   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running   0          25m   192.168.43.3     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          45m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Running   1         45m   192.168.226.68   worker-1   <none>           <none>

リセットするとこうなります。リセットしたのはworker-1です。

NAME                                   READY   STATUS    RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   0/1     Error     1          45m   <none>         worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running   0          25m   192.168.43.3   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          45m   192.168.43.2   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   0/1     Error     1          45m   <none>         worker-1   <none>           <none>

でしばらく経つと元に戻ります。

NAME                                   READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Running   2          46m   192.168.226.69   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running   0          26m   192.168.43.3     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          46m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Running   2          46m   192.168.226.70   worker-1   <none>           <none>

kubectl get nodeの方はステータスが変わりませんでした。リブートのような短い時間では検出できないのかもしれません。

nodeの強制シャットダウン

今度は強制シャットダウンです。シャットダウン後、起動はしない状態にしてみます。

今回はnodeが先に変化しました。NotReadyになっていますね。

NAME           STATUS     ROLES    AGE    VERSION
controller-0   Ready      master   170m   v1.17.3
worker-0       Ready      <none>   159m   v1.17.3
worker-1       NotReady   <none>   159m   v1.17.3

ただし、podはまだ変化がありません。この時、ブラウザでworker-1にアクセスしてみると当然ながらアクセスできません。worker-0側はアクセスできます。上位にLoad Balancerがほしいところです。。。。

NAME                                   READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Running   2          56m   192.168.226.69   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running   0          36m   192.168.43.3     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          56m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Running   2          56m   192.168.226.70   worker-1   <none>           <none>

5分ほど経過すると以下のように対象ノードのpodがterminateされ、生きているnodeでpodが上がってきました。

NAME                                   READY   STATUS              RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Terminating         2          60m   192.168.226.69   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running             0          40m   192.168.43.3     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running             0          60m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Terminating         2          60m   192.168.226.70   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rqrwf   0/1     ContainerCreating   0          1s    <none>           worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rrlvd   0/1     ContainerCreating   0          1s    <none>           worker-0   <none>           <none>

しばらくするとこうなります。replicas=4が保持されるわけですね。

NAME                                   READY   STATUS        RESTARTS   AGE     IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Terminating   2          62m     192.168.226.69   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running       0          42m     192.168.43.3     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running       0          62m     192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Terminating   2          62m     192.168.226.70   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rqrwf   1/1     Running       0          2m11s   192.168.43.4     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rrlvd   1/1     Running       0          2m11s   192.168.43.5     worker-0   <none>           <none>

では対象ノードを起動して(ちゃんと上がってくれば)確認します。

nodeはReadyに戻りました。

NAME           STATUS   ROLES    AGE    VERSION
controller-0   Ready    master   3h2m   v1.17.3
worker-0       Ready    <none>   171m   v1.17.3
worker-1       Ready    <none>   171m   v1.17.3

podです。nodeが上がってきたタイミングでterminatingなpodは消えました。ただ生きているnodeに偏ってますね。残念ながらこの偏りは自動ではなおらないようです。

AME                                   READY   STATUS    RESTARTS   AGE     IP             NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running   0          49m     192.168.43.3   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          69m     192.168.43.2   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rqrwf   1/1     Running   0          9m18s   192.168.43.4   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rrlvd   1/1     Running   0          9m18s   192.168.43.5   worker-0   <none>           <none>

そこでrolling updateさせます。

$ kubectl rollout restart deployments/kubernetes-bootcamp
deployment.apps/kubernetes-bootcamp restarted

rolling updateさせるとこうなります。

NAME                                   READY   STATUS              RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-65b65458f-8ncdf    0/1     ContainerCreating   0          1s    <none>         worker-0   <none>           <none>
kubernetes-bootcamp-65b65458f-fzpkv    0/1     ContainerCreating   0          1s    <none>         worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running             0          53m   192.168.43.3   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running             0          74m   192.168.43.2   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rqrwf   1/1     Terminating         0          13m   192.168.43.4   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rrlvd   1/1     Running             0          13m   192.168.43.5   worker-0   <none>           <none>

生きていたpodも含めて再作成されるわけですね。

NAME                                   READY   STATUS        RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-65b65458f-7xzbx    1/1     Running       0          9s    192.168.43.7     worker-0   <none>           <none>
kubernetes-bootcamp-65b65458f-8ncdf    1/1     Running       0          11s   192.168.43.6     worker-0   <none>           <none>
kubernetes-bootcamp-65b65458f-fzpkv    1/1     Running       0          11s   192.168.226.71   worker-1   <none>           <none>
kubernetes-bootcamp-65b65458f-sd8zf    1/1     Running       0          9s    192.168.226.72   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Terminating   0          53m   192.168.43.3     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Terminating   0          74m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rqrwf   1/1     Terminating   0          14m   192.168.43.4     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rrlvd   1/1     Terminating   0          14m   192.168.43.5     worker-0   <none>           <none>

とりあえずここまで。次回は、障害とまでいかないけど、node上で何かしらリソース不足等が発生した場合を想定してみたいと思います。メモリとかディスクとか。

ところで、kubectl topというk8sのリソースを確認するコマンドがあるのですが、素のkubeadmだと入らないみたいで、以下を参考に入れてみました。

こんな感じで使えます

$ kubectl top node
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
controller-0   269m         13%    1185Mi          68%
worker-0       91m          9%     543Mi           60%
worker-1       89m          8%     529Mi           59%
$ kubectl top pod
NAME                                  CPU(cores)   MEMORY(bytes)
kubernetes-bootcamp-65b65458f-7xzbx   0m           8Mi
kubernetes-bootcamp-65b65458f-8ncdf   0m           8Mi
kubernetes-bootcamp-65b65458f-fzpkv   0m           10Mi
kubernetes-bootcamp-65b65458f-sd8zf   0m           11Mi
$ kubectl top pod --all-namespaces
NAMESPACE     NAME                                       CPU(cores)   MEMORY(bytes)
default       kubernetes-bootcamp-65b65458f-7xzbx        0m           8Mi
default       kubernetes-bootcamp-65b65458f-8ncdf        0m           8Mi
default       kubernetes-bootcamp-65b65458f-fzpkv        0m           10Mi
default       kubernetes-bootcamp-65b65458f-sd8zf        0m           11Mi
kube-system   calico-kube-controllers-788d6b9876-whs9s   1m           17Mi
kube-system   calico-node-8dssv                          21m          58Mi
kube-system   calico-node-k8jjn                          21m          63Mi
kube-system   calico-node-n6g72                          31m          58Mi
kube-system   coredns-6955765f44-4pmwr                   3m           19Mi
kube-system   coredns-6955765f44-cz42w                   3m           10Mi
kube-system   etcd-controller-0                          20m          69Mi
kube-system   kube-apiserver-controller-0                38m          348Mi
kube-system   kube-controller-manager-controller-0       17m          71Mi
kube-system   kube-proxy-qhfnb                           1m           21Mi
kube-system   kube-proxy-tqgqw                           1m           23Mi
kube-system   kube-proxy-vvzw6                           1m           28Mi
kube-system   kube-scheduler-controller-0                4m           29Mi
kube-system   metrics-server-7d89945f47-8cpx9            1m           10Mi

podごとに出せるのはよいですね。これ以外にも色々なツールがあるようなので、おいおい。