第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-system
namespace を作成します。oc create namespace istio-system
$ oc create namespace istio-system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、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"}]}}}'
$ oc -n cert-manager-operator patch subscription openshift-cert-manager-operator \ --type='merge' -p \ '{"spec":{"config":{"env":[{"name":"UNSUPPORTED_ADDON_FEATURES","value":"IstioCSR=true"}]}}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow istio-csr
エージェントのIssuer
オブジェクトを作成して、ルート認証局 (CA) 発行者を作成します。次のコマンドを実行して、
istio-csr
エージェントをインストールするための新しいプロジェクトを作成します。oc new-project istio-csr
$ oc new-project istio-csr
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例のような
Issuer
オブジェクトを作成します。注記selfSigned
発行者は、デモンストレーション、テスト、または概念実証環境を対象としています。実稼働環境でのデプロイメントでは、セキュアかつ信頼できる CA を使用します。issuer.yaml
ファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行してオブジェクトを作成します。
oc apply -f issuer.yaml
$ oc apply -f issuer.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
istio-ca
証明書に "Ready" というステータスの状態が含まれるまで待ちます。oc wait --for=condition=Ready certificates/istio-ca -n istio-system
$ oc wait --for=condition=Ready certificates/istio-ca -n istio-system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
IstioCSR
カスタムリソースを作成します。次の例のような
IstioCSR
カスタムリソースを作成します。istioCSR.yaml
ファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
istio-csr
エージェントを作成します。oc create -f istioCSR.yaml
$ oc create -f istioCSR.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
istio-csr
デプロイメントの準備ができていることを確認します。oc get deployment -n istio-csr
$ oc get deployment -n istio-csr
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
istio
リソースをインストールします。注記この設定により、Istio の組み込み CA サーバーが無効になり、証明書署名要求が
istiod
からistio-csr
エージェントに転送されます。istio-csr
エージェントは、cert-manager Operator からistiod
とメッシュワークロードの両方の証明書を取得します。istio-csr
エージェントによって生成されるistiod
TLS 証明書は、使用するために既知の場所の Pod にマウントされます。次の例のような
Istio
オブジェクトを作成します。istio.yaml
ファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して
Istio
リソースを作成します。oc apply -f istio.yaml
$ oc apply -f istio.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
istio
リソースに "Ready" ステータス条件が表示されていることを確認します。oc wait --for=condition=Ready istios/default -n istio-system
$ oc wait --for=condition=Ready istios/default -n istio-system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.1.2. istio-csr エージェントを使用して cert-manager Operator で Service Mesh を確認する リンクのコピーリンクがクリップボードにコピーされました!
サンプルの httpbin
サービスと sleep
アプリケーションを使用して、ワークロード間のトラフィックを検証できます。ワークロードプロキシー証明書をチェックして、cert-manager Operator が正しくインストールされていることを確認します。
namespace を作成します。
次のコマンドを実行して、
apps-1
namespace を作成します。oc new-project apps-1
$ oc new-project apps-1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
apps-2
namespace を作成します。oc new-project apps-2
$ oc new-project apps-2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
namespace に
istio-injection=enabled
ラベルを追加します。次のコマンドを実行して、
apps-1
namespace にistio-injection=enabled
ラベルを追加します。oc label namespaces apps-1 istio-injection=enabled
$ oc label namespaces apps-1 istio-injection=enabled
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
apps-2
namespace にistio-injection=enabled
ラベルを追加します。oc label namespaces apps-2 istio-injection=enabled
$ oc label namespaces apps-2 istio-injection=enabled
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
namespace に
httpbin
アプリケーションをデプロイします。次のコマンドを実行して、
apps-1
namespace にhttpbin
アプリケーションをデプロイします。oc apply -n apps-1 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/httpbin/httpbin.yaml
$ oc apply -n apps-1 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/httpbin/httpbin.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
apps-2
namespace にhttpbin
アプリケーションをデプロイします。oc apply -n apps-2 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/httpbin/httpbin.yaml
$ oc apply -n apps-2 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/httpbin/httpbin.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
namespace に
sleep
アプリケーションをデプロイします。次のコマンドを実行して、
apps-1
namespace にsleep
アプリケーションをデプロイします。oc apply -n apps-1 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/sleep/sleep.yaml
$ oc apply -n apps-1 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/sleep/sleep.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
apps-2
namespace にsleep
アプリケーションをデプロイします。oc apply -n apps-2 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/sleep/sleep.yaml
$ oc apply -n apps-2 -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/sleep/sleep.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
作成されたアプリケーションにサイドカーが挿入されていることを確認します。
次のコマンドを実行して、作成されたアプリケーションに
apps-1
namespace のサイドカーが挿入されていることを確認します。oc get pods -n apps-1
$ oc get pods -n apps-1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、作成されたアプリケーションに
apps-2
namespace のサイドカーが挿入されていることを確認します。oc get pods -n apps-2
$ oc get pods -n apps-2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次の例のような、メッシュ全体の厳格な相互 Transport Layer Security (mTLS) ポリシーを作成します。
注記厳密な mTLS モードで
PeerAuthentication
を有効にすると、証明書が正しく配布され、ワークロード間で mTLS 通信が機能することが確認されます。peer_auth.yaml
ファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、mTLS ポリシーを適用します。
oc apply -f peer_auth.yaml
$ oc apply -f peer_auth.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
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
$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
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
$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
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
$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
... Issuer: O = cert-manager + O = cluster.local, CN = istio-ca ... X509v3 Subject Alternative Name: URI:spiffe://cluster.local/ns/apps-1/sa/httpbin
... Issuer: O = cert-manager + O = cluster.local, CN = istio-ca ... X509v3 Subject Alternative Name: URI:spiffe://cluster.local/ns/apps-1/sa/httpbin
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 -n <istio-csr_project_name> delete istiocsrs.operator.openshift.io default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 関連するリソースを削除します。
次のコマンドを実行して、クラスタースコープのリソースをリスト表示します。
oc get clusterrolebindings,clusterroles -l "app=cert-manager-istio-csr,app.kubernetes.io/name=cert-manager-istio-csr"
$ oc get clusterrolebindings,clusterroles -l "app=cert-manager-istio-csr,app.kubernetes.io/name=cert-manager-istio-csr"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 後で参照できるように、リスト表示されたリソースの名前を保存します。
次のコマンドを実行して、
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>
$ 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>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 後で参照できるように、リスト表示されたリソースの名前を保存します。
次のコマンドを実行して、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 get roles,rolebindings \ -l "app=cert-manager-istio-csr,app.kubernetes.io/name=cert-manager-istio-csr" \ -n <istio_csr_project_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 後で参照できるように、リスト表示されたリソースの名前を保存します。
前の手順でリスト表示された各リソースに対して、次のコマンドを実行してリソースを削除します。
oc -n <istio_csr_project_name> delete <resource_type>/<resource_name>
$ oc -n <istio_csr_project_name> delete <resource_type>/<resource_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow