ワークロードをウェブ API として公開する
PFCP の API Identity-Aware Proxy(API IAP)機能を使うことで、ワークロードをウェブ API としてインターネットに公開できます。 公開するウェブ API には自動でアクセス時の認証が設定され、アクセスには Kubernetes ServiceAccount のトークンが必要になります。
API IAP を利用してウェブ API をインターネットに公開する方法を説明します。
ブラウザからアクセスする ウェブアプリ としてワークロードを公開したい場合は ワークロードをウェブアプリとして公開する を参照してください。
Ingressリソースを使用したウェブ API の公開
-
公開するワークロードと Service リソースを用意します。ここでは例として、
example-svc
Service の 80 番ポートへアクセスすることでワークロードへアクセスできる状態になっているとします。 -
以下を参考に、Ingress マニフェストを作成します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - # Ingress に割り当てるドメインを指定します。 # 注意: ウェブアプリでの公開と異なり、`api.iap.pfcomputing.com` のサブドメインを指定します。 host: example.<組織名>.<クラスタ名>.api.iap.pfcomputing.com http: paths: - path: / pathType: Prefix backend: # 公開対象の Service 名とポートを指定します。 service: name: example-svc port: number: 80
-
以下を参考に、Ingress へアクセスするための Kubernetes ServiceAccount を作成します。
apiVersion: v1 kind: ServiceAccount metadata: name: example-sa # Ingress と同じ Namespace を指定します。 namespace: org-foo labels: # アクセスを許可する Ingress リソースの名前を指定します。 ingress.preferred.jp/allowed-ingress: example-ingress
-
kubectl を利用して Kubernetes ServiceAccount のトークンを発行します。Ingress リソースに設定したドメインへ
https://
をつけた値を Audience に設定する必要があります。トークンの有効期限は必要に応じて調整してください。$ kubectl create token example-sa --duration 12h --audience https://example.<組織名>.<クラスタ名>.api.iap.pfcomputing.com eyJ...
-
発行したトークンを
Authorization
HTTP ヘッダーに指定し、設定したドメインにアクセスします。公開したサービスにアクセスできることを確認します。$ curl -v -H "Authorization: Bearer eyJ..." https://example.<組織名>.<クラスタ名>.api.iap.pfcomputing.com
トークンの管理
発行済みの Kubernetes ServiceAccount のトークンを無効にするには、Kubernetes ServiceAccount 自体を削除してください。トークンごとに細かく無効化したい場合は Bound トークン の利用を検討してください。
Kubernetes ServiceAccount の ingress.preferred.jp/allowed-ingress
ラベルを削除すると、トークンを無効化せずに一時的にアクセスを遮断できます。アクセスを再開する場合は再度ラベルを設定してください。
Ingress にアクセス可能な Kubernetes ServiceAccount の一覧は kubectl コマンドで確認できます。
$ kubectl get serviceaccount --selector ingress.preferred.jp/allowed-ingress
NAME SECRETS AGE
example-sa 0 4s
制限事項
- Service リソースの
NodePort
、LoadBalancer
タイプを使用したサービスの公開をサポートしていません - 複数の Ingress で同一のドメインを共有している場合はアクセスできません
- 60 秒間通信のない状態が続くとコネクションが切断されます