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が冗長化されて無くないか。。。?
てかleaveした3にpvの情報残ってるのもなんか。。。
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消えんやんこれ。。。
まぁいいか内容は大体わかったと思うしクローズして次やな