
ジョブの実行、デプロイメントの一覧取得など、Kubernetes APIが提供する機能をクラスターの外から呼び出したい場面は少なくありません。
本記事では、Service AccountのJWT(JSON Web Token)を利用した方法をステップバイステップで紹介します。
まず、クラスター内で管理者ロールを取得しておきます(未取得の場合)。
kubectl create clusterrolebinding cluster-admin-binding \ -clusterrole cluster-admin \-user "$(gcloud config get-value account)"続いて、必要な権限を付与する専用のKubernetes Service Accountを作成します。
kubectl create serviceaccount external-svcこのService Accountにロールを紐付けます。今回はbatch/Jobsに対するview、list、createを付与しました。
これで外部サービスからKubernetesのジョブを作成・監視できるようになります(rbac.yamlはこちら)。
kubectl create -f rbac.yaml次に、Service Accountに紐付くシークレット名を取得します。
export secret=`kubectl get serviceaccount external-svc -o json | jq -Mr ‘.secrets[].name’`クラスターのCA証明書を取り出し、ローカルにca.crtとして保存します。
kubectl get secrets $secret -o json | jq -Mr ‘.data["ca.crt"]’ | base64 -D > ca.crt続いてシークレットトークンを取得し、環境変数に格納します。
export token=`kubectl get secrets $secret -o json | jq -Mr ‘.data.token’ | base64 -D`クラスターのIPアドレスを確認します。
kubectl cluster-info準備が整ったので、ローカルマシンから新しいService Accountのトークンを使ってジョブ一覧を取得してみましょう。
curl ‘https://<cluster-ip>/apis/batch/v1/namespaces/default/jobs’ -cacert ca.crt -H "Authorization: Bearer $token"同じくクラスター外部から、サンプルジョブを作成してみます。
curl -X POST -H ‘Content-Type: application/yaml’-data-binary.yaml -cacert ca.crt -H "Authorization: Bearer $token" ‘https://<cluster-ip>/apis/batch/v1/namespaces/default/jobs’以上です。あとはこのトークンとca.crtを組み合わせれば、お好みの方法でクラスター外部からKubernetes APIを呼び出せます。
このアプローチなら、特定のAPIエンドポイントだけにアクセスできる最小権限のサービスを構成できます。ただしトークンはクラスターのパスワードに等しいので、他のシークレットと同様に厳重に管理してください。
同じ目的を達成する他の方法については、公式ドキュメントにまとめられています。
本記事で紹介したコマンドとYAMLファイルはGitLabに公開しています。