はじめに
Kubernetes クラスタの認証に OpenID Connect ID トークンを利用するとき、kubectl からクラスタを操作するには、ID トークンを kubeconfig ファイルのユーザエントリ token
として設定します。
kubectl config set-credentials admin --token=bearer_token
このとき、設定した ID トークンの有効期限が切れると認証に失敗してしまいます。一般的に ID トークンの有効期限が切れたら、リフレッシュトークンを使い ID トークンをリフレッシュする必要があり、ユーザエントリで token
を使っているとリフレッシュした ID トークンを改めて kubeconfig ファイルに設定し直す必要がありました。
この問題は、kubeconfig ファイルのユーザエントリに token
ではなく、OpenID Connect のトークンリフレッシュのフローを実行してくれる auth-provider=oidc
を利用することで解決します。
--auth-provider=oidc
kubectl config set-credentials
のヘルプにちょろっとしか記述されていませんが、kubeconfig ファイルのユーザエントリに auth-provider という機能が存在します。auth-provider はクラスタへリクエストするときに、認証部分の処理を認証プロバイダに委譲できる機能です。v1.4.4 時点で Google Cloud Platform と OpenID Connect が提供されており、OpenID Connect の場合は以下のように設定します。
# Enable the OpenID Connect auth provider for the "cluster-admin" entry with additional args
kubectl config set-credentials cluster-admin --auth-provider=oidc --auth-provider-arg=client-id=foo --auth-provider-arg=client-secret=bar
上記の例は kubectl config set-credentials
のヘルプの出力なんですが、必須のパラメータであろう Issuer URL などの値を設定する方法はドキュメントに存在しないので今のところソースコードをみるしかありません。
キー名 | 概要 |
---|---|
idp-issuer-url | Identity Provider Issuer URL |
client-id | クライアント ID |
client-secret | クライアントシークレット |
idp-certificate-authority | Identity Provider の CA 証明書ファイルのパス |
idp-certificate-authority-data | base64 エンコードされた Identity Provider の CA 証明書のデータ |
extra-scopes | 追加で取得する属性情報 (デフォルト: openid, email, profile) |
id-token | ID トークン |
refresh-token | リフレッシュトークン |
これらのキーを --auth-provider-arg
に適切に設定することで ID トークンの有効期限が切れていても kubectl がリフレッシュトークンを使い ID トークンをリフレッシュしてくれます。
まとめ
Kubernetes の認証に OpenID Connect ID トークンを使っているなら、ID トークンをリフレッシュするために --auth-provider=oidc
を使いましょう。