📝

MicroK8s in LXDでKubernetesを触ってみた

2021/04/16に公開

やること

  • LXDにMicroK8s入れる
  • LXDを複数立ち上げクラスタ組んでみる
  • アプリのデプロイ
  • スケールの変更
  • デプロイしたアプリのアップデート
  • デプロイしたアプリのロールバック
  • ノードの増減確認

内容的に
https://microk8s.io/docs/lxd

https://kubernetes.io/ja/docs/tutorials/
ですのでこちらを参照したほうが参考になると思います

LXDにMicroK8s入れる

MicroK8s用のプロファイル作成

LXDでMicroK8sを立ち上げるためのプロファイルがUbuntuから公開されているので
それをローカルにmk8sという名前で保存します。
wgetで取得しているプロファイルはzfs用なのでext4の人は違うの必要

$ lxc profile create mk8s
Profile mk8s created
$ wget -O - -q https://raw.githubusercontent.com/ubuntu/microk8s/master/tests/lxc/microk8s-zfs.profile | lxc profile edit mk8s

プロファイル適用してMicroK8sのインストール

取得したプロファイルを適用してMicroK8sをインストールします

$ lxc launch -p default -p mk8s ubuntu:20.04 mk8s1
Creating mk8s1
Starting mk8s1
$ lxc exec mk8s1 -- snap install microk8s --classic
microk8s (1.20/stable) v1.20.5 from Canonical✓ installed
$ lxc exec mk8s1 -- snap alias microk8s.kubectl kubectl
Added:
  - microk8s.kubectl as kubectl

起動確認

起動するまで待ちます

$ lxc exec mk8s1 -- microk8s status -w
microk8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
addons:
〜略〜

AppAromerプロファイルの適用

$ lxc shell mk8s1
$ cat > /etc/rc.local <<EOF
#!/bin/bash

apparmor_parser --replace /var/lib/snapd/apparmor/profiles/snap.microk8s.*
exit 0
EOF
$ chmod +x /etc/rc.local
$ exit

ここまでの状態のイメージを保存して共有する

クラスタを作成するにあたり同じ状態のコンテナを複数用意する必要があるためここまで適用したコンテナイメージをローカルリポジトリにpushして同じコンテナの追加を容易に出来るようにします。
これによりイメージ保存時と最初のlaunch時には時間がかかりますがそれ以降はキャッシュされるためコンテナの追加・削除はスムーズに進むようになります。

$ lxc stop mk8s1
$ lxc publish mk8s1 --alias mk8s
$ lxc start mk8s1
$ lxc image edit mk8s

プロファイルの編集が始まるので最終行に以下を追記してMicroK8s用のプロファイルをデフォルトで適用するようにしておきます。

- mk8s

LXDを複数立ち上げクラスタ組んでみる

3台追加で立ち上げ

合計4台でクラスタを作るため先程保存したイメージをベースに3台追加で起動します。

$ lxc launch mk8s mk8s2
Creating mk8s2
Starting mk8s2
$ lxc exec mk8s2 -- microk8s status --wait-ready | head -n4
microk8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
$ lxc launch mk8s mk8s3 && lxc exec mk8s3 -- microk8s status --wait-ready | head -n4
Creating mk8s3
Starting mk8s3
microk8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
$ lxc launch mk8s mk8s4 && lxc exec mk8s4 -- microk8s status --wait-ready | head -n4
Creating mk8s4
Starting mk8s4
microk8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none

クラスタを組む

追加される側にて
microk8s add-node
で追加するためのトークンを発行して
追加したいノードでそのトークンで追加しに行きます。

4台にしたのは3台目を追加した時点でhigh-availabilityが有効になり
4台目を追加した時点でスタンバイノードが追加される動きになるのでどうせなら全部有効にしたいというだけです。

$ lxc exec mk8s1 -- microk8s add-node
From the node you wish to join to this cluster, run the following:
microk8s join 10.116.214.200:25000/5c1093b09cb55c249e93c8c756c85b25

If the node you are adding is not reachable through the default interface you can use one of the following:
 microk8s join 10.116.214.200:25000/5c1093b09cb55c249e93c8c756c85b25
$ lxc exec mk8s2 -- microk8s join 10.116.214.200:25000/5c1093b09cb55c249e93c8c756c85b25
Contacting cluster at 10.116.214.200
Waiting for this node to finish joining the cluster. ..
$ lxc exec mk8s1 -- microk8s add-node | tail -n1 | xargs lxc exec mk8s3 --
Contacting cluster at 10.116.214.88
Waiting for this node to finish joining the cluster. ..  
$ lxc exec mk8s1 -- microk8s add-node | tail -n1 | xargs lxc exec mk8s4 --
Contacting cluster at 10.116.214.88
Waiting for this node to finish joining the cluster. ..  
$ lxc exec mk8s1 -- kubectl get nodes -o wide
NAME    STATUS   ROLES    AGE     VERSION                     INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
mk8s2   Ready    <none>   4m45s   v1.20.5-34+40f5951bd9888a   10.116.214.195   <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s3   Ready    <none>   2m18s   v1.20.5-34+40f5951bd9888a   10.116.214.66    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s1   Ready    <none>   35m     v1.20.5-34+40f5951bd9888a   10.116.214.88    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s4   Ready    <none>   34s     v1.20.5-34+40f5951bd9888a   10.116.214.223   <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7

アプリのデプロイ

microbotのデプロイ

microbotというエンドポイントを表示するだけのdockerイメージをデプロイします。

https://hub.docker.com/r/dontrebootme/microbot

$ lxc exec mk8s1 -- kubectl create deployment microbot --image=dontrebootme/microbot:v1
deployment.apps/microbot created
$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
microbot-5f5499d479-ckmxg   1/1     Running   0          12s   10.1.217.193   mk8s3   <none>           <none>

mk8s3のノードで実行されているようです。

microbotにアクセスする

microbotがLXD内からしかアクセスできないのでポートを外部に公開します

$ lxc exec mk8s1 -- kubectl expose deployment microbot --type=NodePort --port=80 --name=microbot-service
service/microbot-service exposed
$ lxc exec mk8s1 -- kubectl get services -o wide
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE   SELECTOR
kubernetes         ClusterIP   10.152.183.1    <none>        443/TCP        40m   <none>
microbot-service   NodePort    10.152.183.99   <none>        80:32278/TCP   7s    app=microbot

32278ポートで公開されました
この状態であればmk8s1〜mk8s4のどのIPに対してhttpアクセスしてもこのポートならmicrobotに到達されるようです。
mk8s3で実行されているので別のmk8s1のIPに対してアクセスして表示されるか確認してみます。

IPは
kubectl get nodes -o wide
を実行した時に表示されています。

Imgur

スケールの変更

折角クラスタを組んでるので複数立ち上げるようにしてみます

$ lxc exec mk8s1 -- kubectl scale --replicas=8 deployment microbot
deployment.apps/microbot scaled
$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE    IP             NODE    NOMINATED NODE   READINESS GATES
microbot-5f5499d479-ckmxg   1/1     Running   0          6m6s   10.1.217.193   mk8s3   <none>           <none>
microbot-5f5499d479-nnxgx   1/1     Running   0          16s    10.1.217.194   mk8s3   <none>           <none>
microbot-5f5499d479-bts25   1/1     Running   0          16s    10.1.217.195   mk8s3   <none>           <none>
microbot-5f5499d479-dgwqq   1/1     Running   0          16s    10.1.238.131   mk8s1   <none>           <none>
microbot-5f5499d479-27mbj   1/1     Running   0          16s    10.1.115.129   mk8s2   <none>           <none>
microbot-5f5499d479-qzkpf   1/1     Running   0          16s    10.1.236.129   mk8s4   <none>           <none>
microbot-5f5499d479-xhznz   1/1     Running   0          16s    10.1.115.130   mk8s2   <none>           <none>
microbot-5f5499d479-v7v6k   1/1     Running   0          16s    10.1.236.130   mk8s4   <none>           <none>

分散されたようなので分散してアクセスされるか確認します

$ for i in $(seq 20);do w3m -dump http://10.116.214.88:32278/ | grep hostname ; done | sort | uniq -c
      2 Container hostname: microbot-5f5499d479-27mbj
      3 Container hostname: microbot-5f5499d479-bts25
      2 Container hostname: microbot-5f5499d479-ckmxg
      2 Container hostname: microbot-5f5499d479-dgwqq
      2 Container hostname: microbot-5f5499d479-nnxgx
      2 Container hostname: microbot-5f5499d479-qzkpf
      3 Container hostname: microbot-5f5499d479-v7v6k
      4 Container hostname: microbot-5f5499d479-xhznz

分散されてますね

デプロイしたアプリのアップデート

microbot:v1からmicrobot:v2へアップデート

microbotはv1からv2にすることで表示される画像が変わるのでアップデートの確認が出来ます。

$ lxc exec mk8s1 -- kubectl set image deployments/microbot microbot=dontrebootme/microbot:v2
deployment.apps/microbot image updated
$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS              RESTARTS   AGE     IP             NODE     NOMINATED NODE   READINESS GATES
microbot-5f5499d479-ckmxg   1/1     Running             0          8m9s    10.1.217.193   mk8s3    <none>           <none>
microbot-5f5499d479-dgwqq   1/1     Running             0          2m19s   10.1.238.131   mk8s1    <none>           <none>
microbot-5f5499d479-qzkpf   1/1     Running             0          2m19s   10.1.236.129   mk8s4    <none>           <none>
microbot-5f5499d479-bts25   1/1     Terminating         0          2m19s   10.1.217.195   mk8s3    <none>           <none>
microbot-5f5499d479-nnxgx   1/1     Terminating         0          2m19s   10.1.217.194   mk8s3    <none>           <none>
microbot-6456dc47db-76ltk   1/1     Running             0          9s      10.1.236.131   mk8s4    <none>           <none>
microbot-6456dc47db-czzts   1/1     Running             0          9s      10.1.238.132   mk8s1    <none>           <none>
microbot-5f5499d479-xhznz   1/1     Terminating         0          2m19s   10.1.115.130   mk8s2    <none>           <none>
microbot-5f5499d479-v7v6k   1/1     Terminating         0          2m19s   10.1.236.130   mk8s4    <none>           <none>
microbot-6456dc47db-zkgj8   0/1     ContainerCreating   0          1s      <none>         mk8s2    <none>           <none>
microbot-6456dc47db-p2kmg   1/1     Running             0          9s      10.1.115.131   mk8s2    <none>           <none>
microbot-6456dc47db-zb4w8   0/1     ContainerCreating   0          1s      <none>         mk8s4    <none>           <none>
microbot-5f5499d479-27mbj   1/1     Terminating         0          2m19s   10.1.115.129   mk8s2    <none>           <none>
microbot-6456dc47db-5kpj2   0/1     Pending             0          1s      <none>         <none>   <none>           <none>
microbot-6456dc47db-bxpj5   1/1     Running             0          9s      10.1.217.196   mk8s3    <none>           <none>

起動していたコンテナがTerminatingされて新たにv2のコンテナがPending,ContainerCreatingのステータスで作られていきます。

確証は無いのですがアプリのデプロイ時に均一に実行されなかったのはこういったアップデート時にすばやく新たなコンテナを立ち上げるために余力を残したノードを作っているのではないでしょうか

しばらくしてからもう一度確認すると

$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE     IP             NODE    NOMINATED NODE   READINESS GATES
microbot-6456dc47db-76ltk   1/1     Running   0          2m15s   10.1.236.131   mk8s4   <none>           <none>
microbot-6456dc47db-czzts   1/1     Running   0          2m15s   10.1.238.132   mk8s1   <none>           <none>
microbot-6456dc47db-p2kmg   1/1     Running   0          2m15s   10.1.115.131   mk8s2   <none>           <none>
microbot-6456dc47db-bxpj5   1/1     Running   0          2m15s   10.1.217.196   mk8s3   <none>           <none>
microbot-6456dc47db-zkgj8   1/1     Running   0          2m7s    10.1.115.132   mk8s2   <none>           <none>
microbot-6456dc47db-zb4w8   1/1     Running   0          2m7s    10.1.236.132   mk8s4   <none>           <none>
microbot-6456dc47db-wx77v   1/1     Running   0          2m6s    10.1.238.134   mk8s1   <none>           <none>
microbot-6456dc47db-5kpj2   1/1     Running   0          2m7s    10.1.238.133   mk8s1   <none>           <none>
$ for i in $(seq 20);do w3m -dump http://10.116.214.88:32278/ | grep hostname ; done | sort | uniq -c
      3 Container hostname: microbot-6456dc47db-5kpj2
      1 Container hostname: microbot-6456dc47db-76ltk
      3 Container hostname: microbot-6456dc47db-bxpj5
      3 Container hostname: microbot-6456dc47db-czzts
      2 Container hostname: microbot-6456dc47db-p2kmg
      4 Container hostname: microbot-6456dc47db-wx77v
      2 Container hostname: microbot-6456dc47db-zb4w8
      2 Container hostname: microbot-6456dc47db-zkgj8

新しいmicrobotコンテナにアクセスされるようになってそうですね
画像で確認してみます。

Imgur

画像が入れ替わっているのでアップデートが出来ている事を確認できました。

デプロイしたアプリのロールバック

アップデート前の状態に戻せるようなので戻してみましょう

$ lxc exec mk8s1 -- kubectl rollout undo deployments/microbot
deployment.apps/microbot rolled back
$ lxc exec mk8s1 -- kubectl describe deployments/microbot
Name:                   microbot
Namespace:              default
CreationTimestamp:      Fri, 16 Apr 2021 05:04:32 +0000
Labels:                 app=microbot
Annotations:            deployment.kubernetes.io/revision: 3
Selector:               app=microbot
Replicas:               8 desired | 8 updated | 10 total | 6 available | 4 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=microbot
  Containers:
   microbot:
    Image:        dontrebootme/microbot:v1
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  microbot-6456dc47db (2/2 replicas created)
NewReplicaSet:   microbot-5f5499d479 (8/8 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  7s    deployment-controller  Scaled up replica set microbot-5f5499d479 to 2
  Normal  ScalingReplicaSet  7s    deployment-controller  Scaled down replica set microbot-6456dc47db to 6
  Normal  ScalingReplicaSet  7s    deployment-controller  Scaled up replica set microbot-5f5499d479 to 4
  Normal  ScalingReplicaSet  3s    deployment-controller  Scaled down replica set microbot-6456dc47db to 5
  Normal  ScalingReplicaSet  3s    deployment-controller  Scaled up replica set microbot-5f5499d479 to 5
  Normal  ScalingReplicaSet  3s    deployment-controller  Scaled down replica set microbot-6456dc47db to 2
  Normal  ScalingReplicaSet  3s    deployment-controller  Scaled up replica set microbot-5f5499d479 to 8
$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS        RESTARTS   AGE    IP             NODE    NOMINATED NODE   READINESS GATES
microbot-6456dc47db-p5m7x   1/1     Terminating   1          73m    10.1.115.137   mk8s2   <none>           <none>
microbot-6456dc47db-qz48s   1/1     Terminating   1          87m    10.1.115.136   mk8s2   <none>           <none>
microbot-5f5499d479-jk8g5   1/1     Running       0          23s    10.1.236.132   mk8s4   <none>           <none>
microbot-5f5499d479-29qd4   1/1     Running       0          24s    10.1.236.129   mk8s4   <none>           <none>
microbot-5f5499d479-449wq   1/1     Running       0          23s    10.1.236.130   mk8s4   <none>           <none>
microbot-5f5499d479-sv6fp   1/1     Running       0          24s    10.1.236.131   mk8s4   <none>           <none>
microbot-6456dc47db-wx77v   1/1     Terminating   2          99m    10.1.238.142   mk8s1   <none>           <none>
microbot-6456dc47db-   1/1     Terminating   1          99m    10.1.115.140   mk8s2   <none>           <none>
microbot-6456dc47db-qbcm5   1/1     Terminating   1          73m    10.1.115.139   mk8s2   <none>           <none>
microbot-6456dc47db-p2kmg   1/1     Terminating   1          100m   10.1.115.138   mk8s2   <none>           <none>
microbot-5f5499d479-rpztb   1/1     Running       0          20s    10.1.236.133   mk8s4   <none>           <none>
microbot-6456dc47db-5kpj2   1/1     Terminating   2          99m    10.1.238.141   mk8s1   <none>           <none>
microbot-5f5499d479-tsb59   1/1     Running       0          20s    10.1.115.141   mk8s2   <none>           <none>
microbot-6456dc47db-czzts   1/1     Terminating   2          100m   10.1.238.140   mk8s1   <none>           <none>
microbot-5f5499d479-fj2sw   1/1     Running       0          20s    10.1.238.144   mk8s1   <none>           <none>
microbot-5f5499d479-f5ggt   1/1     Running       0          20s    10.1.238.143   mk8s1   <none>           <none>
$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE    IP             NODE    NOMINATED NODE   READINESS GATES
microbot-5f5499d479-jk8g5   1/1     Running   0          99s    10.1.236.132   mk8s4   <none>           <none>
microbot-5f5499d479-29qd4   1/1     Running   0          100s   10.1.236.129   mk8s4   <none>           <none>
microbot-5f5499d479-449wq   1/1     Running   0          99s    10.1.236.130   mk8s4   <none>           <none>
microbot-5f5499d479-sv6fp   1/1     Running   0          100s   10.1.236.131   mk8s4   <none>           <none>
microbot-5f5499d479-rpztb   1/1     Running   0          96s    10.1.236.133   mk8s4   <none>           <none>
microbot-5f5499d479-tsb59   1/1     Running   0          96s    10.1.115.141   mk8s2   <none>           <none>
microbot-5f5499d479-fj2sw   1/1     Running   0          96s    10.1.238.144   mk8s1   <none>           <none>
microbot-5f5499d479-f5ggt   1/1     Running   0          96s    10.1.238.143   mk8s1   <none>           <none>

起動中のコンテナが入れ替わったようなので画面を確認します。

Imgur

戻ってますね

ノードの増減確認

折角クラスタにしてるので破壊して遊んでみましょう

クラスタから外す

まずは普通にmk8s4をクラスタから外します

$ lxc exec mk8s4 -- microk8s leave
Generating new cluster certificates.
Waiting for node to start.  
$ lxc exec mk8s1 -- kubectl get nodes -o wide
NAME    STATUS     ROLES    AGE   VERSION                     INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
mk8s3   Ready      <none>   21m   v1.20.5-34+40f5951bd9888a   10.116.214.66    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s2   Ready      <none>   23m   v1.20.5-34+40f5951bd9888a   10.116.214.195   <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s1   Ready      <none>   55m   v1.20.5-34+40f5951bd9888a   10.116.214.88    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s4   NotReady   <none>   19m   v1.20.5-34+40f5951bd9888a   10.116.214.223   <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
$ lxc exec mk8s1 -- microk8s remove-node mk8s4
$ lxc exec mk8s1 -- kubectl get nodes -o wide
NAME    STATUS   ROLES    AGE   VERSION                     INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
mk8s3   Ready    <none>   23m   v1.20.5-34+40f5951bd9888a   10.116.214.66    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s2   Ready    <none>   26m   v1.20.5-34+40f5951bd9888a   10.116.214.195   <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s1   Ready    <none>   57m   v1.20.5-34+40f5951bd9888a   10.116.214.88    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
microbot-6456dc47db-czzts   1/1     Running   0          11m   10.1.238.132   mk8s1   <none>           <none>
microbot-6456dc47db-p2kmg   1/1     Running   0          11m   10.1.115.131   mk8s2   <none>           <none>
microbot-6456dc47db-bxpj5   1/1     Running   0          11m   10.1.217.196   mk8s3   <none>           <none>
microbot-6456dc47db-zkgj8   1/1     Running   0          11m   10.1.115.132   mk8s2   <none>           <none>
microbot-6456dc47db-wx77v   1/1     Running   0          11m   10.1.238.134   mk8s1   <none>           <none>
microbot-6456dc47db-5kpj2   1/1     Running   0          11m   10.1.238.133   mk8s1   <none>           <none>
microbot-6456dc47db-zb4w8   1/1     Running   0          11m   10.1.236.132   mk8s4   <none>           <none>
microbot-6456dc47db-76ltk   1/1     Running   0          11m   10.1.236.131   mk8s4   <none>           <none>

microk8sコマンドでノードをremoveしても
すぐにはk8s側で検知されないようでmk8s4でpodが動いてる風に見えます

ただ暫くしてからもう一度podsを確認すると違うノードで新しく実行されるようになっていたのでそれほど問題は無さそうです。

$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
microbot-6456dc47db-czzts   1/1     Running   0          13m   10.1.238.132   mk8s1   <none>           <none>
microbot-6456dc47db-p2kmg   1/1     Running   0          13m   10.1.115.131   mk8s2   <none>           <none>
microbot-6456dc47db-bxpj5   1/1     Running   0          13m   10.1.217.196   mk8s3   <none>           <none>
microbot-6456dc47db-zkgj8   1/1     Running   0          13m   10.1.115.132   mk8s2   <none>           <none>
microbot-6456dc47db-wx77v   1/1     Running   0          13m   10.1.238.134   mk8s1   <none>           <none>
microbot-6456dc47db-5kpj2   1/1     Running   0          13m   10.1.238.133   mk8s1   <none>           <none>
microbot-6456dc47db-qz48s   1/1     Running   0          77s   10.1.115.133   mk8s2   <none>           <none>
microbot-6456dc47db-r6pgr   1/1     Running   0          77s   10.1.217.197   mk8s3   <none>           <none>

クラスタ破壊

次はmk8s3のコンテナ自体をいきなり強制削除するとどうなるかやってみます。

$ lxc delete -f mk8s3
$ lxc exec mk8s1 -- kubectl get nodes -o wide
NAME    STATUS   ROLES    AGE   VERSION                     INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
mk8s3   Ready    <none>   33m   v1.20.5-34+40f5951bd9888a   10.116.214.66    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s2   Ready    <none>   36m   v1.20.5-34+40f5951bd9888a   10.116.214.195   <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s1   Ready    <none>   67m   v1.20.5-34+40f5951bd9888a   10.116.214.88    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
$ lxc exec mk8s1 -- kubectl get nodes -o wide
NAME    STATUS     ROLES    AGE   VERSION                     INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
mk8s2   Ready      <none>   36m   v1.20.5-34+40f5951bd9888a   10.116.214.195   <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s1   Ready      <none>   67m   v1.20.5-34+40f5951bd9888a   10.116.214.88    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s3   NotReady   <none>   34m   v1.20.5-34+40f5951bd9888a   10.116.214.66    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7

すぐには検知されませんでしたがちょっと時間をおいてからノードを確認するとNotReady状態に移行していました
ただノード情報は残り続けるので削除しないといけません今回はleaveせずにノードを削除したので--forceが必要になります。

$ lxc exec mk8s1 -- microk8s remove-node mk8s3 --force
$ lxc exec mk8s1 -- kubectl get nodes -o wide
NAME    STATUS   ROLES    AGE   VERSION                     INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
mk8s2   Ready    <none>   49m   v1.20.5-34+40f5951bd9888a   10.116.214.195   <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s1   Ready    <none>   80m   v1.20.5-34+40f5951bd9888a   10.116.214.88    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS        RESTARTS   AGE     IP             NODE    NOMINATED NODE   READINESS GATES
microbot-6456dc47db-czzts   1/1     Running       0          35m     10.1.238.132   mk8s1   <none>           <none>
microbot-6456dc47db-p2kmg   1/1     Running       0          35m     10.1.115.131   mk8s2   <none>           <none>
microbot-6456dc47db-zkgj8   1/1     Running       0          35m     10.1.115.132   mk8s2   <none>           <none>
microbot-6456dc47db-wx77v   1/1     Running       0          35m     10.1.238.134   mk8s1   <none>           <none>
microbot-6456dc47db-5kpj2   1/1     Running       0          35m     10.1.238.133   mk8s1   <none>           <none>
microbot-6456dc47db-qz48s   1/1     Running       0          22m     10.1.115.133   mk8s2   <none>           <none>
microbot-6456dc47db-r6pgr   1/1     Terminating   0          22m     10.1.217.197   mk8s3   <none>           <none>
microbot-6456dc47db-bxpj5   1/1     Terminating   0          35m     10.1.217.196   mk8s3   <none>           <none>
microbot-6456dc47db-qbcm5   1/1     Running       0          8m11s   10.1.115.134   mk8s2   <none>           <none>
microbot-6456dc47db-p5m7x   1/1     Running       0          8m11s   10.1.115.135   mk8s2   <none>           <none>
$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE     IP             NODE    NOMINATED NODE   READINESS GATES
microbot-6456dc47db-czzts   1/1     Running   0          35m     10.1.238.132   mk8s1   <none>           <none>
microbot-6456dc47db-p2kmg   1/1     Running   0          35m     10.1.115.131   mk8s2   <none>           <none>
microbot-6456dc47db-zkgj8   1/1     Running   0          35m     10.1.115.132   mk8s2   <none>           <none>
microbot-6456dc47db-wx77v   1/1     Running   0          35m     10.1.238.134   mk8s1   <none>           <none>
microbot-6456dc47db-5kpj2   1/1     Running   0          35m     10.1.238.133   mk8s1   <none>           <none>
microbot-6456dc47db-qz48s   1/1     Running   0          23m     10.1.115.133   mk8s2   <none>           <none>
microbot-6456dc47db-qbcm5   1/1     Running   0          8m39s   10.1.115.134   mk8s2   <none>           <none>
microbot-6456dc47db-p5m7x   1/1     Running   0          8m39s   10.1.115.135   mk8s2   <none>           <none>

podに関してはノード情報が残ってる間はずっとTerminatingで残りそうですねノード情報を削除してしばらく待つとTerminatingの行が消えました。

ノード再起動

急な再起動が入るとどうなるかやってみます

$ lxc restart mk8s1
$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
microbot-6456dc47db-p2kmg   1/1     Running   0          46m   10.1.115.131   mk8s2   <none>           <none>
microbot-6456dc47db-zkgj8   1/1     Running   0          46m   10.1.115.132   mk8s2   <none>           <none>
microbot-6456dc47db-qz48s   1/1     Running   0          34m   10.1.115.133   mk8s2   <none>           <none>
microbot-6456dc47db-qbcm5   1/1     Running   0          19m   10.1.115.134   mk8s2   <none>           <none>
microbot-6456dc47db-p5m7x   1/1     Running   0          19m   10.1.115.135   mk8s2   <none>           <none>
microbot-6456dc47db-5kpj2   1/1     Running   1          46m   10.1.238.136   mk8s1   <none>           <none>
microbot-6456dc47db-wx77v   1/1     Running   1          46m   10.1.238.138   mk8s1   <none>           <none>
microbot-6456dc47db-czzts   1/1     Running   1          46m   10.1.238.137   mk8s1   <none>           <none>

何事も無かったかのように復旧しましたがPodのRESTARTSが1になってますね

取り外したノードの再追加

最初に外したノードを再度追加してみます。
クラスタを組んだときと同じ手順で問題無さそうでした

$ lxc exec mk8s1 -- microk8s add-node | tail -n1 | xargs lxc exec mk8s4 --
Contacting cluster at 10.116.214.88
Waiting for this node to finish joining the cluster. ..  
$ lxc exec mk8s1 -- kubectl get nodes -o wide
NAME    STATUS   ROLES    AGE    VERSION                     INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
mk8s4   Ready    <none>   25m    v1.20.5-34+40f5951bd9888a   10.116.214.223   <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s2   Ready    <none>   94m    v1.20.5-34+40f5951bd9888a   10.116.214.195   <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s1   Ready    <none>   125m   v1.20.5-34+40f5951bd9888a   10.116.214.88    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
microbot-6456dc47db-p2kmg   1/1     Running   0          80m   10.1.115.131   mk8s2   <none>           <none>
microbot-6456dc47db-zkgj8   1/1     Running   0          80m   10.1.115.132   mk8s2   <none>           <none>
microbot-6456dc47db-qz48s   1/1     Running   0          67m   10.1.115.133   mk8s2   <none>           <none>
microbot-6456dc47db-qbcm5   1/1     Running   0          53m   10.1.115.134   mk8s2   <none>           <none>
microbot-6456dc47db-p5m7x   1/1     Running   0          53m   10.1.115.135   mk8s2   <none>           <none>
microbot-6456dc47db-5kpj2   1/1     Running   1          80m   10.1.238.136   mk8s1   <none>           <none>
microbot-6456dc47db-wx77v   1/1     Running   1          80m   10.1.238.138   mk8s1   <none>           <none>
microbot-6456dc47db-czzts   1/1     Running   1          80m   10.1.238.137   mk8s1   <none>           <none>

全てのノードを停止してから再開するとどうなるか

興味本位ですが一旦全て停止して再起動してみました

$ lxc stop mk8s{1,2,4}
$ lxc list
+-------+---------+------+------+-----------+-----------+
| NAME  |  STATE  | IPV4 | IPV6 |   TYPE    | SNAPSHOTS |
+-------+---------+------+------+-----------+-----------+
| mk8s1 | STOPPED |      |      | CONTAINER | 0         |
+-------+---------+------+------+-----------+-----------+
| mk8s2 | STOPPED |      |      | CONTAINER | 0         |
+-------+---------+------+------+-----------+-----------+
| mk8s4 | STOPPED |      |      | CONTAINER | 0         |
+-------+---------+------+------+-----------+-----------+
$ lxc start mk8s{1,2,4}
$ lxc exec mk8s4 -- microk8s status --wait-ready | head -n4
microk8s is running
high-availability: yes
  datastore master nodes: 10.116.214.88:19001 10.116.214.195:19001 10.116.214.223:19001
  datastore standby nodes: none
$ lxc exec mk8s1 -- kubectl get nodes -o wide
NAME    STATUS     ROLES    AGE    VERSION                     INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
mk8s1   NotReady   <none>   132m   v1.20.5-34+40f5951bd9888a   10.116.214.88    <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s4   NotReady   <none>   32m    v1.20.5-34+40f5951bd9888a   10.116.214.223   <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
mk8s2   NotReady   <none>   101m   v1.20.5-34+40f5951bd9888a   10.116.214.195   <none>        Ubuntu 20.04.2 LTS   5.4.0-71-generic   containerd://1.3.7
$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
microbot-6456dc47db-wx77v   0/1     Unknown   1          87m   <none>         mk8s1   <none>           <none>
microbot-6456dc47db-czzts   1/1     Running   2          87m   10.1.238.140   mk8s1   <none>           <none>
microbot-6456dc47db-qz48s   0/1     Unknown   0          75m   <none>         mk8s2   <none>           <none>
microbot-6456dc47db-p5m7x   0/1     Unknown   0          60m   <none>         mk8s2   <none>           <none>
microbot-6456dc47db-p2kmg   0/1     Unknown   0          87m   <none>         mk8s2   <none>           <none>
microbot-6456dc47db-5kpj2   1/1     Running   2          87m   10.1.238.141   mk8s1   <none>           <none>
microbot-6456dc47db-qbcm5   0/1     Unknown   0          60m   <none>         mk8s2   <none>           <none>
microbot-6456dc47db-zkgj8   0/1     Unknown   0          87m   <none>         mk8s2   <none>           <none>
$ lxc exec mk8s1 -- kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
microbot-6456dc47db-czzts   1/1     Running   2          88m   10.1.238.140   mk8s1   <none>           <none>
microbot-6456dc47db-5kpj2   1/1     Running   2          87m   10.1.238.141   mk8s1   <none>           <none>
microbot-6456dc47db-zkgj8   1/1     Running   1          87m   10.1.115.140   mk8s2   <none>           <none>
microbot-6456dc47db-qbcm5   1/1     Running   1          60m   10.1.115.139   mk8s2   <none>           <none>
microbot-6456dc47db-p5m7x   1/1     Running   1          60m   10.1.115.137   mk8s2   <none>           <none>
microbot-6456dc47db-p2kmg   1/1     Running   1          88m   10.1.115.138   mk8s2   <none>           <none>
microbot-6456dc47db-qz48s   1/1     Running   1          75m   10.1.115.136   mk8s2   <none>           <none>
microbot-6456dc47db-wx77v   1/1     Running   2          87m   10.1.238.142   mk8s1   <none>           <none>

何事も無かったかのように復旧しました🤗

今回は一旦ここまで

前々から興味がありつつもクラスタ組むのが面倒くさそうなのと直接入れるのが嫌だったので敬遠していたk8sでしたがLXDで動くMicroK8sの存在を知ったので触り始めてみました。

独習するにあたりZennのscrap機能も初めて使ってみたのですがいいですねこれラバーダッキング法ってこんな感じなんでしょうか。

これからも独習を進めて知見が貯まったら記事にして残していきたいと思います。

しゃみしゃっきり〜

P.S.

私の仕事は平成初期のレガシー開発がそのまま続いてるような仕事なので使うことは無いでしょうが使い捨ての派遣社員という職業柄いつ文明開化した現場に島流しされるかもわかりません

何も勉強してない状態でそんな所行ったらきっと

「無駄に歳食ったせいで単金だけ肥大化した無能ロートルじじい」

とか絶対言われると思います

というか言われてる人よく見ますしね
自分の経験だけで言うのもなんですがSESで複数人セットで送り込まれてくる時の現場責任者的な立場につく人やフリーランスで職務経歴書が数ヶ月単位で転々としてる人に多い気がします。。。
自分が手を動かすこと無く声だけでかくて部下を怒鳴り散らしてた人は
「俺は嫌われるのが仕事なんだよ」
ってキメ顔で言ってましたがあれが私の上司ならサクッと逃げてますね。

なので終わった技術と共に沈没しないように興味のある技術に関してはキャッチアップして時間のあるときに学んでいきたいと思います。

プログラマなのに興味あることばかり調べてたら全くプログラミング方面の勉強出来てないのがヤバイ気はしてる🤔

Discussion