CRDのバージョンを変えたい場合、まず以下の2つのプランがある。
- 方法A: CRDとオブジェクトを全部消して再作成する
- 方法B: 再作成は行わずオブジェクトをダウングレードする
ここでは方法Bについて。
以下のように、v1alpha1
とv1beta1
が用意されていて、v1beta1
からv1alpha1
に戻す方法を例にする。なお例示のyamlは必要なところ以外省略するので注意。
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
spec:
group: example.com
names:
kind: Example
listKind: ExampleList
plural: examples
singular: example
versions:
- name: v1alpha1
served: true
storage: false
- name: v1beta1
served: true
storage: true
1. CRDのストレージバージョンを対象に変える
-
stored: true
になるバージョンは1つだけであるように注意 - まだ新しいバージョンは削除しないように注意
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
spec:
versions:
- name: v1alpha1
served: true
storage: true
- name: v1beta1
served: true
storage: false
2. kubectl getで明示的に変換リクエストを発生させる
ストレージバージョンを指定して明示的に変換リクエストを発生させる。ストレージバージョンでストレージされる。
kubectl get examples.v1alpha1.example.com -A
- Conversion Webhookがある場合
- Webhookで適切に変換されることを確認
- 変換できない場合は変換可能な状態にするか再作成しかない
- Conversion Webhookがない場合
- バージョン間でフィールドに互換性がない場合は修正
いずれの場合も、必ずすべてのオブジェクトについてgetを行う。もともとv1alpha1
で作成されていても、ストレージバージョンがv1beta1
ならv1beta1
で保存されているため。
3. バージョンを無効化
served: false
で使用できなくなる。
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
spec:
versions:
- name: v1alpha1
served: true
storage: true
- name: v1beta1
served: false
storage: false
4. コントローラの再起動
kubectl rollout restart deploy/example-contoller
まだバージョンは削除しないように注意。
5. バージョンの削除
コントローラなどが正常に動作することを確認してから、バージョンを削除する。
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
spec:
versions:
- name: v1alpha1
served: true
storage: true
status:
storedVersions:
- v1alpha1
kubectlでバージョンを指定しない場合、しばらくエラーが起きる可能性がある。これはAPIサーバが最新バージョン名をキャッシュしているからで、しばらくすれば動くようになる。