Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Kubernetes APIをクラスター外部から呼ぶ正攻法

By Eran ChetzroniJan 30, 20192 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

5c709 1ecs g06obsiswvlwsvu oq

ジョブの実行、デプロイメントの一覧取得など、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

@example

.yaml -cacert ca.crt -H "Authorization: Bearer $token" ‘https://<cluster-ip>/apis/batch/v1/namespaces/default/jobs’

以上です。あとはこのトークンとca.crtを組み合わせれば、お好みの方法でクラスター外部からKubernetes APIを呼び出せます。

このアプローチなら、特定のAPIエンドポイントだけにアクセスできる最小権限のサービスを構成できます。ただしトークンはクラスターのパスワードに等しいので、他のシークレットと同様に厳重に管理してください。

同じ目的を達成する他の方法については、公式ドキュメントにまとめられています。

本記事で紹介したコマンドとYAMLファイルはGitLabに公開しています。

他の記事もぜひブログでご覧ください。Eranの最新情報はTwitterからどうぞ。