問題の経緯
IBM Cloud Kubernetes Service(以下、IKS)では、クラスターのオーナーという概念があります。これは、クラスターをオーダーしたときのIBM Cloudユーザーが自動的に設定されます。オーナーは、例えばマスターやワーカーのバージョンアップや、StorageClassによるIBM Cloud Storageの動的プロビジョニングを行う際に、オーナー自身のインフラストラクチャー権限を使用します(その操作の実行ユーザーではないことに注意)。つまりオーナーが適切なインフラストラクチャー権限を持っていないと、これらの作業は失敗します。
さて、このオーナーになってしまっているユーザーがプロジェクトを離任したので、アカウントから消去されたとしましょう。するとその後誰かがバージョンアップ等を行おうとした場合、権限をもったオーナーがいないため、失敗してしまいます。
そして困ったことに、クラスターのオーナーは後から変更できないとサポートから回答がありました。
というわけで、このような状況になってしまった際の回避策です。
対応方法
適切なユーザーの準備
今後の保守作業で、着任や離任に影響を受けない、固定IDのユーザーを用意することをお勧めします。用意出来たらそのユーザーをアカウントに招待し、必要なインフラストラクチャー権限を付与してください。
クラシック・インフラストラクチャー APIキーの生成
そのユーザーでIBM Cloudコンソールにログインし、メニューから「管理」→「アクセス(IAM)」→「IBM Cloud APIキー」に移動します。
すると次のように「クラシック・インフラストラクチャーAPIキーの作成」というボタンがありますので押してください。
もしこのボタンが表示されていない場合は、すでにAPIキーが生成済のはずです。
APIキーが生成されたら、詳細メニューを開きます。
APIキーの目玉マークを推すとキーが表示されます。ここで、APIユーザー名とAPIキーの値を控えてください。
クラスターへのAPIキーの設定
クラスターの管理権限をもつユーザーでIBM Cloud CLIを使用します。次のコマンドを実行します。
$ ibmcloud ks credential set classic --infrastructure-api-key ${APIキー} --infrastructure-username ${APIユーザー名}
$ ibmcloud ks api-key-reset
最後のapi-key-resetは忘れないようにしてください。これを打たないと反映されません。
設定反映の確認
設定はすぐには反映されません。次のコマンドを定期的に実行します。
kubectl get secret storage-secret-store -n kube-system -o yaml | grep slclient.toml: | awk '{print $2}' | base64 --decode
すると次のように表示されると思います。
[Softlayer]
encryption = true
softlayer_username = ""
softlayer_api_key = ""
定期的にコマンドを打ち続け、次のような表示になれば設定反映は完了です。体感的には数分~10分近くかかった気がします。
[Softlayer]
encryption = true
softlayer_username = "${APIユーザー名}"
softlayer_api_key = "${APIキー}"
softlayer_endpoint_url = "https://api.service.softlayer.com/rest/v3"
これで、これ以降はクラスターのバージョンアップやストレージの動的プロビジョン時には、このAPIキーが使われるようになります。
以上です。