見出し画像

GKEのKubernetesクラスターにGCSのアップロードの権限を追加するKSAとGSAの設定方法

はじめに

こんにちは!ワンキャリアでONE CAREER for Engineer(以降、OCE)開発チームのテックリードをやっている高根沢です。
皆さんはKubernetes、使っていますでしょうか?
OCE開発チームではインフラにKubernetesを使っているのですが、最近あった学びについてお話しできればと思います。
具体的には、「Kubernetes Service Account(以降、KSA)とGoogle Service Account(以降、GSA)を連携することで、GKE上にデプロイされたアプリケーションからGCSを操作する方法」について解説していきます。



概要

ONE CAREER for Engineer(OCE)について

今回紹介するOCEは、新卒エンジニア向けのインターン、選考、コーディングテストの体験談を公開することで、ITエンジニアを目指す就活生の就活対策に活用できるサービスとして提供しています。
新卒向けの就活サイト「ONE CAREER」と異なり、エンジニア向けの情報に絞っているので、技術的な情報が多く載っているのが特徴です!


GKEについて

Google Kubernetes Engine(GKE)は、Google Cloud Platform(GCP)上でKubernetesクラスタを管理するためのマネージドサービスです。Kubernetesは、コンテナ化されたアプリケーションのデプロイメント、スケーリング、および管理を自動化するオープンソースのプラットフォームです。GKEは、ユーザーにKubernetesのパワフルな機能を提供しながら、クラスタのセットアップ、管理、および運用の複雑さを取り除きます。GKEは、セキュリティ、モニタリング、およびスケーリングのための組み込みのツールを提供し、ユーザーはこれらのタスクについて心配することなく、アプリケーションの開発に集中できます。 

GCSについて

Google Cloud Storage(GCS)は、Googleが提供するクラウドベースのストレージサービスです。ユーザーは、データを安全に保存し、いつでもどこでもアクセスできます。GCSは、高い耐久性とスケーラビリティを提供し、データのバックアップ、アーカイブ、または分析に最適です。また、GCSは、データの暗号化、アクセス制御、および監査の機能を提供し、データのセキュリティを確保します。

今回のユースケース

OCEのポートフォリオ機能にある「画像アップロード機能」を実現するにあたり、Kubernetesクラスター内のPodコンテナからGCSへ画像ファイルをアップロードする必要がありました。
ポートフォリオ機能は、OCEを利用している学生のプログラミング経験、個人開発経験などをWeb上で見られたり、PDFとしてダウンロードして「提出可能なポートフォリオ」として利用できる機能です。


ポートフォリオの具体的な例

内容はサンプルですが、OCE上でプロフィールを入力するとポートフォリオをPDF形式やWeb形式で作成することができます。


参考:OCEのKubernetes内リソース

OCEでは、標準のdeploymentリソースを使ってサービスのリリースを行っています。
今回のケースでは、ユーザーが選択した画像ファイルをoce-backend側にAPI経由で送信し、oce-backendからGCSにファイルをアップロードする形になります。そのため、権限付与対象はoce-backendのPodコンテナになります。


権限付与の流れ

ステップ1. Googleサービスアカウント(GSA)の作成

まずは、通常通りGoogleサービスアカウントを作成します。
今回は検証も兼ねていたので、通常通りダッシュボードから作成します。操作としては、Storageオブジェクトの権限をGSA(gsa-oce-backend)に付与しました。

ステップ2. Kubernetesサービスアカウント(KSA)の作成

kubectlでKubernetesサービスアカウント(KSA)を作成します。
OCEにおいては、CI/CDのタイミングで自動的にdeployment.yamlの内容が反映されるようになっているため、deployment.yaml上にKSAの記述を追記しました。
また、Podが利用するKSAを指定するため、deploymentリソースのspec.template.spec.serviceAccountNameにKSAのnameを指定するようにしています。
この作業が完了すれば、Kubernetesクラスター内において、oce-backendがksa-oce-backendというKSAを利用するという状態になります。(ただし、KSAは何も権限を持たないアカウントの状態)

ステップ3. KSAとGSAの連携(バインディング)

ステップ2で作成したKSAに対して、GSAで付与した権限をバインディングする作業を行います。
バインディングは、以下のコマンドで行えます。
これにより、Kubernetesクラスター内で利用しているKSAに対しGSAで設定した「Storageオブジェクト管理者」の権限が付与されるようになります。

gcloud iam service-accounts add-iam-policy-binding \\
--role="roles/iam.workloadIdentityUser" \\
--member="serviceAccount:{project_id}.svc.id.goog[namespace-xxx/ksa-oce-backend]" \\
gsa-oce-backend@{project_id}.iam.gserviceaccount.com

また、バインディング後に、KSAに対してGSAを利用するようにannotationを追加する必要があります。
追加については、以下のコマンドで行えます。

kubectl annotate serviceaccount ksa-oce-backend  \\
iam.gke.io/gcp-service-account=gsa-oce-backend@{project_id}.iam.gserviceaccount.com \\
  -n namespace-xxx

もしくは、k8s manifestで以下のように適用することも可能です。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: ksa-oce-backend
  annotations:
    iam.gke.io/gcp-service-account: gsa-oce-backend@{project_id}.iam.gserviceaccount.com

4. 検証

annotateを追加すると、Podコンテナを落とさずに即座に権限設定が反映されます。
実際に開発環境で確認したところ、問題なくアップロードできることを確認しました。



まとめ

今回は、OCEのポートフォリオ機能に必要な「画像アップロード機能」の権限付与をKubernetes Service AccountとGoogle Service Accountを使って実現してみました。
実際に手順化してみると、1つ1つの手順はとてもシンプルで、楽に権限付与まで行うことができました。
もし、GKEを使っていてKSA、GSA周りで困っている場合には、参考にしていただけると嬉しいです。


▼ワンキャリアのエンジニア組織のことを知りたい方はまずこちら

▼カジュアル面談を希望の方はこちら

▼エンジニア求人票


この記事が参加している募集

オープン社内報

この記事が気に入ったらサポートをしてみませんか?