Closed44

MicroK8sの独習4 〜StatefulSetの基本〜

坦々狸坦々狸

前提知識多いな。。。
とりあえず詰まったら後で読もう。。。

坦々狸坦々狸

kubectl get statefulset webの出力フォーマットなんか例と違うな。。。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/ja/examples/application/web/web.yaml
service/nginx created                                                                                   
statefulset.apps/web created                                                                            
$ kubectl get service nginx                                                    
NAME    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   None         <none>        80/TCP    9s
$ kubectl get statefulset web
NAME   READY   AGE                                                                                      
web    0/2     18s 
坦々狸坦々狸

あかんやん😰

$ kubectl get pods -w -l app=nginx                                                                                                                                                     
NAME    READY   STATUS    RESTARTS   AGE
web-0   0/1     Pending   0          0s
web-0   0/1     Pending   0          0s
坦々狸坦々狸

事前知識で永続ボリュームがどうこういうてたやつか?
もしそうならチュートリアルなんやしそこらへんも事前に作る手順が載ってないとおかしい気もするけど。。。

$ kubectl describe pods web | tail -n10
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason            Age                  From               Message
  ----     ------            ----                 ----               -------
  Warning  FailedScheduling  38s (x6 over 4m43s)  default-scheduler  0/4 nodes are available: 4 pod has unbound immediate PersistentVolumeClaims.
坦々狸坦々狸

PVはAWSとかならデフォルトで用意されてるから説明すら省いてるんか。。。
欲しいなら自分で用意しろって書いてるな。。。
多分MicroK8sのstorageアドオンを使えば。。。

坦々狸坦々狸

もうすぐストレージ使えるよ的なメッセージ出てしばらく待ったけどPendingのままやな。。。。

$ microk8s enable storage
Enabling default storage class
deployment.apps/hostpath-provisioner created
storageclass.storage.k8s.io/microk8s-hostpath created
serviceaccount/microk8s-hostpath created
clusterrole.rbac.authorization.k8s.io/microk8s-hostpath created
clusterrolebinding.rbac.authorization.k8s.io/microk8s-hostpath created
Storage will be available soon
坦々狸坦々狸

クラスタ初期化から最初にstorage有効にしといてやり直したら動いた

$ kubectl get pods -w -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   0/1     Pending   0          1s
web-0   0/1     Pending   0          1s
web-0   0/1     Pending   0          3s
web-0   0/1     ContainerCreating   0          3s
web-0   0/1     ContainerCreating   0          4s
web-0   1/1     Running             0          16s
web-1   0/1     Pending             0          1s
web-1   0/1     Pending             0          1s
web-1   0/1     Pending             0          4s
web-1   0/1     ContainerCreating   0          4s
web-1   0/1     ContainerCreating   0          4s
坦々狸坦々狸

ここ何を言いたいのかわからん。。。
podのIPは可変だからweb-1.nginx.default.svc.cluster.localとか使えってことか?

$ kubectl run -i --tty --image busybox:1.28 dns-test --restart=Never --rm
If you don't see a command prompt, try pressing enter.
/ # nslookup web-0.nginx
Server:    10.152.183.10
Address 1: 10.152.183.10 kube-dns.kube-system.svc.cluster.local

Name:      web-0.nginx
Address 1: 10.1.238.133 web-0.nginx.default.svc.cluster.local
/ # pod "dns-test" deleted
$ kubectl delete pod -l app=nginx
pod "web-0" deleted
pod "web-1" deleted
$ kubectl run -i --tty --image busybox:1.28 dns-test --restart=Never --rm
If you don't see a command prompt, try pressing enter.
/ #  nslookup web-0.nginx
Server:    10.152.183.10
Address 1: 10.152.183.10 kube-dns.kube-system.svc.cluster.local

Name:      web-0.nginx
Address 1: 10.1.238.134 web-0.nginx.default.svc.cluster.local
坦々狸坦々狸

pv使えてるかの確認かな?
てかもうforとかでワンライナーしだしてるやん。。。
教える気あんまりないやろこれ。。。

$ kubectl get pvc -l app=nginx
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
www-web-0   Bound    pvc-4d8c1088-c3d6-40e2-9487-85eb4354411d   1Gi        RWO            microk8s-hostpath   12m
www-web-1   Bound    pvc-3fe0dcf0-0b50-4c79-b070-9c737137f7b3   1Gi        RWO            microk8s-hostpath   12m
$ for i in 0 1; do kubectl exec "web-$i" -- sh -c 'echo "$(hostname)" > /usr/share/nginx/html/index.html'; done
$ for i in 0 1; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done
web-0
web-1
坦々狸坦々狸

で、pod消したとしても復旧されたpodにはさっきのが残ってるかの確認かな

$ kubectl delete pod -l app=nginx
pod "web-0" deleted
pod "web-1" deleted
$ kubectl get pod -l app=nginx                                                                                                                                                      
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          43s
web-1   1/1     Running   0          39s
$ for i in 0 1; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done
web-0
web-1
坦々狸坦々狸

ステートフルセットのスケール増やす確認
同時じゃなくて1個ずつ増やすらしい

$ kubectl scale sts web --replicas=5
statefulset.apps/web scaled
$ kubectl get pod -w -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          20s
web-1   1/1     Running   0          16s
web-2   0/1     Pending   0          1s
web-2   0/1     Pending   0          1s
web-2   0/1     Pending   0          4s
web-2   0/1     ContainerCreating   0          5s
web-2   0/1     ContainerCreating   0          5s
web-2   1/1     Running             0          17s
web-3   0/1     Pending             0          0s
web-3   0/1     Pending             0          0s
web-3   0/1     Pending             0          3s
web-3   0/1     ContainerCreating   0          4s
web-3   0/1     ContainerCreating   0          4s
web-3   1/1     Running             0          16s
web-4   0/1     Pending             0          1s
web-4   0/1     Pending             0          1s
web-4   0/1     Pending             0          3s
web-4   0/1     ContainerCreating   0          3s
web-4   0/1     ContainerCreating   0          4s
web-4   1/1     Running             0          7s
坦々狸坦々狸

減らす
なんかやり方変えとるけどこういう方法もあるんやでって事を教えてくれてるんやろか?
多分そうなんやろうけどそれならそうと一言ほしいな初心者やったら減らすのと増やすのでコマンド違うんかなって思うかもしれんやん
とりあえず増やす時は末尾の連番がインクリされて減らす時はデクリされるのね
そしてどっちも1個ずつ落としたり上げたりするよと

$ kubectl patch sts web -p '{"spec":{"replicas":3}}'
statefulset.apps/web patched

$ kubectl get pod -w -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          7m9s
web-1   1/1     Running   0          7m5s
web-2   1/1     Running   0          2m39s
web-3   1/1     Running   0          2m22s
web-4   1/1     Running   0          2m6s
web-4   1/1     Terminating   0          2m41s
web-4   0/1     Terminating   0          2m43s
web-4   0/1     Terminating   0          2m47s
web-4   0/1     Terminating   0          2m47s
web-3   1/1     Terminating   0          3m3s
web-3   0/1     Terminating   0          3m5s
web-3   0/1     Terminating   0          3m13s
web-3   0/1     Terminating   0          3m13s
坦々狸坦々狸

ほぅ、割り当てたストレージはpodが減っても削除されないのね

$ kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
dns-test   0/1     Error     0          82m
web-0      1/1     Running   0          75m
web-1      1/1     Running   0          75m
web-2      1/1     Running   0          70m
$ kubectl get pvc -l app=nginx
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
www-web-0   Bound    pvc-4d8c1088-c3d6-40e2-9487-85eb4354411d   1Gi        RWO            microk8s-hostpath   37m
www-web-1   Bound    pvc-3fe0dcf0-0b50-4c79-b070-9c737137f7b3   1Gi        RWO            microk8s-hostpath   37m
www-web-2   Bound    pvc-ccb3226f-19e5-4e0c-b8a7-9bc32b822100   1Gi        RWO            microk8s-hostpath   6m28s
www-web-3   Bound    pvc-2977de16-764e-4dea-999c-334e073cf92e   1Gi        RWO            microk8s-hostpath   6m11s
www-web-4   Bound    pvc-d33aa745-a6f1-4af2-b30a-1602c0d8e639   1Gi        RWO            microk8s-hostpath   5m55s
坦々狸坦々狸

なんかパッチ当ててローリングアップデートにしろって書いてるけど既になってる気がする。。。

$ kubectl describe statefulset web
Name:               web
Namespace:          default
CreationTimestamp:  Wed, 21 Apr 2021 02:41:18 +0000
Selector:           app=nginx
Labels:             <none>
Annotations:        <none>
Replicas:           3 desired | 3 total
Update Strategy:    RollingUpdate
  Partition:        0
Pods Status:        3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        k8s.gcr.io/nginx-slim:0.8
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:
      /usr/share/nginx/html from www (rw)
  Volumes:  <none>
Volume Claims:
  Name:          www
  StorageClass:  
  Labels:        <none>
  Annotations:   <none>
  Capacity:      1Gi
  Access Modes:  [ReadWriteOnce]
Events:          <none>
坦々狸坦々狸

まぁいいかとりあえずやろう

$ kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}'
statefulset.apps/web patched (no change)

やっぱりno changeだった🤣

坦々狸坦々狸

まぁいいか本番はローリングアップデートの実施やしね
次々

$ kubectl patch statefulset web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"gcr.io/google_containers/nginx-slim:0.8"}]'
statefulset.apps/web patched
坦々狸坦々狸

サフィックス値の大きい方から順に適用されてくのね

$ kubectl get pod -w -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          93m
web-1   1/1     Running   0          93m
web-1   1/1     Terminating   0          94m
web-1   0/1     Terminating   0          94m
web-1   0/1     Terminating   0          94m
web-1   0/1     Terminating   0          94m
web-1   0/1     Pending       0          0s
web-1   0/1     Pending       0          0s
web-1   0/1     ContainerCreating   0          0s
web-1   0/1     ContainerCreating   0          1s
web-1   1/1     Running             0          4s
web-0   1/1     Terminating         0          94m
web-0   0/1     Terminating         0          94m
web-0   0/1     Terminating         0          94m
web-0   0/1     Terminating         0          94m
web-0   0/1     Pending             0          0s
web-0   0/1     Pending             0          0s
web-0   0/1     ContainerCreating   0          0s
web-0   0/1     ContainerCreating   0          1s
web-0   1/1     Running             0          4s
坦々狸坦々狸

出来たかの確認かね

$ for p in 0 1; do kubectl get pod "web-$p" --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}'; echo; done
gcr.io/google_containers/nginx-slim:0.8
gcr.io/google_containers/nginx-slim:0.8

元の値がわからんからあかんやろこれ。。。
適用前にもこの値確認しようや。。。

坦々狸坦々狸

てか最初に適用したyamlの中身見る感じイメージ変わって無くないか?

坦々狸坦々狸

まぁいいか次はステージングね
さっきは適用したらすぐpodが入れ替わっていったいったけどこれやると適用した時点ではpodはそのままなのね

$ kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":3}}}}'
statefulset.apps/web patched
$ kubectl patch statefulset web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"k8s.gcr.io/nginx-slim:0.7"}]'
statefulset.apps/web patched
坦々狸坦々狸

ほぅほぅ{"partition":3}ってのがキモみたいやね
ここに指定した数より上の連番が振られたpodに適用されるんか

$ for p in 0 1 2 3; do kubectl get pod "web-$p" --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}'; echo; done
gcr.io/google_containers/nginx-slim:0.8
gcr.io/google_containers/nginx-slim:0.8
gcr.io/google_containers/nginx-slim:0.8
k8s.gcr.io/nginx-slim:0.7
坦々狸坦々狸

んで3を0にすると今まで通り全部に適用されると

$ kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":0}}}}'
statefulset.apps/web patched
$ for p in 0 1 2 3; do kubectl get pod "web-$p" --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}'; echo; done
k8s.gcr.io/nginx-slim:0.7
k8s.gcr.io/nginx-slim:0.7
k8s.gcr.io/nginx-slim:0.7
k8s.gcr.io/nginx-slim:0.7
坦々狸坦々狸

ローリングアップデートになる以前はOnDeleteっての使っててそれだとPodを更新しなくなるってだけ書いてるな。。。
レガシーっていうてるしもう使うこと無いってことで省略してるんやろうし今更やらんでええか
古いk8s環境屋と戦略違うかもしれんぞってことだけ意識しとけってことやねきっと

坦々狸坦々狸

StatefulSetの非カスケード削除

$ kubectl delete statefulset web --cascade=false
warning: --cascade=false is deprecated (boolean value) and can be replaced with --cascade=orphan.
statefulset.apps "web" deleted
$ kubectl get pods -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-1   1/1     Running   0          114s
web-0   1/1     Running   0          2m16s

非カスケードだからpodは残る
この状態でもう一度同じStatefulSetを適用すると
web-0が復活する
pvの割当もそのままなのでデータも残ってる

$ kubectl delete pod web-0
pod "web-0" deleted
$ kubectl get pods -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-1   1/1     Running   0          2m25s
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/ja/examples/application/web/web.yaml                                                            
service/nginx unchanged
statefulset.apps/web created
$ kubectl get pods -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-1   1/1     Running   0          3m25s
web-0   1/1     Running   0          20s
$ for i in 0 1; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done
web-0
web-1

この間のpodのステータスはweb-0が死んで復活してるだけでweb-1はそのまま使いまわしてる

$ kubectl get pods -w -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-1   1/1     Running   0          106s
web-0   1/1     Running   0          2m8s
web-0   1/1     Terminating   0          2m42s
web-0   0/1     Terminating   0          2m45s
web-1   1/1     Running       0          3m5s
web-0   0/1     Pending       0          0s
web-0   0/1     ContainerCreating   0          1s
web-0   1/1     Running             0          3s
坦々狸坦々狸

StatefulSetのカスケード削除

$ kubectl delete statefulset web
statefulset.apps "web" deleted
$ kubectl get pods -l app=nginx
No resources found in default namespace.

今度はpodも消されたけど

$ kubectl get service -l app=nginx
NAME    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   None         <none>        80/TCP    173m

サービスは残ってるから手動で消さなあかん

$ kubectl delete service nginx
service "nginx" deleted

これで一通りは消えたけどpvは残ってるからもう一度作り直したらデータはまたこれ使えるんやね

$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS        REASON   AGE
pvc-4d8c1088-c3d6-40e2-9487-85eb4354411d   1Gi        RWO            Delete           Bound    default/www-web-0   microk8s-hostpath            3h28m
pvc-3fe0dcf0-0b50-4c79-b070-9c737137f7b3   1Gi        RWO            Delete           Bound    default/www-web-1   microk8s-hostpath            3h28m
pvc-ccb3226f-19e5-4e0c-b8a7-9bc32b822100   1Gi        RWO            Delete           Bound    default/www-web-2   microk8s-hostpath            177m
pvc-2977de16-764e-4dea-999c-334e073cf92e   1Gi        RWO            Delete           Bound    default/www-web-3   microk8s-hostpath            177m
pvc-d33aa745-a6f1-4af2-b30a-1602c0d8e639   1Gi        RWO            Delete           Bound    default/www-web-4   microk8s-hostpath            176m

なんか安い金で集められた労働者が適当に作った案件とかだと使わなくなったpvがカオスのように残ってそう。。。

坦々狸坦々狸

Pod管理ポリシーをパラレルに変更したらスケーリング時の生成廃棄が並列実行されるようになるのね
起動停止の順に意味がないならこっちのほうが早い感じか

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/ja/examples/application/web/web-parallel.yaml
service/nginx created
statefulset.apps/web created
$ kubectl scale statefulset/web --replicas=4
statefulset.apps/web scaled

ポリシーが変わっただけのやつを適用してログ見ると

$ kubectl get pods -w -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   0/1     Pending   0          1s
web-0   0/1     Pending   0          1s
web-1   0/1     Pending   0          1s
web-0   0/1     ContainerCreating   0          1s
web-1   0/1     Pending             0          2s
web-1   0/1     ContainerCreating   0          2s
web-0   0/1     ContainerCreating   0          2s
web-1   0/1     ContainerCreating   0          2s
web-0   1/1     Running             0          4s
web-1   1/1     Running             0          5s
web-2   0/1     Pending             0          1s
web-3   0/1     Pending             0          1s
web-2   0/1     Pending             0          1s
web-3   0/1     Pending             0          1s
web-2   0/1     ContainerCreating   0          2s
web-3   0/1     ContainerCreating   0          2s
web-2   0/1     ContainerCreating   0          2s
web-3   0/1     ContainerCreating   0          2s
web-3   1/1     Running             0          4s
web-2   1/1     Running             0          5s

なるほどたしかにContainerCreatingが平行で動いてるね
減らしたときも同時に消えてる

$ kubectl scale statefulset/web --replicas=2
statefulset.apps/web scaled
$ kubectl get pods -w -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          2m33s
web-1   1/1     Running   0          2m33s
web-3   1/1     Running   0          117s
web-2   1/1     Running   0          117s
web-3   1/1     Terminating   0          2m2s
web-2   1/1     Terminating   0          2m2s
web-2   0/1     Terminating   0          2m4s
web-3   0/1     Terminating   0          2m4s
web-2   0/1     Terminating   0          2m14s
web-2   0/1     Terminating   0          2m14s
web-3   0/1     Terminating   0          2m16s
web-3   0/1     Terminating   0          2m16s
坦々狸坦々狸

チュートリアルは終わったけどなんとなくストレージが気になるなこれ

坦々狸坦々狸

ここか

/var/snap/microk8s/common/default-storage/

$ kubectl get pv -o wide
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS        REASON   AGE     VOLUMEMODE
pvc-4d8c1088-c3d6-40e2-9487-85eb4354411d   1Gi        RWO            Delete           Bound    default/www-web-0   microk8s-hostpath            4h41m   Filesystem
pvc-3fe0dcf0-0b50-4c79-b070-9c737137f7b3   1Gi        RWO            Delete           Bound    default/www-web-1   microk8s-hostpath            4h41m   Filesystem
pvc-ccb3226f-19e5-4e0c-b8a7-9bc32b822100   1Gi        RWO            Delete           Bound    default/www-web-2   microk8s-hostpath            4h10m   Filesystem
pvc-2977de16-764e-4dea-999c-334e073cf92e   1Gi        RWO            Delete           Bound    default/www-web-3   microk8s-hostpath            4h10m   Filesystem
pvc-d33aa745-a6f1-4af2-b30a-1602c0d8e639   1Gi        RWO            Delete           Bound    default/www-web-4   microk8s-hostpath            4h9m    Filesystem
$ kubectl describe pv pvc-4d8c1088-c3d6-40e2-9487-85eb4354411d
Name:            pvc-4d8c1088-c3d6-40e2-9487-85eb4354411d
Labels:          <none>
Annotations:     hostPathProvisionerIdentity: mk8s3
                 pv.kubernetes.io/provisioned-by: microk8s.io/hostpath
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    microk8s-hostpath
Status:          Bound
Claim:           default/www-web-0
Reclaim Policy:  Delete
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        1Gi
Node Affinity:   <none>
Message:         
Source:
    Type:          HostPath (bare host directory volume)
    Path:          /var/snap/microk8s/common/default-storage/default-www-web-0-pvc-4d8c1088-c3d6-40e2-9487-85eb4354411d
    HostPathType:  
Events:            <none>
坦々狸坦々狸

なんかあっちこっちにおなじのあるな冗長化されてるんやろか

$ seq 4 | xargs -t -n1 -I{} lxc exec mk8s{} ls  /var/snap/microk8s/common/default-storage/
lxc exec mk8s1 ls /var/snap/microk8s/common/default-storage/ 
default-www-web-0-pvc-4d8c1088-c3d6-40e2-9487-85eb4354411d
default-www-web-1-pvc-3fe0dcf0-0b50-4c79-b070-9c737137f7b3
lxc exec mk8s2 ls /var/snap/microk8s/common/default-storage/ 
default-www-web-2-pvc-ccb3226f-19e5-4e0c-b8a7-9bc32b822100
default-www-web-3-pvc-2977de16-764e-4dea-999c-334e073cf92e
lxc exec mk8s3 ls /var/snap/microk8s/common/default-storage/ 
default-www-web-0-pvc-4d8c1088-c3d6-40e2-9487-85eb4354411d
default-www-web-1-pvc-3fe0dcf0-0b50-4c79-b070-9c737137f7b3
default-www-web-2-pvc-ccb3226f-19e5-4e0c-b8a7-9bc32b822100
default-www-web-3-pvc-2977de16-764e-4dea-999c-334e073cf92e
default-www-web-4-pvc-d33aa745-a6f1-4af2-b30a-1602c0d8e639
lxc exec mk8s4 ls /var/snap/microk8s/common/default-storage/ 
default-www-web-2-pvc-ccb3226f-19e5-4e0c-b8a7-9bc32b822100
default-www-web-3-pvc-2977de16-764e-4dea-999c-334e073cf92e
default-www-web-4-pvc-d33aa745-a6f1-4af2-b30a-1602c0d8e639
坦々狸坦々狸

3落としてみるか

$ lxc exec mk8s3 -- microk8s leave                                                                                                                                                     
Generating new cluster certificates.
Waiting for node to start.
$ microk8s remove-node mk8s3
$ kubectl get nodes
NAME    STATUS   ROLES    AGE     VERSION
mk8s4   Ready    <none>   5h51m   v1.20.5-34+40f5951bd9888a
mk8s2   Ready    <none>   5h54m   v1.20.5-34+40f5951bd9888a
mk8s1   Ready    <none>   5d3h    v1.20.5-34+40f5951bd9888a
$ seq 4 | xargs -t -n1 -I{} lxc exec mk8s{} ls  /var/snap/microk8s/common/default-storage/                                                                                             
lxc exec mk8s1 ls /var/snap/microk8s/common/default-storage/                                                                                                                                                    
default-www-web-0-pvc-4d8c1088-c3d6-40e2-9487-85eb4354411d                                                                                                                                                      
default-www-web-1-pvc-3fe0dcf0-0b50-4c79-b070-9c737137f7b3                                                                                                                                                      
lxc exec mk8s2 ls /var/snap/microk8s/common/default-storage/                                                                                                                                                    
default-www-web-1-pvc-3fe0dcf0-0b50-4c79-b070-9c737137f7b3                                                                                                                                                      
default-www-web-2-pvc-ccb3226f-19e5-4e0c-b8a7-9bc32b822100                                                                                                                                                      
default-www-web-3-pvc-2977de16-764e-4dea-999c-334e073cf92e                                                                                                                                                      
lxc exec mk8s3 ls /var/snap/microk8s/common/default-storage/                                                                                                                                                    
default-www-web-0-pvc-4d8c1088-c3d6-40e2-9487-85eb4354411d                                                                                                                                                      
default-www-web-1-pvc-3fe0dcf0-0b50-4c79-b070-9c737137f7b3                                                                                                                                                      
default-www-web-2-pvc-ccb3226f-19e5-4e0c-b8a7-9bc32b822100                                                                                                                                                      
default-www-web-3-pvc-2977de16-764e-4dea-999c-334e073cf92e                                                                                                                                                      
default-www-web-4-pvc-d33aa745-a6f1-4af2-b30a-1602c0d8e639                                                                                                                                                      
lxc exec mk8s4 ls /var/snap/microk8s/common/default-storage/                                                                                                                                                    
default-www-web-2-pvc-ccb3226f-19e5-4e0c-b8a7-9bc32b822100                                                                                                                                                      
default-www-web-3-pvc-2977de16-764e-4dea-999c-334e073cf92e                                                                                                                                                      
default-www-web-4-pvc-d33aa745-a6f1-4af2-b30a-1602c0d8e639 
坦々狸坦々狸

mk8s2に1個増えたけどこれweb-0が冗長化されて無くないか。。。?

坦々狸坦々狸

snapshotから3を初期状態にして再度付け直してみよ

$ lxc restore mk8s3 snap0
$ lxc exec mk8s3 -- microk8s status --wait-ready | head -n4                                                                                                                            
microk8s is running
high-availability: no
  datastore master nodes: none
  datastore standby nodes: none
$ microk8s add-node | tail -n1 | xargs lxc exec mk8s3 --                                                                                                                               
Contacting cluster at 10.116.214.136
Waiting for this node to finish joining the cluster. ..
$ kubectl get nodes
NAME    STATUS   ROLES    AGE     VERSION
mk8s2   Ready    <none>   6h7m    v1.20.5-34+40f5951bd9888a
mk8s1   Ready    <none>   5d3h    v1.20.5-34+40f5951bd9888a
mk8s4   Ready    <none>   6h4m    v1.20.5-34+40f5951bd9888a
mk8s3   Ready    <none>   4m41s   v1.20.5-34+40f5951bd9888a
$ for i in 0 1; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done
web-0
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.11.1</center>
</body>
</html>
坦々狸坦々狸

あれ、web-1の応答がおかしい。。。
冗長化されてるように見えたけど実際は3にしかデータ無かった?

坦々狸坦々狸

どうも冗長化されてるわけじゃないな
podが動いてるノード上のディレクトリを見てるだけだわ

$ kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          51m   10.1.238.142   mk8s1   <none>           <none>
web-1   1/1     Running   0          19m   10.1.115.135   mk8s2   <none>           <none>
$ seq 4 | xargs -t -n1 -I{} lxc exec mk8s{} -- find /var/snap/microk8s/common/default-storage -name index.html
lxc exec mk8s1 -- find /var/snap/microk8s/common/default-storage -name index.html 
/var/snap/microk8s/common/default-storage/default-www-web-0-pvc-4d8c1088-c3d6-40e2-9487-85eb4354411d/index.html
lxc exec mk8s2 -- find /var/snap/microk8s/common/default-storage -name index.html 
/var/snap/microk8s/common/default-storage/default-www-web-1-pvc-3fe0dcf0-0b50-4c79-b070-9c737137f7b3/index.html
lxc exec mk8s3 -- find /var/snap/microk8s/common/default-storage -name index.html 
find: ‘/var/snap/microk8s/common/default-storage’: No such file or directory
lxc exec mk8s4 -- find /var/snap/microk8s/common/default-storage -name index.html
坦々狸坦々狸

これpodが増減して違うノードにデプロイされたらデータ消えるんじゃ。。。

坦々狸坦々狸
$ kubectl scale sts web --replicas=5
statefulset.apps/web scaled
$ kubectl get pods -o wide                                                     
NAME    READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES                                                                                                              
web-0   1/1     Running   0          55m   10.1.238.142   mk8s1   <none>           <none>                                                                                                                       
web-1   1/1     Running   0          23m   10.1.115.135   mk8s2   <none>           <none>
web-4   1/1     Running   0          29s   10.1.115.136   mk8s2   <none>           <none>
web-3   1/1     Running   0          29s   10.1.217.193   mk8s3   <none>           <none>
web-2   1/1     Running   0          29s   10.1.217.194   mk8s3   <none>           <none>
坦々狸坦々狸
$ for i in 0 1 2 3 4;do kubectl exec "web-$i" -- sh -c 'echo "$(hostname)" > /usr/share/nginx/html/index.html'; done                                                                   
$ for i in 0 1 2 3 4; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done                                                                                                   
web-0
web-1
web-2
web-3
web-4
坦々狸坦々狸
$ kubectl scale sts web --replicas=1
statefulset.apps/web scaled
$ kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          59m   10.1.238.142   mk8s1   <none>           <none>
$ kubectl scale sts web --replicas=5
statefulset.apps/web scaled
$ kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          59m   10.1.238.142   mk8s1   <none>           <none>
web-4   1/1     Running   0          14s   10.1.238.143   mk8s1   <none>           <none>
web-3   1/1     Running   0          14s   10.1.115.137   mk8s2   <none>           <none>
web-2   1/1     Running   0          14s   10.1.217.195   mk8s3   <none>           <none>
web-1   1/1     Running   0          14s   10.1.217.196   mk8s3   <none>           <none>
坦々狸坦々狸

やっぱり🤣🤣🤣🤣

$ for i in 0 1 2 3 4; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done
web-0
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.11.1</center>
</body>
</html>
web-2
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.11.1</center>
</body>
</html>
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.11.1</center>
</body>
</html>
坦々狸坦々狸

まぁ独習環境にそこまでの冗長性を求めるのは酷か。。。
とりあえず必要な機能としては充足してるしね

坦々狸坦々狸

チュートリアルの最後に削除手順載ってるけどpv消えんやんこれ。。。
まぁいいか内容は大体わかったと思うしクローズして次やな

このスクラップは2021/04/21にクローズされました