Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

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

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

By Eran ChetzroniJan 30, 20192 min read
Eran Chetzroni

About Eran Chetzroni

Leading FDEs and Cloud Architects across the globe.

My personal page

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

PerfectScale™ for Kubernetes

Ready to optimize?

Get your free Kubernetes savings analysis

この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

Your cloud bill shouldn't be a mystery

Optimization, automation, expertise. In one platform.

準備が整ったので、ローカルマシンから新しい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からどうぞ。