《關於我怎麼把一年內學到的新手 IT/SRE 濃縮到 30 天筆記這檔事》 Day 31 番外篇 - Openstack K8s CSI Migration - Change Volume Type

本篇大綱

本篇僅會出現在此 Blog,因為碰到 Volume Type __DEFAULT__ 有某些原因被管理員宣告 Retired,因此做了遷移相關紀錄。

題外話

文章開始之前先岔題一下,我的《關於我怎麼把一年內學到的新手 IT/SRE 濃縮到 30 天筆記這檔事》系列文章被 iThome 評審團隊選為佳作,特此感謝評審的青睞,謝謝 Cloud Native Taiwan User Group 給予的 Infra Labs 還有郭靖前輩的協助,讓我可以把這文章順利寫完。

自己正在做生涯蠻大的規劃,預計要到年中才會公布,就敬請期待啦!

內文

前幾天收到郭靖前輩的訊息,之前的預設 Volume type 是 __DEFAULT__,因為要把 __DEFAULT__ 給 retired,想要 Migrate 過去到 SATA_SSD

具體有兩種做法:

  1. 用 CSI volume cloning 複製 PVC 然後切換過去,目前預設新建的 Volume type 應該都是 SATA_SSD
  2. 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。

  1. 除了要關機的節點以外,把每個 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. 把該節點關機。
1
2
3
ubuntu@bastion-host:~$ ssh ubuntu@k8s-n0
ubuntu@k8s-n0:~$ sudo shutdown -h 0
ubuntu@bastion-host:~$
  1. 把該節點上的硬碟 detach

選硬碟 > Manage Attachments

點選 Detach Volume

  1. 更換 Volume Type

選硬碟 > Change Volume Type

  • Type: SATA_SSD
  • Migration Policy: On Demand

點選 Change Volume Type

  1. 等待轉換

  2. 轉換完成後,重新 attach 到該節點上。

  1. 重新開機該節點

  2. 把每個 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 追蹤,那就下一篇文章見!


《關於我怎麼把一年內學到的新手 IT/SRE 濃縮到 30 天筆記這檔事》 Day 31 番外篇 - Openstack K8s CSI Migration - Change Volume Type
https://blog.yangjerry.tw/it2022-day31/
作者
Jerry Yang
發布於
2023年2月16日
許可協議