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サーバが最新バージョン名をキャッシュしているからで、しばらくすれば動くようになる。