Pomerium Ingress
このチュートリアルでは、Pomerium Ingress Controller のインストールと、cert-manager を使用したセキュリティ保護について説明します。Pomerium は、Kubernetesサービスのカスタムイングレスコントローラーも提供できる、ID認識プロキシです。
前提条件
-
Kubectl をインストールし、使用するクラスタにコンテキストを設定します。
-
Pomerium は、ユーザーを認証するために ID プロバイダー (IdP) に接続します。IdP の設定方法については、ガイド を参照してください。
-
このチュートリアルでは、このクラスタ用に予約されたドメイン空間(例:
*.example.com
)があることを前提としています。必要に応じて A レコードと CNAME レコードを割り当てるために、このドメインの DNS へのアクセスが必要です。
Pomerium Ingress Controllerのインストール
-
クラスタにPomeriumをインストールします。
kubectl apply -f https://raw.githubusercontent.com/pomerium/ingress-controller/main/deployment.yamlIdPの設定を含むシークレットを定義します。IdP固有の詳細は、PomeriumのIDプロバイダーページを参照してください。
apiVersion: v1kind: Secretmetadata:name: idpnamespace: pomeriumtype: OpaquestringData:client_id: ${IDP_PROVIDED_CLIENT_ID}client_secret: ${IDP_PROVIDED_CLIENT_SECRET}kubectl apply -f
を使用して、シークレットをクラスタに追加します。 -
Pomeriumのグローバル設定を定義します。
apiVersion: ingress.pomerium.io/v1kind: Pomeriummetadata:name: globalnamespace: pomeriumspec:secrets: pomerium/bootstrapauthenticate:url: https://authenticate.example.comidentityProvider:provider: ${YOUR_IdP}secret: pomerium/idp# certificates:# - pomerium/pomerium-proxy-tls${YOUR_IdP}
をあなたのIDプロバイダーに置き換えます。kubectl -f
で適用します。最後の2行はコメントアウトされています。これらは、後で作成するTLS証明書を参照しています。
cert-managerのインストール
cert-managerのドキュメントのインストールセクションに記載されている方法のいずれかを使用して、cert-managerをインストールします。最も簡単な方法は、提供されているマニフェストをダウンロードして適用することです。
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.1/cert-manager.yaml
Let's Encrypt発行者の設定
イングレスとインターネット間の通信には、Let's Encryptのような信頼できる認証機関によって署名された証明書を使用する必要があります。この例では、ステージング用と本番用の2つのLet's Encrypt発行者を作成します。
Let's Encrypt本番発行者には厳しいレート制限があります。設定が確定する前に、サービスを何度も再作成する必要があり、その制限に達することがあります。スタックを構築している間は、レート制限と設定または操作のエラーを混同しやすいです。
そのため、Let's Encryptステージング発行者から始めます。設定がほぼ完了したら、本番発行者に切り替えます。これらの発行者は両方とも、HTTP01
チャレンジプロバイダーを使用するように設定されています。
-
次のYAMLは、ステージング証明書発行者を定義しています。メールアドレスを自分のアドレスに更新する必要があります。
email
フィールドはLet's Encryptによって必須であり、証明書の期限切れと更新に関する通知に使用されます。apiVersion: cert-manager.io/v1kind: Issuermetadata:name: letsencrypt-stagingnamespace: pomeriumspec:acme:# The ACME server URLserver: https://acme-staging-v02.api.letsencrypt.org/directory# Email address used for ACME registrationemail: user@example.com# Name of a secret used to store the ACME account private keyprivateKeySecretRef:name: letsencrypt-staging# Enable the HTTP-01 challenge providersolvers:- http01:ingress:ingressClassName: pomeriumkubectl apply -f
を使用して例をダウンロードして編集し適用するか、カスタムリソースを1つのコマンドで編集して適用できます。kubectl create --edit -f https://raw.githubusercontent.com/cert-manager/website/master/content/docs/tutorials/acme/example/pomerium-staging-issuer.yaml -
本番発行者を作成してデプロイします。ステージング発行者と同様に、この例を自分のメールアドレスで更新してください。
apiVersion: cert-manager.io/v1kind: Issuermetadata:name: letsencrypt-prodnamespace: pomeriumspec:acme:# The ACME server URLserver: https://acme-v02.api.letsencrypt.org/directory# Email address used for ACME registrationemail: user@example.com# Name of a secret used to store the ACME account private keyprivateKeySecretRef:name: letsencrypt-prod# Enable the HTTP-01 challenge providersolvers:- http01:ingress:ingressClassName: pomeriumkubectl create --edit -f https://raw.githubusercontent.com/cert-manager/website/master/content/docs/tutorials/acme/example/pomerium-production-issuer.yaml -
発行者を作成した後は、そのステータスを確認できます。
kubectl describe issuer -n pomerium letsencrypt-stagingkubectl describe issuer -n pomerium letsencrypt-prod登録済みのアカウントとともに、発行者が一覧表示されているはずです。
-
Pomeriumプロキシサービスの証明書を定義します。これは、手動で定義する必要がある唯一の証明書です。
apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: pomerium-proxy-tlsnamespace: pomeriumspec:dnsNames:- 'authenticate.example.com'issuerRef:kind: Issuername: letsencrypt-stagingsecretName: pomerium-proxy-tlsdnsNames
の値をドメイン空間に合わせて調整します。サブドメイン(この例ではauthenticate
)は、IdPの設定でコールバックURLに使用されるドメインと一致する必要があります。kubectl -f
を使用して証明書を追加します。 -
新しく作成した証明書を参照するPomeriumグローバル設定の最後の2行のコメントを解除し、クラスタに再適用します。
これで、Pomeriumがクラスタにインストールされ、実行されているはずです。ブラウザでhttps://authenticate.example.com
にアクセスして確認できます。kubectl describe pomerium
を使用して、Pomeriumデプロイメントのステータスを確認し、最近のイベントを確認してください。
テストサービスの定義
新しいIngressコントローラーをテストするために、kuardアプリをクラスタに追加し、そのためのIngressを定義します。
-
kuardデプロイメントと関連サービスを定義します。
apiVersion: apps/v1kind: Deploymentmetadata:name: kuardspec:selector:matchLabels:app: kuardreplicas: 1template:metadata:labels:app: kuardspec:containers:- image: gcr.io/kuar-demo/kuard-amd64:1imagePullPolicy: Alwaysname: kuardports:- containerPort: 8080apiVersion: v1kind: Servicemetadata:name: kuardspec:ports:- port: 80targetPort: 8080protocol: TCPselector:app: kuardこれらのファイルをローカルにダウンロードして参照するか、このドキュメントのGitHubソースリポジトリから参照できます。
チュートリアルファイルからGitHubから直接サンプルサービスをインストールするには
kubectl apply -f https://raw.githubusercontent.com/cert-manager/website/master/content/docs/tutorials/acme/example/deployment.yamlkubectl apply -f https://raw.githubusercontent.com/cert-manager/website/master/content/docs/tutorials/acme/example/service.yaml -
テストサービス用の新しいIngressマニフェスト(
example-ingress.yaml
)を作成します。apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: kuardannotations:cert-manager.io/issuer: letsencrypt-stagingingress.pomerium.io/policy: '[{"allow":{"and":[{"domain":{"is":"example.com"}}]}}]'spec:ingressClassName: pomeriumrules:- host: kuard.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: kuardport:number: 80tls:- hosts:- kuard.example.comsecretName: kuard.example.com-tls同様に、
example.com
への参照を、あなたのドメイン空間に合わせて変更してください。 -
Ingressマニフェストをクラスタに適用します。
kubectl apply -f example-ingress.yaml
Pomerium Ingress Controllerは、letsencrypt-staging
発行者からkuard.example.com
へのルートの証明書を自動的にプロビジョニングします。
クラスタ内のすべてのアプリケーションサービスの設定が完了したら、イングレス(認証サービスを含む)の発行者をletsencrypt-prod
を使用するように調整します。