第5章 OpenShift Service Mesh と cert-manager
cert-manager ツールは、Kubernetes での X.509 証明書管理のソリューションです。Vault、Google Cloud Certificate Authority Service、Let’s Encrypt などのプロバイダーといった秘密鍵または公開鍵基盤 (PKI) とアプリケーションを統合するための統合 API を提供します。
cert-manager ツールは、証明書の有効期限が切れる前に、設定された時間に証明書の更新を試行することで、証明書が有効で最新であることを確認します。
Istio リソースを作成してインストールする前に、cert-manager ツールをインストールする必要があります。
5.1. cert-manager Operator istio-csr エージェントについて リンクのコピーリンクがクリップボードにコピーされました!
cert-manager Operator for Red Hat OpenShift と istio-csr の統合は、テクノロジープレビューのみの機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
cert-manager Operator for Red Hat OpenShift は、Red Hat OpenShift Service Mesh および Istio のワークロードとコントロールプレーンコンポーネントを保護するための証明書管理を強化します。cert-manager 発行者を通じて相互 Transport Layer Security (mTLS) に使用される証明書の発行、配信、および更新をサポートします。
Istio を cert-manager Operator によって管理される istio-csr エージェントと統合することで、Istio が証明書を直接要求および管理するように有効化されます。この統合により、セキュリティー設定が簡素化され、クラスター内の証明書管理が一元化されます。
Istio リソースを作成してインストールする前に、cert-manager Operator for Red Hat OpenShift をインストールする必要があります。
5.1.1. istio-csr エージェントを使用して Service Mesh と cert-manager Operator を統合する リンクのコピーリンクがクリップボードにコピーされました!
istio-csr エージェントをデプロイし、istio-csr エージェントを使用してワークロードとコントロールプレーンの証明書署名要求を処理する Istio リソースを設定することで、cert-manager Operator を OpenShift Service Mesh と統合できます。次の手順では、自己署名 issuer オブジェクトを作成します。
前提条件
- cert-manager Operator for Red Hat OpenShift バージョン 1.15.1 がインストールされている。
- OpenShift Container Platform 4.14 以降にログインしている。
- OpenShift Service Mesh Operator がインストールされている。
-
クラスター内で
IstioCNIインスタンスが実行されている。 -
istioctlコマンドがインストールされている。
手順
次のコマンドを実行して、
istio-systemnamespace を作成します。$ oc create namespace istio-system次のコマンドを実行して、cert-manager Operator にパッチを適用し、
istio-csrエージェントをインストールします。$ oc -n cert-manager-operator patch subscription openshift-cert-manager-operator \ --type='merge' -p \ '{"spec":{"config":{"env":[{"name":"UNSUPPORTED_ADDON_FEATURES","value":"IstioCSR=true"}]}}}'istio-csrエージェントのIssuerオブジェクトを作成して、ルート認証局 (CA) 発行者を作成します。次のコマンドを実行して、
istio-csrエージェントをインストールするための新しいプロジェクトを作成します。$ oc new-project istio-csr次の例のような
Issuerオブジェクトを作成します。注記selfSigned発行者は、デモンストレーション、テスト、または概念実証環境を対象としています。実稼働環境でのデプロイメントでは、セキュアかつ信頼できる CA を使用します。issuer.yamlファイルの例apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: selfsigned namespace: istio-system spec: selfSigned: {} --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: istio-ca namespace: istio-system spec: isCA: true duration: 87600h secretName: istio-ca commonName: istio-ca privateKey: algorithm: ECDSA size: 256 subject: organizations: - cluster.local - cert-manager issuerRef: name: selfsigned kind: Issuer group: cert-manager.io --- apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: istio-ca namespace: istio-system spec: ca: secretName: istio-ca次のコマンドを実行してオブジェクトを作成します。
$ oc apply -f issuer.yaml次のコマンドを実行して、
istio-ca証明書に "Ready" というステータスの状態が含まれるまで待ちます。$ oc wait --for=condition=Ready certificates/istio-ca -n istio-system
IstioCSRカスタムリソースを作成します。次の例のような
IstioCSRカスタムリソースを作成します。istioCSR.yamlファイルの例apiVersion: operator.openshift.io/v1alpha1 kind: IstioCSR metadata: name: default namespace: istio-csr spec: istioCSRConfig: certManager: issuerRef: name: istio-ca kind: Issuer group: cert-manager.io istiodTLSConfig: trustDomain: cluster.local istio: namespace: istio-system次のコマンドを実行して、
istio-csrエージェントを作成します。$ oc create -f istioCSR.yaml次のコマンドを実行して、
istio-csrデプロイメントの準備ができていることを確認します。$ oc get deployment -n istio-csr
istioリソースをインストールします。注記この設定により、Istio の組み込み CA サーバーが無効になり、証明書署名要求が
istiodからistio-csrエージェントに転送されます。istio-csrエージェントは、cert-manager Operator からistiodとメッシュワークロードの両方の証明書を取得します。istio-csrエージェントによって生成されるistiodTLS 証明書は、使用するために既知の場所の Pod にマウントされます。次の例のような
Istioオブジェクトを作成します。istio.yamlファイルの例apiVersion: sailoperator.io/v1 kind: Istio metadata: name: default spec: version: v1.24-latest namespace: istio-system values: global: caAddress: cert-manager-istio-csr.istio-csr.svc:443 pilot: env: ENABLE_CA_SERVER: "false"次のコマンドを実行して
Istioリソースを作成します。$ oc apply -f istio.yaml次のコマンドを実行して、
istioリソースに "Ready" ステータス条件が表示されていることを確認します。$ oc wait --for=condition=Ready istios/default -n istio-system
5.1.2. istio-csr エージェントを使用して cert-manager Operator で Service Mesh を確認する リンクのコピーリンクがクリップボードにコピーされました!
サンプルの httpbin サービスと sleep アプリケーションを使用して、ワークロード間のトラフィックを検証できます。ワークロードプロキシー証明書をチェックして、cert-manager Operator が正しくインストールされていることを確認します。
namespace を作成します。
次のコマンドを実行して、
apps-1namespace を作成します。$ oc new-project apps-1次のコマンドを実行して、
apps-2namespace を作成します。$ oc new-project apps-2
namespace に
istio-injection=enabledラベルを追加します。次のコマンドを実行して、
apps-1namespace にistio-injection=enabledラベルを追加します。$ oc label namespaces apps-1 istio-injection=enabled次のコマンドを実行して、
apps-2namespace にistio-injection=enabledラベルを追加します。$ oc label namespaces apps-2 istio-injection=enabled
namespace に
httpbinアプリケーションをデプロイします。次のコマンドを実行して、
apps-1namespace にhttpbinアプリケーションをデプロイします。$ oc apply -n apps-1 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/httpbin/httpbin.yaml次のコマンドを実行して、
apps-2namespace にhttpbinアプリケーションをデプロイします。$ oc apply -n apps-2 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/httpbin/httpbin.yaml
namespace に
sleepアプリケーションをデプロイします。次のコマンドを実行して、
apps-1namespace にsleepアプリケーションをデプロイします。$ oc apply -n apps-1 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/sleep/sleep.yaml次のコマンドを実行して、
apps-2namespace にsleepアプリケーションをデプロイします。$ oc apply -n apps-2 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/sleep/sleep.yaml
作成されたアプリケーションにサイドカーが注入されていることを確認します。
次のコマンドを実行して、作成されたアプリケーションに
apps-1namespace のサイドカーが注入されていることを確認します。$ oc get pods -n apps-1次のコマンドを実行して、作成されたアプリケーションに
apps-2namespace のサイドカーが注入されていることを確認します。$ oc get pods -n apps-2
次の例のような、メッシュ全体の厳格な相互 Transport Layer Security (mTLS) ポリシーを作成します。
注記厳密な mTLS モードで
PeerAuthenticationを有効にすると、証明書が正しく配布され、ワークロード間で mTLS 通信が機能することが確認されます。peer_auth.yamlファイルの例apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: default namespace: istio-system spec: mtls: mode: STRICT次のコマンドを実行して、mTLS ポリシーを適用します。
$ oc apply -f peer_auth.yaml次のコマンドを実行して、
apps-1/sleepアプリケーションがapps-2/httpbinサービスにアクセスできることを確認します。$ oc -n apps-1 exec "$(oc -n apps-1 get pod \ -l app=sleep -o jsonpath={.items..metadata.name})" \ -c sleep -- curl -sIL http://httpbin.apps-2.svc.cluster.local:8000出力例
HTTP/1.1 200 OK access-control-allow-credentials: true access-control-allow-origin: * content-security-policy: default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' camo.githubusercontent.com content-type: text/html; charset=utf-8 date: Wed, 18 Jun 2025 09:20:55 GMT x-envoy-upstream-service-time: 14 server: envoy transfer-encoding: chunked次のコマンドを実行して、
apps-2/sleepアプリケーションがapps-1/httpbinサービスにアクセスできることを確認します。$ oc -n apps-2 exec "$(oc -n apps-1 get pod \ -l app=sleep -o jsonpath={.items..metadata.name})" \ -c sleep -- curl -sIL http://httpbin.apps-2.svc.cluster.local:8000出力例
HTTP/1.1 200 OK access-control-allow-credentials: true access-control-allow-origin: * content-security-policy: default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' camo.githubusercontent.com content-type: text/html; charset=utf-8 date: Wed, 18 Jun 2025 09:21:23 GMT x-envoy-upstream-service-time: 16 server: envoy transfer-encoding: chunked次のコマンドを実行して、
httpbinワークロード証明書が期待どおりに一致することを確認します。$ istioctl proxy-config secret -n apps-1 \ $(oc get pods -n apps-1 -o jsonpath='{.items..metadata.name}' --selector app=httpbin) \ -o json | jq -r '.dynamicActiveSecrets[0].secret.tlsCertificate.certificateChain.inlineBytes' \ | base64 --decode | openssl x509 -text -noout出力例
... Issuer: O = cert-manager + O = cluster.local, CN = istio-ca ... X509v3 Subject Alternative Name: URI:spiffe://cluster.local/ns/apps-1/sa/httpbin
5.1.3. istio-csr エージェントを使用して cert-manager Operator で Service Mesh をアンインストールする リンクのコピーリンクがクリップボードにコピーされました!
以下の手順を実行すると、OpenShift Service Mesh で cert-manager Operator をアンインストールできます。以下のリソースを削除する前に、Red Hat OpenShift Service Mesh または Istio コンポーネントが Istio-CSR エージェントまたはそれが発行した証明書を参照していないことを確認してください。これらのリソースを使用中に削除すると、メッシュの機能が中断される可能性があります。
手順
次のコマンドを実行して、
IstioCSRカスタムリソースを削除します。$ oc -n <istio-csr_project_name> delete istiocsrs.operator.openshift.io default関連するリソースを削除します。
次のコマンドを実行して、クラスタースコープのリソースをリスト表示します。
$ oc get clusterrolebindings,clusterroles -l "app=cert-manager-istio-csr,app.kubernetes.io/name=cert-manager-istio-csr"後で参照できるように、リスト表示されたリソースの名前を保存します。
次のコマンドを実行して、
istio-csrエージェントがデプロイされている namespace 内のリソースをリスト表示します。$ oc get certificate,deployments,services,serviceaccounts -l "app=cert-manager-istio-csr,app.kubernetes.io/name=cert-manager-istio-csr" -n <istio_csr_project_name>後で参照できるように、リスト表示されたリソースの名前を保存します。
次のコマンドを実行して、Red Hat OpenShift Service Mesh または Istio でデプロイされている namespace 内のリソースをリスト表示します。
$ oc get roles,rolebindings \ -l "app=cert-manager-istio-csr,app.kubernetes.io/name=cert-manager-istio-csr" \ -n <istio_csr_project_name>後で参照できるように、リスト表示されたリソースの名前を保存します。
前の手順でリスト表示された各リソースに対して、次のコマンドを実行してリソースを削除します。
$ oc -n <istio_csr_project_name> delete <resource_type>/<resource_name>