本篇大綱
本篇僅會出現在此 Blog,因為碰到 Volume Type __DEFAULT__
有某些原因被管理員宣告 Retired,因此做了遷移相關紀錄。
題外話
文章開始之前先岔題一下,我的《關於我怎麼把一年內學到的新手 IT/SRE 濃縮到 30 天筆記這檔事》系列文章被 iThome 評審團隊選為佳作,特此感謝評審的青睞,謝謝 Cloud Native Taiwan User Group 給予的 Infra Labs 還有郭靖前輩的協助,讓我可以把這文章順利寫完。
自己正在做生涯蠻大的規劃,預計要到年中才會公布,就敬請期待啦!
內文
前幾天收到郭靖前輩的訊息,之前的預設 Volume type 是 __DEFAULT__
,因為要把 __DEFAULT__
給 retired,想要 Migrate 過去到 SATA_SSD
。
具體有兩種做法:
- 用 CSI volume cloning 複製 PVC 然後切換過去,目前預設新建的 Volume type 應該都是
SATA_SSD
。
- Detach 該 volume 然後用 Cinder 換成新的 Volume type。
最近鐵人賽的結果出爐,可以把該資源釋放來做其他事情了,但也剛好接到這樣遷移需求,因此裡面的服務也充當了這次的實驗白老鼠。
服務與架構介紹
Kubernetes cluster 由 k8s-m0
, k8s-n0
, k8s-n1
組合而成,也就是一個 Master node 和兩個 Worker node 組合,裡面安裝了 Prometheus
, Grafana
, Loki
, GitLab
。
其中,使用到 PersistentVolume 的服務有
Prometheus
GitLab
Gitaly
PostgreSQL
MinIO
Redis
Loki
(理論上也需要,但鐵人賽期間我忘記要幫它用 PersistentVolume,所以它現在用的是 EmptyDir。)
轉換 Volume type
因為要把硬碟 detach,為了避免服務直接損壞,這裡會先把節點關機後再做 detach,最後再更換 Volume type。
- 除了要關機的節點以外,把每個 Node 都做 Cordon。
這裡我會先把每個節點都做 Cordon,所有 Pod 都會待在原地不移動到其他的 Node 上。
1 2 3
| kubectl cordon k8s-m0 # 如果 k8s-m0 要關機就不要打這行 kubectl cordon k8s-n0 # 如果 k8s-n0 要關機就不要打這行 kubectl cordon k8s-n1 # 如果 k8s-n1 要關機就不要打這行
|
- 把該節點關機。
1 2 3
| ubuntu@bastion-host:~$ ssh ubuntu@k8s-n0 ubuntu@k8s-n0:~$ sudo shutdown -h 0 ubuntu@bastion-host:~$
|
- 把該節點上的硬碟 detach
選硬碟 > Manage Attachments
點選 Detach Volume
。
- 更換 Volume Type
選硬碟 > Change Volume Type
- Type:
SATA_SSD
- Migration Policy:
On Demand
點選 Change Volume Type
。
等待轉換
轉換完成後,重新 attach 到該節點上。
重新開機該節點
把每個 Node 都做 Uncordon
1 2 3
| kubectl uncordon k8s-m0 kubectl uncordon k8s-n0 kubectl uncordon k8s-n1
|
小插曲 - Application Credentials
這次在更換時還出現小插曲,因為我之前專案分很多隻帳號,實驗帳號有掛 Application Credentials,整合後 Application Credentials 沒有一起合併,因此還出現 CSI 全部直接 Crash。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| ubuntu@bastion-host:~/k8s/cinder-csi$ kubectl logs -n kube-system openstack-cinder-csi-nodeplugin-dhvbx cinder-csi-plugin I1222 11:32:21.780001 1 driver.go:75] Driver: cinder.csi.openstack.org I1222 11:32:21.780073 1 driver.go:76] Driver version: 2.0.0@ I1222 11:32:21.780080 1 driver.go:77] CSI Spec version: 1.3.0 I1222 11:32:21.780113 1 driver.go:107] Enabling controller service capability: LIST_VOLUMES I1222 11:32:21.780122 1 driver.go:107] Enabling controller service capability: CREATE_DELETE_VOLUME I1222 11:32:21.780128 1 driver.go:107] Enabling controller service capability: PUBLISH_UNPUBLISH_VOLUME I1222 11:32:21.780136 1 driver.go:107] Enabling controller service capability: CREATE_DELETE_SNAPSHOT I1222 11:32:21.780141 1 driver.go:107] Enabling controller service capability: LIST_SNAPSHOTS I1222 11:32:21.780148 1 driver.go:107] Enabling controller service capability: EXPAND_VOLUME I1222 11:32:21.780155 1 driver.go:107] Enabling controller service capability: CLONE_VOLUME I1222 11:32:21.780161 1 driver.go:107] Enabling controller service capability: LIST_VOLUMES_PUBLISHED_NODES I1222 11:32:21.783368 1 driver.go:107] Enabling controller service capability: GET_VOLUME I1222 11:32:21.783405 1 driver.go:119] Enabling volume access mode: SINGLE_NODE_WRITER I1222 11:32:21.783413 1 driver.go:129] Enabling node service capability: STAGE_UNSTAGE_VOLUME I1222 11:32:21.783420 1 driver.go:129] Enabling node service capability: EXPAND_VOLUME I1222 11:32:21.783424 1 driver.go:129] Enabling node service capability: GET_VOLUME_STATS I1222 11:32:21.783468 1 openstack.go:137] InitOpenStackProvider configFiles: [/etc/kubernetes/cloud.conf] I1222 11:32:21.794251 1 openstack.go:90] Block storage opts: {0 false false} W1222 11:32:21.930439 1 main.go:100] Failed to GetOpenStackProvider: Resource not found: [POST https://openstack.cloudnative.tw:5000/v3/auth/tokens], error message: {"error":{"code":404,"message":"Could not find Application Credential: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.","title":"Not Found"}}
|
這時候照我的 Day 23 Cinder CSI Plugin 重新設定 OpenStack Application Credentials 即可。
Zero downtime 的可能性
這裡我有跟郭靖前輩小小請教,Change Volume Type 的 Zero downtime 可能性,但有點可惜的是服務都是 Stateful 而非 Stateless,要做 Zero downtime 本來就很麻煩。
後記
雖然系列文結束了,但我還會不定時推出番外篇做更新,針對 Infra Labs 相關內容做調整。
下篇文章應該會來寫寫心得,有興趣可以按下 RSS 追蹤,那就下一篇文章見!