Kubeconfigファイルへのサービス・アカウント認証トークンの追加

クラスタ用にkubeconfigファイルを設定すると、デフォルトでは、短期間の、クラスタの有効範囲が設定されたユーザー固有の認証トークンを生成するOracle Cloud Infrastructure CLIコマンドが含まれています。CLIコマンドで生成される認証トークンは、kubectlおよびKubernetes Dashboardを使用してクラスタにアクセスする個々のユーザーを認証するのに適しています。

ただし、生成される認証トークンは、継続的統合や継続的配信(CI/CD)ツールなど、クラスタにアクセスするプロセスおよびツールの認証には適していません。クラスタへのアクセスを確保するために、このようなツールには、ユーザー固有でない長期間の認証トークンが必要です。

1つのソリューションとして、このトピックで説明するように、Kubernetesサービス・アカウントを使用します。サービス・アカウントには、Kubernetesシークレットとして格納される、関連付けられたサービス・アカウント認証トークンがあります。サービス・アカウントを作成したら、クラスタ管理権限を持つclusterrolebindingにバインドします。その後、kubeconfigファイル自体のユーザー定義としてサービス・アカウント(およびそのサービス・アカウント認証トークン)を追加できます。その他のツールでは、クラスタにアクセスする際にサービス・アカウント認証トークンを使用できます。

このトピックのコマンドを実行するには、適切な権限が必要です。アクセス制御およびContainer Engine for Kubernetesについてを参照してください。

kubeconfigファイルへのサービス・アカウント認証トークンを追加するには:

  1. まだ実行していない場合は、ステップに従って、クラスタのkubeconfig構成ファイルを設定し、(必要に応じて)そのファイルを指すようにKUBECONFIG環境変数を設定します。自分のkubeconfigファイルを設定する必要があります。別のユーザーが設定したkubeconfigファイルを使用してクラスタにアクセスすることはできません。クラスタ・アクセスの設定を参照してください。
  2. ターミナル・ウィンドウで、次のkubectlコマンドを入力して、kube-systemネームスペースで新しいサービス・アカウントを作成します:

    kubectl -n kube-system create serviceaccount <service-account-name>

    たとえば、kubeconfig-saというサービス・アカウントを作成するには、次を入力します:

    kubectl -n kube-system create serviceaccount kubeconfig-sa

    前述のコマンドの出力により、サービス・アカウントの作成が確認されます。例:

    serviceaccount/kubeconfig-sa created

    kube-systemネームスペースでサービス・アカウントを作成することをお薦めします。これは、このトピックの手順で想定されています。ただし、必要に応じて、アクセス権を持つ別のネームスペースにサービス・アカウントを作成できます。

  3. 次のkubectlコマンドを入力して、クラスタ管理権限を持つ新しいclusterrolebindingを作成し、作成したサービス・アカウントにこれをバインドします:

    kubectl create clusterrolebinding <binding-name> --clusterrole=cluster-admin --serviceaccount=kube-system:<service-account-name>

    たとえば、add-on-cluster-adminというclusterrolebindingを作成して、それをkubeconfig-sa service accountにバインドするには、次を入力します:

    kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:kubeconfig-sa

    前述のコマンドの出力により、clusterrolebindingの作成が確認されます。例:

    clusterrolebinding.rbac.authorization.k8s.io/add-on-cluster-admin created
  4. 次のコマンドを入力して、サービス・アカウント認証トークンの名前を取得し、その値を環境変数に割り当てます(これらの手順では、環境変数の名前としてTOKENNAMEを指定することを想定しています):

    TOKENNAME=`kubectl -n kube-system get serviceaccount/<service-account-name> -o jsonpath='{.secrets[0].name}'`

    例:

    TOKENNAME=`kubectl -n kube-system get serviceaccount/kubeconfig-sa -o jsonpath='{.secrets[0].name}'`
  5. サービス・アカウント認証トークンの値を取得し、その値(base64でデコード済)を環境変数に割り当てます。この手順では、環境変数の名前としてTOKENを指定することを想定しています。入力するコマンドは、オペレーティング・システムによって異なります:

    • MacOS、LinuxまたはUNIX環境でサービス・アカウント認証トークンの値を取得するには、次のコマンドを入力します:

      TOKEN=`kubectl -n kube-system get secret $TOKENNAME -o jsonpath='{.data.token}'| base64 --decode`
    • Windows環境でサービス・アカウント認証トークンの値を取得するには:

      1. 次のコマンドを入力します。

        kubectl -n kube-system get secret $TOKENNAME -o jsonpath='{.data.token}'
      2. 前述のコマンドの出力をコピーし、base64デコーダに貼り付けます(たとえば、https://www.base64decode.org、https://www.base64decode.netなど)。
      3. base64デコーダからの出力をコピーします。
      4. 次のコマンドを入力します。

        TOKEN=`[<base64-decoded-output>]`

        ここで、<base64-decoded-output>は、base64デコーダからコピーした出力です。

  6. 次のkubectlコマンドを入力して、kubeconfigファイルに新しいユーザー定義としてサービス・アカウント(およびその認証トークン)を追加します。

    kubectl config set-credentials <service-account-name> --token=$TOKEN

    サービス・アカウント(およびその認証トークン)が、kubeconfigファイルで定義されているユーザーのリストに追加されます。

    たとえば、kubeconfig-saサービス・アカウントとその認証トークンをkubeconfigファイルに追加するには、次を入力します:

    kubectl config set-credentials kubeconfig-sa --token=$TOKEN

    前述のコマンドの出力で、サービス・アカウントがkubeconfigファイルに追加されたことが確認されます。例:

    User "kubeconfig-sa" set.
  7. 次のkubectlコマンドを入力して、現在のコンテキストのkubeconfigファイルに指定したユーザーを、作成した新規サービス・アカウント・ユーザーに設定します:

    kubectl config set-context --current --user=<service-account-name>

    例:

    kubectl config set-context --current --user=kubeconfig-sa

    前述のコマンドの出力により、現在のコンテキストが変更されたことが確認されます。例:

    Context "context-ctdiztdhezd" modified.
  8. (オプション)認証が期待どおりに動作することを検証するには、kubectlコマンドを実行し、サービス・アカウント認証トークンを使用してサービス・アカウント・ユーザーが正常に認証されることを確認します。

    たとえば、以前にクラスタ上にサンプルNginxアプリケーションをデプロイした場合(Kubectlを使用したクラスタへのサンプルNginxアプリケーションのデプロイを参照)、次のコマンドを入力します:

    kubectl get pods

    前述のコマンドの出力では、クラスタ上で実行されているポッドが表示されます。コマンドが正常に実行されると、kubeconfigファイルのサービス・アカウント・ユーザーはサービス・アカウント認証トークンを使用して正常に認証されています。

  9. 他のプロセスやツール(継続的統合や継続的配信(CI/CD)ツールなど)がクラスタにアクセスできるように、必要に応じてkubeconfigファイルを配布します。
ノート

後でサービス・アカウントからクラスタへのアクセスを削除する場合、次のコマンドを入力して、サービス・アカウント認証トークンを含むKubernetesシークレットを削除します:

kubectl -n kube-system delete secret $TOKENNAME