Kubeconfigファイルへのサービス・アカウント認証トークンの追加
Kubernetes Engine (OKE)を使用して作成したKubernetesクラスタのkubeconfigファイルにサービス・アカウント認証トークンを追加する方法を確認します。
クラスタ用にkubeconfigファイルを設定すると、デフォルトでは、短期間の、クラスタの有効範囲が設定されたユーザー固有の認証トークンを生成するOracle Cloud Infrastructure CLIコマンドが含まれています。CLIコマンドで生成される認証トークンは、kubectlおよびKubernetes Dashboardを使用してクラスタにアクセスする個々のユーザーを認証するのに適しています。
ただし、生成される認証トークンは、継続的統合や継続的配信(CI/CD)ツールなど、クラスタにアクセスするプロセスおよびツールの認証には適していません。クラスタへのアクセスを確保するために、このようなツールには、ユーザー固有でない長期間の認証トークンが必要です。
1つのソリューションとして、このトピックで説明するように、Kubernetesサービス・アカウントを使用します。サービス・アカウントを作成したら、クラスタ管理権限を持つclusterrolebindingにバインドします。Kubernetesシークレットとして格納されるサービス・アカウントの認証トークンを作成します。その後、kubeconfigファイル自体のユーザー定義としてサービス・アカウント(および関連するサービス・アカウント認証トークン)を追加できます。その他のツールでは、クラスタにアクセスする際にサービス・アカウント認証トークンを使用できます。
このトピックのコマンドを実行するには、適切な権限が必要です。アクセス制御およびKubernetesエンジン(OKE)についてを参照してください。
kubeconfigファイルへのサービス・アカウント認証トークンを追加するには:
-
まだ実行していない場合は、ステップに従って、クラスタのkubeconfig構成ファイルを設定し、(必要に応じて)そのファイルを指すようにKUBECONFIG環境変数を設定します。自分のkubeconfigファイルを設定する必要があります。別のユーザーが設定したkubeconfigファイルを使用してクラスタにアクセスすることはできません。クラスタ・アクセスの設定を参照してください。
-
ターミナル・ウィンドウで、次の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ネームスペースでサービス・アカウントを作成することをお薦めします。これは、このトピックの手順で想定されています。ただし、必要に応じて、アクセス権を持つ別のネームスペースにサービス・アカウントを作成できます。
-
次の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
- kubeconfig-saサービス・アカウントの認証トークンを次のように取得します:
- テキスト・エディタでファイル(たとえば、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
-
次のように入力して、サービス・アカウント・トークンを作成します。
kubectl apply -f <filename>
<filename>
は、以前に作成したファイルの名前です。例:kubectl apply -f oke-kubeconfig-sa-token.yaml
-
次のように入力して、シークレットの詳細を表示します:
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
(可読性のために省略)が認証トークンです。
- テキスト・エディタでファイル(たとえば、oke-kubeconfig-sa-token.yaml)を作成し、次の内容のシークレット(たとえば、oke-kubeconfig-sa-tokenという名前)を作成します。
-
サービス・アカウント認証トークンの値を取得し、その値(base64でデコード済)を環境変数に割り当てます。この手順では、環境変数の名前としてTOKENを指定することを想定しています。入力するコマンドは、オペレーティング・システムによって異なります:
-
MacOS、LinuxまたはUNIX環境でサービス・アカウント認証トークンの値を取得するには、次のコマンドを入力します:
TOKEN=`kubectl -n kube-system get secret oke-kubeconfig-sa-token -o jsonpath='{.data.token}' | base64 --decode`
-
Windows環境でサービス・アカウント認証トークンの値を取得するには:
-
次のコマンドを入力します。
kubectl -n kube-system get secret oke-kubeconfig-sa-token -o jsonpath='{.data.token}'
- 前述のコマンドの出力をコピーし、base64デコーダに貼り付けます(たとえば、https://www.base64decode.org、https://www.base64decode.netなど)。
- base64デコーダからの出力をコピーします。
-
次のコマンドを入力します。
TOKEN=`[<base64-decoded-output>]`
ここで、
<base64-decoded-output>
は、base64デコーダからコピーした出力です。
-
-
-
次の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.
-
次のkubectlコマンドを入力して、現在のコンテキストのkubeconfigファイルに指定したユーザーを、作成した新規サービス・アカウント・ユーザーに設定します:
kubectl config set-context --current --user=<service-account-name>
例:
kubectl config set-context --current --user=kubeconfig-sa
前述のコマンドの出力により、現在のコンテキストが変更されたことが確認されます。例:
Context "context-ctdiztdhezd" modified.
-
(オプション)認証が期待どおりに動作することを検証するには、kubectlコマンドを実行し、サービス・アカウント認証トークンを使用してサービス・アカウント・ユーザーが正常に認証されることを確認します。
たとえば、以前にクラスタ上にサンプルNginxアプリケーションをデプロイした場合(Kubectlを使用したクラスタへのサンプルNginxアプリケーションのデプロイを参照)、次のコマンドを入力します:
kubectl get pods -n kube-system
前述のコマンドの出力では、クラスタ上で実行されているポッドが表示されます。コマンドが正常に実行されると、kubeconfigファイルのサービス・アカウント・ユーザーはサービス・アカウント認証トークンを使用して正常に認証されています。
- 他のプロセスやツール(継続的統合や継続的配信(CI/CD)ツールなど)がクラスタにアクセスできるように、必要に応じてkubeconfigファイルを配布します。
後でサービス・アカウントからクラスタへのアクセスを削除する場合、次のコマンドを入力して、サービス・アカウント認証トークンを含むKubernetesシークレットを削除します:
kubectl -n kube-system delete secret <secret-name>