GKE 1.25におけるPersistent Volume Claim利用

# はじめに
運用している GKEにおいて、バージョンアップに伴いPersistent Volume Claimが利用できなくなる不具合があったので、記事として残しておきます。

## 環境
 - GKE Standard
    - v1.25.9.gke-2300 (v1.18.x頃から運用し随時バージョンアップ)
    - COS_CONTAINERD
    - 限定公開クラスタ
    - ノードプール: 1
    - ノード: 1 
    - チャネル: Stable

## 事象
v1.25.8.gke-1000からv1.25.9.gke-2300へのバージョンアップが行われた後、クラスタ上のワークロードがpendingのままになって動かないという状況でした。
ワークロードがpendingで構築されていないため、当該アプリケーションが利用できない状態でした。

ワークロードのログには以下出力がありました。
```
1 node(s) had volume node affinity conflict.
preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
```

## 調査
出力からして、Persistent Volumeに問題があるだろうと推測して調べていきました。
対象のワークロードはpd-ssdのボリュームにマウントして利用しているので、マウントが出来ていないとかそういった問題だろうという見立てから始まりました。


 - ワークロード（StatefulSet)がPersistent Volume Claimを参照しているが、これが `Pending` 
![image (33).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345258/e3ae5256-f709-efbd-a5c6-027b2e6af207.png)
 - PVC自体のステータスは `Bound` になっており利用できる状態
![image (33).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345258/d7be85cb-127a-3925-960b-794e88e9ef8e.png)


## 原因
「Compute Engine 永続ディスクの CSI ドライバ」が無効の場合に、PVCが正しく利用できなかったというものでした。

出力されていたログを元にたどり着いた[ページ](https://xebia.com/blog/do-this-before-you-upgrade-gke-to-k8s-1-25-or-you-might-feel-sorry/)にて、同一と思われる現象の報告がありました。

実際に当該クラスタの設定を確認すると、無効だったことが確認できました。
![image (31).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345258/5336221c-fbd4-b9df-bc48-d9f72a46b27e.png)

## 対処方法

「Compute Engine 永続ディスクの CSI ドライバ」を有効化します
コマンドは[公式ページ](https://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/gce-pd-csi-driver?hl=ja#enabling_the_on_an_existing_cluster)記載の通りです
```
gcloud container clusters update CLUSTER-NAME \
   --update-addons=GcePersistentDiskCsiDriver=ENABLED
```

![image (32).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345258/70fc7d39-8f8f-ee68-1d34-e18e8a765e69.png)


※ このパラメータは、最近のStandardクラスタやAutopilotを使っている場合にはデフォルトで有効になっています。

> Linux クラスタ: GKE バージョン 1.18.10-gke.2100 以降または 1.19.3-gke.2100 以降。
> Windows クラスタ: GKE バージョン 1.22.6-gke.300 以降または 1.23.2-gke.300 以降。
> Autopilot クラスタの場合、Compute Engine 永続ディスクの CSI ドライバはデフォルトで有効になっており、無効にすることや編集することはできません。


この対応によりワークロードが正しく動作するようになったことも確認できました。

## 事象について

本環境においてはv1.25.8.gke-1000からv1.25.9.gke-2300へのバージョンアップ時に発生したが、このバージョンアップがPVCの利用に影響を及ぼすような記載は、GoogleCloudでは見つかっていません。
Kuberentesとしての更新でいうと、[kubernetes 1.25.9 change log](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.25.md#changelog-since-v1259)にも関連する記載ありませんでしたが、
[kubernetes 1.25.7 change log](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.25.md#changelog-since-v1257)においては、CSIドライバについて以下の更新が記載されていました。
> Remove check for CSI driver running on node for CSI migration

これを読む限りでは、CSIドライバの設定を**チェックしなくなった**ので、有効・無効による動作差異はむしろなくなるのではないかという推察です。ただしこれも、v1.25.7時点でのことなので、今回バージョンアップでの影響が出たことについては整合性が取れていません。

本事象については問い合わせもしておりますので、何らか新規情報があれば更新します。
まずは、同じ事象で困った方の目にいち早くこの解決策が届くことを祈ります。


# 参考
 - [Compute Engine 永続ディスクの CSI ドライバの使用 | Google Cloud](https://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/gce-pd-csi-driver?hl=ja)
 - [Do this before you upgrade GKE to K8S v1.25, or you might feel sorry! | Xebia](https://xebia.com/blog/do-this-before-you-upgrade-gke-to-k8s-1-25-or-you-might-feel-sorry/)