ayumin.log

読みにくかったら脳内sedで整形してね

Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) にローカルからトークンベース認証で kubectl get pod するまでの道のり

最近無料枠の大きいOracle Cloud Infrastructure(以下OCI)でKubernetesを運用する機運が高まったので、とりあえず kubectl get podしようとしたら詰まった。

結論としては

  • kubeconfigに設定を追加するには、OCI CLIを認証が通った状態で叩ける必要がある
  • OCI CLIoci session authenticate するだけではダメ

という感じだったので、同じハマりをしないようメモっておく。

前提

必須条件

  • Oracle Cloud Infrastructureアカウントがある
  • ↑のアカウントに権限のあるユーザがいる (CLIで操作できるユーザが存在する)
  • アクセス可能なパブリックエンドポイントを持つOKEクラスタがある

トークンベース認証を行う

公式ドキュメントがあるので、その通りに認証を行う。

oci session authenticate

ブラウザがある場合は上コマンドを打つとCLIでリージョン選択後、ブラウザで認証画面が出てくる。

基本東京リージョンを使用するので、ap-tokyo-1の番号を選べば良いと思う。

ブラウザでログインしたあとは、CLIのprofile名を入力する。おそらく初回だと自動的にDEFAULTになるので、特に何も出ないで終わるケースもある。

うまくいくと ~/.oci/config に以下のような設定が追加されるはず。

[DEFAULT]
fingerprint=<keyのfingerprint>
key_file=/Users/ayu/.oci/sessions/DEFAULT/oci_api_key.pem
tenancy=<テナンシID>
region=<リージョン名(ap-tokyo-1等)>
security_token_file=/Users/ayu/.oci/sessions/DEFAULT/token

ない場合は公式ドキュメントにどうすれば良いか書いているので以下を参照。

docs.oracle.com

CLIが毎回トークンベースで認証を行うようにする

さて、ここからが本題。

OCI CLIは、トークンベースで認証を行っても、自動的にその認証情報を使ってくれない

なので、以下のどちらかをしないといけない。

  • コマンドのオプションとして、 --auth security_token をつける
  • 環境変数として OCI_CLI_AUTH=security_token を設定する

前者でも後者でも問題ないが、以下の理由から前者で対応することにする。

  • OCI CLIの設定は一括でまとめたい
  • 後者は環境変数になる都合上 ~/.bashrc などに追記する必要があり設定が増える

しかし毎回コマンドオプションをつけるのはだるいので、自動的にこのオプションがつくように設定する。

OCI CLIには、CLI構成ファイルというオプションやエイリアスの設定ができる機能があるので、これを使う。

まず、設定ファイルを作る。

oci setup oci-cli-rc

次に、 ~/.oci/oci_cli_rcに以下の設定を追加する。

compartment-idやtenancyというのは聞き馴染みがないかもしれないが、GCPのproject_idとproject_root_idに近い概念で、tenancyがプロジェクトのトップ、そこから木構造のようにコンパートメントを切って様々なプロジェクトを管理する。

OCIはコンパートメントの指定がないと基本的にリソースを絞れないので、ほとんどのコマンドでコンパートメントIDを要求してくる。コンソールでも大体左側のサイドバーで今何のコンパートメントを見ているか表示される。

[DEFAULT]
auth = security_token
compartment-id = <OKEクラスタがあるコンパートメントID。tenancyにある場合はテナンシID>

この設定をすることで、oci cliを使うコマンドが以下のように暗黙的に変換される。

# 未設定
oci foo bar

# 設定済み
oci foo bar --auth security_token --compartment-id <コンパートメントID>

これでOCI CLI周りの準備は完了。

OKEクラスタに接続する

OKEクラスタへの接続は別途設定が必要なので、OKEクラスタのアクセス情報を取得する。

OKEのクラスタを作成すると、左上側のボタンに クラスタへのアクセス ボタンがあるので、モーダルの ローカル・アクセス ボタンを押し、パブリックエンドポイントを使うときの設定のコマンドをコピペして実行すれば、kubectl が使用できる状態になる。

OKEコンソール

ローカル・アクセス

あとは kubectl get pod ができるはず。

エラーが出る場合、どこかの認証が誤っている(特にOCI CLIの構成ファイル ~/.oci/oci_cli_rc の設定が漏れている)可能性が高いので、再度確認してみる。