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

Container Engine for Kubernetes (OKE)を使用して作成したKubernetesクラスタのkubeconfigファイルにサービス・アカウント認証トークンを追加する方法を確認します。

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

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

1つのソリューションとして、このトピックで説明するように、Kubernetesサービス・アカウントを使用します。サービス・アカウントを作成したら、クラスタ管理権限を持つclusterrolebindingにバインドします。Kubernetesシークレットとして格納されるサービス・アカウントの認証トークンを作成します。その後、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. kubeconfig- saサービス・アカウントの認証トークンを次のように取得します。
    1. テキスト・エディタで、次の内容でシークレット(たとえば、oke- kubeconfig- sa- token.yaml)を作成するためのファイル(たとえば、oke- kubeconfig- sa- token)を作成します。
      apiVersion: v1
      kind: Secret
      metadata:
        name: oke-kubeconfig-sa-token
        namespace: kube-system
        annotations:
          kubernetes.io/service-account.name: kubeconfig-sa
      type: kubernetes.io/service-account-token
    2. 次のように入力して、サービス・アカウント・トークンを作成します:

      kubectl apply -f <filename>

      <filename>は、以前に作成したファイルの名前です。例:

      kubectl apply -f oke-kubeconfig-sa-token.yaml
    3. 次のように入力して、シークレットの詳細を表示します。

      kubectl describe secrets oke-kubeconfig-sa-token -n kube-system

      前述のコマンドの出力には、次に示すように、認証トークン(長い英数字の文字列)がtoken:要素の値として含まれています:

      Name:         oke-kubeconfig-sa-token
      Namespace:    kube-system
      Labels:       <none>
      Annotations:  kubernetes.io/service-account.name: kubeconfig-sa
      kubernetes.io/service-account.uid: 6d0fda1c-b456-44b3-25fd-4a824bef1936
      Type:  kubernetes.io/service-account-token
      Data
      ====
      ca.crt:     1289 bytes
      namespace:  11 bytes
      token:      bxYk______rz15A

      前述の例では、bxYk______rz15A (読みやすさのために省略)が認証トークンです。

  5. サービス・アカウント認証トークンの値を取得し、その値(base64でデコード済)を環境変数に割り当てます。この手順では、環境変数の名前としてTOKENを指定することを想定しています。入力するコマンドは、オペレーティング・システムによって異なります:

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

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

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

        kubectl -n kube-system get secret oke-kubeconfig-sa-token -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 -n kube-system

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

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

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

kubectl -n kube-system delete secret <secret-name>