こんにちは。先日まで、Private PaaSを提供している部署でインターンシップを行っていた岡部です。
インターンに参加した本部では、社内のアプリケーションエンジニア向けの開発者基盤 を提供しています。とくに、私の所属していた部署では、KubernetesベースのPaaSを提供しています。 本記事では、KubernetesのAdmission Webhookを活用した、より良い基盤作りに向けた取り組みの一部を紹介いたします。
(参加したインターンシップの詳細は、こちらページをご覧ください。KubernetesベースのPlatform Engineeringに挑戦)
社内の開発者向けPaaSの紹介
私がインターンとして参加した部署では、社内の開発者向けのアプリケーションプラットフォーム(以後PaaS: Platform as a Service)を提供しています。このPaaSは、Kubernetesクラスタ上に構築されており、CustomResourceDefinition(以後CRDと略記)やAdmission Webhookを用いて独自の拡張が行われています。社内の開発者はPaaSを利用し、コンテナイメージと数十行程度のマニフェストファイルを用意するだけで、簡単にアプリケーションのデプロイ・運用を行えます。端的に言えば、AWS App Runner、Google Cloud Runに近いサービスを社内向けに提供しています。
PaaSを用いると、以下のようなマニフェストファイルを作成し、アプリケーションをコンテナイメージとしてコンテナレジストリにあらかじめ登録すれば、簡単にデプロイを行えます。
apiVersion: paas.example.com/v1
kind: App
metadata:
name: hello-world
namespace: my-project
spec:
service:
autoscale:
maxReplicas: 10
minReplicas: 2
template:
spec:
containers:
- name: nginx
image: registry.example.com/hello-world:latest
ports:
- containerPort: 8080
実際には、作成したマニフェストをapp.yaml
のような名前で保存し、kubectlに近いコマンドを発行すればデプロイを行えます。
$ paasctl apply -f app.yaml
app.paas.example.com/hello-world created
社内のアプリケーション開発者は、PaaSを用いることで、コア機能の実装に集中できます。
これらの取り組みは ヤフーにおけるKubernetesを活用したPlatform Engineeringの取り組み という記事でより詳しく紹介されています。合わせてご覧ください。
課題と解決策
ヤフーでは、個人情報を取り扱うサービスが多くあります。そのため特定のKubernetesクラスタ上にアプリケーションをデプロイする際には、L7レイヤでの認証認可を強制したいという要望があります。 ヤフーでは認証認可用のSidecarが提供されており、アプリケーション開発者がそれぞれで認証認可を実装する必要がありません。社内で提供しているPaaSでは、アプリケーションに特定のラベルを付与することでSidecarをインジェクトできる仕組みがあります。
そこで、KubernetesのAdmission Webhookを利用して、アプリケーションに特定のラベルが付与されているかチェックすることで、L7レイヤーでの認証認可を強制できると考えました。
KubernetesのAdmission Webhookとは
先ほど紹介した通り、社内で提供されるPaaSはKubernetesをベースに構築されています。Kubernetesを拡張する方法はいくつかあり、とくに代表的なものとしては、CRDや、Admission Webhook(脚注1)のようなものが挙げられます。
Admission Webhookとは、クライアントからKubernetes API Serverへのリクエストが行われた際に、特定の処理を発火させられる拡張機能です。
とくにAdmission Webhookには、
- Validating Webhook
- Mutating Webhook
と呼ばれる二種類のWebhookが存在します。
Validating Webhookは特定のリソースに対する特定のオペレーションが行われる際に、リクエストの検証を行います。具体的には App を CREATE するオペレーションを行う際に、.spec.service.autoscale.maxReplicas
が100以下だと検証・実現できます。
一方、Mutating Webhookは、特定のリソースに対する特定のオペレーションが行われる際に、リクエスト内容を変更できます。例としては App を CREATE するオペレーションを行う際に、.spec.service.autoscale.maxReplicas
が100以上であれば、100に書き換えることができます。
とくにMutating Webhookは、Istioで用いられるサイドカーインジェクション(脚注2)として広く使われています。
これらのAdmission WebhookはHTTPによる通信を行えて、admissionregistration.k8s.io/v1
で定められたスキーマに沿ったJSONのやりとりができればいいので、好きな言語・フレームワークを用いて実装できます。
参考: Webhook request and response(外部サイト)