Edited at

kubectl で OpenID Connect ID トークンをリフレッシュする

More than 1 year has passed since last update.


はじめに

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 を使いましょう。