Oracle Cloud Infrastructure(OCI) Service Meshはインフラストラクチャ・レイヤーで、セキュリティ、トラフィック制御、およびオブザーバビリティ機能をアプリケーションに提供します。
OCI Service Meshを使用すると、クラウドネイティブ・アプリケーションの開発と運用が容易になります。

このチュートリアルでは、BookinfoアプリケーションをOracle Container Engine for Kubernetes(OKE)クラスターにデプロイします。
次に、OCI Service Meshをアプリケーションのデプロイメントに追加します。

前提条件

  • クラウド環境
    • Oracle Cloudのアカウントを取得済みであること

事前準備

まずは事前準備として以下を実施します。

  • 1.証明書サービスの構築
    • 1-1.証明書と認証局の作成
    • 1-2.コンパートメント・認証局・証明書のOCIDの取得
  • 2.動的グループとポリシーの作成
    • OCI Service Meshや証明書サービスに関連する動的グループとポリシーの作成
  • 3.Oracle Container Engine for Kubernetes(OKE)クラスターの構築
    • 3-1.OSOK(Oracle Service Operator for Kubernetes)のインストール
    • 3-2.メトリクス・サーバーのインストール

1.証明書サービスの構築

ここでは、OCI Service MeshでTLS(Transport Layer Security)通信を行うために必要な証明書と認証局を作成します。

1-1. 認証局と証明書の作成

証明書サービスの構築について、こちらを実施してください。

1-2.コンパートメント・認証局・証明書のOCIDの取得

ここでは、後続の手順で利用するためにコンパートメントOCIDと1-1. 認証局と証明書の作成で作成した証明書と認証局のOCIDの取得を行います。

まず、コンパートメントのOCIDを取得します。

OCIコンソール画面で左上のメニューを展開して、アイデンティティとセキュリティをクリックし、コンパートメントをクリックします。

コンパートメントのリストが表示されて、ご利用のコンパートメントをクリックします。

コンパートメントの詳細が表示されて、OCIDの右にある”コピー”をクリックして、コンパートメントのOCIDをメモしてください。

また、コンパートメント名をメモしてください。

compartment-ocid

次に、認証局のOCIDを取得します。

OCIコンソール画面で左上のメニューを展開して、アイデンティティとセキュリティをクリックし、認証局をクリックします。

認証局のリストが表示されて、事前準備で作成した認証局をクリックします。

認証局の詳細が表示されて、OCIDの右にある”コピー”をクリックして、認証局のOCIDをメモしてください。

authority-ocid

次に、証明書のOCIDを取得します。

OCIコンソール画面で左上のメニューを展開して、アイデンティティとセキュリティをクリックし、証明書をクリックします。

証明書のリストが表示されて、事前準備で作成した証明書をクリックします。

証明書の詳細が表示されて、OCIDの右にある”コピー”をクリックして、証明書のOCIDをメモしてください。

certificate-ocid

これで、コンパートメント・認証局・証明書のOCIDの取得は完了です。

2.動的グループとポリシーの作成

ここでは、OCI Service Meshに必要な動的グループとポリシーを作成していきます。

動的グループとポリシーについて
Oracle Cloud Infrastrctureには動的グループという考え方があります。
動的グループの詳細はこちらのページをご確認ください。
また、設定した動的グループは、ポリシーを利用することにより、OCI上のリソースやインスタンスを主体とした操作を実現できます。
ポリシーの詳細はこちらのページをご確認ください。

ポリシー設定について
このハンズオンでは、ご利用のコンパートメントに対しては管理者権限(to manage all-resources in compartment)がある前提としています。 トライアル環境の方は、管理者権限となっておりますので、特に意識する必要はありません。

OCIコンソール画面で左上のメニューを展開して、アイデンティティとセキュリティをクリックし、動的グループの作成をクリックします。

以下のように動的グループを作成します。

  • 名前:MeshDynamicGroup
  • 説明:MeshDynamicGroup
  • ルール1:
    ANY {instance.compartment.id = '<事前準備で取得したご利用のコンパートメントのOCID>'}
    ANY {resource.type='certificateauthority', resource.type='certificate'}
    

動的グループの意味はそれぞれ以下です。

動的グループ 説明
ANY {instance.compartment.id = ‘<事前準備で取得したご利用のコンパートメントのOCID>'} コンパートメント内の全てのインスタンスを意味するルール
ANY {resource.type=’certificateauthority’, resource.type=’certificate’} 証明書サービスを意味するルール

動的グループを作成したら、ポリシーを作成します。
OCIコンソール画面で左上のメニューを展開して、アイデンティティとセキュリティをクリックし、ポリシーをクリックします。

以下のようにポリシーを作成します。

  • 名前:MeshPolicy
  • 説明:MeshPolicy
  • ポリシー:
    Allow dynamic-group MeshDynamicGroup to use keys in compartment <ご利用のコンパートメント名>
    Allow dynamic-group MeshDynamicGroup to manage objects in compartment <ご利用のコンパートメント名>
    Allow dynamic-group MeshDynamicGroup to manage service-mesh-family in compartment <ご利用のコンパートメント名>
    Allow dynamic-group MeshDynamicGroup to read certificate-authority-family in compartment <ご利用のコンパートメント名>
    Allow dynamic-group MeshDynamicGroup to use certificate-authority-delegates in compartment <ご利用のコンパートメント名>
    Allow dynamic-group MeshDynamicGroup to manage leaf-certificate-family in compartment <ご利用のコンパートメント名>
    Allow dynamic-group MeshDynamicGroup to manage certificate-authority-associations in compartment <ご利用のコンパートメント名>
    Allow dynamic-group MeshDynamicGroup to manage certificate-associations in compartment <ご利用のコンパートメント名>
    Allow dynamic-group MeshDynamicGroup to manage cabundle-associations in compartment <ご利用のコンパートメント名>
    

ポリシーの意味はそれぞれ以下です。

ポリシー 説明
Allow dynamic-group MeshDynamicGroup to use keys in compartment <ご利用のコンパートメント名> 動的グループがコンパートメント内のOCI Vault Keyを利用するためのポリシー
Allow dynamic-group MeshDynamicGroup to manage objects in compartment <ご利用のコンパートメント名> 動的グループがコンパートメント内のオブジェクトストレージ内のデータを管理するためのポリシー
Allow dynamic-group MeshDynamicGroup to manage service-mesh-family in compartment <ご利用のコンパートメント名> 動的グループがOCI Service Meshを管理するためのポリシー
Allow dynamic-group MeshDynamicGroup to read certificate-authority-family in compartment <ご利用のコンパートメント名> 動的グループが証明書サービスの認証局を利用するためのポリシー
Allow dynamic-group MeshDynamicGroup to use certificate-authority-delegates in compartment <ご利用のコンパートメント名> 動的グループが証明書サービスの各認証局と証明書を利用するためのポリシー
Allow dynamic-group MeshDynamicGroup to manage leaf-certificate-family in compartment <ご利用のコンパートメント名> 動的グループが証明書サービスの各認証局と証明書を管理するためのポリシー
Allow dynamic-group MeshDynamicGroup to manage certificate-authority-associations in compartment <ご利用のコンパートメント名> 動的グループが証明書サービスの認証局アソシエーションを管理するためのポリシー
Allow dynamic-group MeshDynamicGroup to manage certificate-associations in compartment <ご利用のコンパートメント名> 動的グループが証明書サービスの証明書アソシエーションを管理するためのポリシー
Allow dynamic-group MeshDynamicGroup to manage cabundle-associations in compartment <ご利用のコンパートメント名> 動的グループが証明書サービスのバンドルアソシエーションを管理するためのポリシー

これで、動的グループとポリシーの作成は完了です。

3.OKEクラスターの構築

OKEクラスターの構築について、こちらを参考に実施してください。

3-1.OSOKのインストール

OCI Service Meshでは、Kubernetes OperatorとしてOSOK(Oracle Service Operator for Kubernetes)を利用します。

OSOKをインストールするためには、Operator SDKとオペレーター・ライフサイクル・マネージャ(OLM)のインストールが必要です。

Operator SDKとオペレーター・ライフサイクル・マネージャ(OLM)のインストールは、こちらを実施してください。(リンク先の実施手順は9-1のみで問題ありません)

Operator SDKとオペレーター・ライフサイクル・マネージャ(OLM)のインストールが完了したら、以下のコマンドを実行し、OSOK用のNamespaceを作成します。

kubectl create ns oci-service-operator-system

次にOSOKをインストールします。

operator-sdk run bundle iad.ocir.io/oracle/oci-service-operator-bundle:1.1.0 -n oci-service-operator-system --timeout 5m

以下のように出力され、OSOKがインストールされます。

INFO[0036] Successfully created registry pod: iad-ocir-io-oracle-oci-service-operator-bundle-X-X-X 
INFO[0036] Created CatalogSource: oci-service-operator-catalog 
INFO[0037] OperatorGroup "operator-sdk-og" created      
INFO[0037] Created Subscription: oci-service-operator-vX-X-X-sub 
INFO[0040] Approved InstallPlan install-tzk5f for the Subscription: oci-service-operator-vX-X-X-sub 
INFO[0040] Waiting for ClusterServiceVersion "oci-service-operator-system/oci-service-operator.vX.X.X" to reach 'Succeeded' phase 
INFO[0040]   Waiting for ClusterServiceVersion "oci-service-operator-system/oci-service-operator.vX.X.X" to appear 
INFO[0048]   Found ClusterServiceVersion "oci-service-operator-system/oci-service-operator.vX.X.X" phase: Pending 
INFO[0049]   Found ClusterServiceVersion "oci-service-operator-system/oci-service-operator.vX.X.X" phase: InstallReady 
INFO[0053]   Found ClusterServiceVersion "oci-service-operator-system/oci-service-operator.vX.X.X" phase: Installing 
INFO[0066]   Found ClusterServiceVersion "oci-service-operator-system/oci-service-operator.vX.X.X" phase: Succeeded 
INFO[0067] OLM has successfully installed "oci-service-operator.vX.X.X"

3-2.メトリクス・サーバーのインストール

OCI Service Meshでは、HPA(Horizontal Pod Autoscaler)を利用してIngress Gateway(後述)がスケールするので、メトリクス・サーバーをインストールしておきます。

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability.yaml

これで事前準備は完了です!

1.OCI Service Meshの構築

ここから、いよいよOCI Service Meshの構築に入っていきます。

全体としては以下のような手順になります。

  • 1.OCI Service Meshリソースの解説

  • 2.サンプルアプリケーションのデプロイ

  • 3.OCI Service Meshリソースの作成

  • 4.動作確認

1.OCI Service Meshリソースの解説

まずは、OCI Service Meshで利用するリソースから確認します。

次の図に示すように、OCI Service Meshは、マネージド・コントロール・プレーンから構成情報を受信する各マイクロサービスと共にプロキシをデプロイすることによって実装されます。
メッシュはプロキシを使用して、マイクロサービスに代わってIngressリクエストとOutboundリクエストを実行します。
この構成により、サービス・メッシュのセキュリティ、トラフィック制御、および監視機能が有効になります。イングレスゲートウェイ・リソースは、メッシュへの入力トラフィックを管理します。

service-mesh

次の図は、OCI Service MeshにデプロイされるBookinfoアプリケーション(このハンズオンでも利用します)をベースにした各リソースを示しています。

イングレストラフィックは、イングレスゲートウェイとイングレスゲートウェイのルート・テーブルを介して”Product Page”サービスにルーティングされます。
Reviewsサービスのさまざまなバージョンは、そのサービスの仮想デプロイメントを表します。アクセス・ポリシーは、サービス間通信のアクセス制御にセットアップされます。

service-mesh-deployment

次の図は、OCI Service Meshのリソース間の関係を定義します。/mesh-components

各リソースを簡単に説明します。

  • Mesh: サービス・メッシュ全体を表すリソース
  • Virtual Service: サービス・メッシュ内の仮想サービス
  • Virtual Deployment: Virtual Serviceに紐づける仮想デプロイメント
  • Virtual Service Route Table: Virtual Service内のトラフィック・ルール。IstioでいうDestination Ruleのような存在。
  • Ingress Gateway: メッシュ外からメッシュ内への通信を制御するGateway。IstioのIngress Gatewayとほぼ同じ。
  • Ingress Gateway Route Table: Ingress Gatewayのトラフィック・ルール。
  • Access Policy: Virtual Serviceに対するアクセス制御。

OCI Service Meshには他にもリソースがありますが、上の図は主なリソースだけピックアップしています。

OCI Service Meshのリソースの全体像をまとめておきます。
(図内にはこのハンズオンでは取り上げないコンポーネントも含まれていますが、そちらは中級編以降で取り上げます)

osm-overview

各種リソースを説明したところで、ここから、OCI Service Meshを構築していきます。

2.サンプルアプリケーション(Bookinfoアプリケーション)のデプロイ

今回はBookinfoアプリケーションを利用したService Mesh環境を構築していきます。

まず、最初にBookinfoアプリケーション用のNamespaceを作成します。

kubectl create namespace bookinfo

次に、bookinfo Namespaceに対して、OCI Service Meshを有効にするラベルを付与します。

kubectl label namespace bookinfo servicemesh.oci.oracle.com/sidecar-injection=enabled

Bookinfoアプリケーションをデプロイします。

kubectl apply -n bookinfo -f https://raw.githubusercontent.com/istio/istio/release-1.12/samples/bookinfo/platform/kube/bookinfo.yaml

これでサンプルアプリケーションのデプロイは完了です。

3.OCI Service Meshリソースの作成

次に、OCI Service Meshを構成するためのリソースを作っていきます。

なお、Manifestの中でアプリケーションのホスト名が定義されていますが、今回はservice-mesh.oracle.comとします。
後でhostsファイルを編集します。

OCI Service Meshのリソースを作成するためのManifestbookinfo_mesh.yamlを作成します。
以下の情報を環境関数として設定します。
これらの情報は1-2.コンパートメント・認証局・証明書のOCIDの取得で収集したものです。

  • YOUR_COMPARTMENT_OCID: 事前準備で取得したご利用のコンパートメントのOCIDに差し替えてください。
  • YOUR_CERTIFICATE_AUTHORITY_OCID: 事前準備で取得した認証局のOCIDに差し替えてください。
  • YOUR_CERTIFICATE_OCID: 事前準備で取得した証明書のOCIDに差し替えてください。
YOUR_COMPARTMENT_OCID=ocid1.compartment.oc1..xxxxxxxxxx
YOUR_CERTIFICATE_AUTHORITY_OCID=ocid1.certificateauthority.oc1.xxxxxxxxxx
YOUR_CERTIFICATE_OCID=ocid1.certificate.oc1.xxxxxxxxxx

bookinfo_mesh.yamlを作成します。

cat > bookinfo_mesh.yaml << EOF
---
kind: Mesh
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: bookinfo
  namespace: bookinfo
spec:
  compartmentId: $YOUR_COMPARTMENT_OCID
  certificateAuthorities:
    - id: $YOUR_CERTIFICATE_AUTHORITY_OCID
  mtls:
    minimum: PERMISSIVE
---
##################################################################################################
# Details service
##################################################################################################
kind: VirtualService
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: details
  namespace: bookinfo
spec:
  mesh:
    ref:
      name: bookinfo
  defaultRoutingPolicy:
    type: UNIFORM
  compartmentId: $YOUR_COMPARTMENT_OCID
  hosts:
    - details
    - details:9080
---
kind: VirtualDeployment
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: details-v1
  namespace: bookinfo
spec:
  virtualService:
    ref:
      name: details
  compartmentId: $YOUR_COMPARTMENT_OCID
  listener:
    - port: 9080
      protocol: HTTP
  accessLogging:
    isEnabled: true
  serviceDiscovery:
    type: DNS
    hostname: details
---
apiVersion: servicemesh.oci.oracle.com/v1beta1
kind: VirtualServiceRouteTable
metadata:
  name: details-route-table
  namespace: bookinfo
spec:
  compartmentId: $YOUR_COMPARTMENT_OCID
  virtualService:
    ref:
      name: details
  routeRules:
    - httpRoute:
        destinations:
          - virtualDeployment:
              ref:
                name: details-v1
            weight: 100
---
##################################################################################################
# Ratings service
##################################################################################################
kind: VirtualService
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: ratings
  namespace: bookinfo
spec:
  mesh:
    ref:
      name: bookinfo
  defaultRoutingPolicy:
    type: UNIFORM
  compartmentId: $YOUR_COMPARTMENT_OCID
  hosts:
    - ratings
    - ratings:9080
---
kind: VirtualDeployment
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: ratings-v1
  namespace: bookinfo
spec:
  virtualService:
    ref:
      name: ratings
  compartmentId: $YOUR_COMPARTMENT_OCID
  listener:
    - port: 9080
      protocol: HTTP
  accessLogging:
    isEnabled: true
  serviceDiscovery:
    type: DNS
    hostname: ratings
---
apiVersion: servicemesh.oci.oracle.com/v1beta1
kind: VirtualServiceRouteTable
metadata:
  name: ratings-route-table
  namespace: bookinfo
spec:
  compartmentId: $YOUR_COMPARTMENT_OCID
  virtualService:
    ref:
      name: ratings
  routeRules:
    - httpRoute:
        destinations:
          - virtualDeployment:
              ref:
                name: ratings-v1
            weight: 100
---
##################################################################################################
# Reviews service
##################################################################################################
kind: VirtualService
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: reviews
  namespace: bookinfo
spec:
  mesh:
    ref:
      name: bookinfo
  defaultRoutingPolicy:
    type: UNIFORM
  compartmentId: $YOUR_COMPARTMENT_OCID
  hosts:
    - reviews
    - reviews:9080
---
kind: VirtualDeployment
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: reviews-v1
  namespace: bookinfo
spec:
  virtualService:
    ref:
      name: reviews
  compartmentId: $YOUR_COMPARTMENT_OCID
  listener:
    - port: 9080
      protocol: HTTP
  accessLogging:
    isEnabled: true
  serviceDiscovery:
    type: DNS
    hostname: reviews
---
kind: VirtualDeployment
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: reviews-v2
  namespace: bookinfo
spec:
  virtualService:
    ref:
      name: reviews
  compartmentId: $YOUR_COMPARTMENT_OCID
  listener:
    - port: 9080
      protocol: HTTP
  accessLogging:
    isEnabled: true
  serviceDiscovery:
    type: DNS
    hostname: reviews
---
kind: VirtualDeployment
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: reviews-v3
  namespace: bookinfo
spec:
  virtualService:
    ref:
      name: reviews
  compartmentId: $YOUR_COMPARTMENT_OCID
  listener:
    - port: 9080
      protocol: HTTP
  accessLogging:
    isEnabled: true
  serviceDiscovery:
    type: DNS
    hostname: reviews
---
apiVersion: servicemesh.oci.oracle.com/v1beta1
kind: VirtualServiceRouteTable
metadata:
  name: reviews-route-table
  namespace: bookinfo
spec:
  compartmentId: $YOUR_COMPARTMENT_OCID
  virtualService:
    ref:
      name: reviews
  routeRules:
    - httpRoute:
        destinations:
          - virtualDeployment:
              ref:
                name: reviews-v1
            weight: 50
          - virtualDeployment:
              ref:
                name: reviews-v2
            weight: 25
          - virtualDeployment:
              ref:
                name: reviews-v2
            weight: 25
---
##################################################################################################
# Productpage services
##################################################################################################
kind: VirtualService
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: productpage
  namespace: bookinfo
spec:
  mesh:
    ref:
      name: bookinfo
  defaultRoutingPolicy:
    type: UNIFORM
  compartmentId: $YOUR_COMPARTMENT_OCID
  hosts:
    - productpage
    - productpage:9080
---
kind: VirtualDeployment
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: productpage
  namespace: bookinfo
spec:
  virtualService:
    ref:
      name: productpage
  compartmentId: $YOUR_COMPARTMENT_OCID
  listener:
    - port: 9080
      protocol: HTTP
  accessLogging:
    isEnabled: true
  serviceDiscovery:
    type: DNS
    hostname: productpage
---
apiVersion: servicemesh.oci.oracle.com/v1beta1
kind: VirtualServiceRouteTable
metadata:
  name: productpage-route-table
  namespace: bookinfo
spec:
  compartmentId: $YOUR_COMPARTMENT_OCID
  virtualService:
    ref:
      name: productpage
  routeRules:
    - httpRoute:
        destinations:
          - virtualDeployment:
              ref:
                name: productpage
            weight: 100
---
kind: IngressGateway
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: bookinfo-ingress-gateway
  namespace: bookinfo
spec:
  compartmentId: $YOUR_COMPARTMENT_OCID
  mesh:
    ref:
      name: bookinfo
  hosts:
    - name: bookinfoHost
      hostnames:
        - service-mesh.oracle.com
      listeners:
        - port: 9080
          protocol: HTTP
          tls:
            serverCertificate:
              ociTlsCertificate:
                certificateId: $YOUR_CERTIFICATE_OCID
            mode: TLS
  accessLogging:
    isEnabled: true
---
apiVersion: servicemesh.oci.oracle.com/v1beta1
kind: IngressGatewayRouteTable
metadata:
  name: bookinfo-ingress-gateway-route-table
  namespace: bookinfo
spec:
  compartmentId: $YOUR_COMPARTMENT_OCID
  ingressGateway:
    ref:
      name: bookinfo-ingress-gateway
  routeRules:
    - httpRoute:
        ingressGatewayHost:
          name: bookinfoHost
        destinations:
          - virtualService:
              ref:
                name: productpage
---
kind: AccessPolicy
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: bookinfo-policy
  namespace: bookinfo
spec:
  mesh:
    ref:
      name: bookinfo
  compartmentId: $YOUR_COMPARTMENT_OCID
  rules:
    - action: ALLOW
      source:
        virtualService:
          ref:
            name: productpage
      destination:
        virtualService:
          ref:
            name: details
    - action: ALLOW
      source:
        virtualService:
          ref:
            name: productpage
      destination:
        virtualService:
          ref:
            name: reviews
    - action: ALLOW
      source:
        virtualService:
          ref:
            name: reviews
      destination:
        virtualService:
          ref:
            name: ratings
    - action: ALLOW
      source:
        ingressGateway:
          ref:
            name: bookinfo-ingress-gateway
      destination:
        virtualService:
          ref:
            name: productpage
---
EOF

次に、上記Manifestで作成したVirtualDeploymentVirtual Serviceをバインドするためにbinding.yamlを作成します。

~Bindingという名称の1.OCI Service Meshリソースの解説で解説したリソースでは登場していないリソースが出てきますが、VirtualDeploymentVirtual Serviceを”バインド”するリソースというイメージを持って頂ければ問題ありません。

binding.yamlを作成します。

cat > binding.yaml << EOF
kind: VirtualDeploymentBinding
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: details-binding
  namespace: bookinfo
spec:
  virtualDeployment:
    ref:
      name: details-v1
      namespace: bookinfo
  target:
    service:
      ref:
        name: details
        namespace: bookinfo
---
kind: VirtualDeploymentBinding
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: ratings-v1-binding
  namespace: bookinfo
spec:
  virtualDeployment:
    ref:
      name: ratings-v1
      namespace: bookinfo
  target:
    service:
      ref:
        name: ratings
        namespace: bookinfo
      matchLabels:
        version: v1
---
kind: VirtualDeploymentBinding
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: reviews-v1-binding
  namespace: bookinfo
spec:
  virtualDeployment:
    ref:
      name: reviews-v1
      namespace: bookinfo
  target:
    service:
      ref:
        name: reviews
        namespace: bookinfo
      matchLabels:
        version: v1
---
kind: VirtualDeploymentBinding
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: reviews-v2-binding
  namespace: bookinfo
spec:
  virtualDeployment:
    ref:
      name: reviews-v2
      namespace: bookinfo
  target:
    service:
      ref:
        name: reviews
        namespace: bookinfo
      matchLabels:
        version: v2
---
kind: VirtualDeploymentBinding
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: reviews-v3-binding
  namespace: bookinfo
spec:
  virtualDeployment:
    ref:
      name: reviews-v3
      namespace: bookinfo
  target:
    service:
      ref:
        name: reviews
        namespace: bookinfo
      matchLabels:
        version: v3
---
kind: VirtualDeploymentBinding
apiVersion: servicemesh.oci.oracle.com/v1beta1
metadata:
  name: productpage-binding
  namespace: bookinfo
spec:
  virtualDeployment:
    ref:
      name: productpage
      namespace: bookinfo
  target:
    service:
      ref:
        name: productpage
        namespace: bookinfo
---
EOF

次に、イングレスゲートウェイリソースを作成するためのManifestであるservice.yamlを作成します。

ここでも、IngressGatewayDeploymentという名称の1.OCI Service Meshリソースの解説では解説していないリソースが登場しますが、Proxyのような存在だとイメージ頂ければ問題ありません。
(Istioをご存知の方はEnvoyにあたるものです)

service.yamlを作成します。

cat > service.yaml << EOF
apiVersion: servicemesh.oci.oracle.com/v1beta1
kind: IngressGatewayDeployment
metadata:
  name: bookinfo-ingress-gateway-deployment
  namespace: bookinfo
spec:
  ingressGateway:
    ref:
      name: bookinfo-ingress-gateway
      namespace: bookinfo
  deployment:
    autoscaling:
      minPods: 1
      maxPods: 1
  ports:
    - protocol: TCP
      port: 9080
      serviceport: 443
  service:
    type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
  name: bookinfo-ingress
  namespace: bookinfo
  annotations:
    service.beta.kubernetes.io/oci-load-balancer-shape: "flexible"
    service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "10"
    service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "100"
spec:
  ports:
    - port: 80
      targetPort: 9080
      name: http
    - port: 443
      targetPort: 9080
      name: https
  selector:
    servicemesh.oci.oracle.com/ingress-gateway-deployment: bookinfo-ingress-gateway-deployment
  type: LoadBalancer
EOF

それでは作成したManifestを順番に適用していきます。

kubectl apply -f bookinfo_mesh.yaml
kubectl apply -f binding.yaml
kubectl apply -f service.yaml

これで、OCI Service Meshの環境構築は完了です。

4.動作確認

最後に動作確認を行います。

Podが全て起動していることを確認します。

$ kubectl get pods -n bookinfo
NAME                                                              READY   STATUS    RESTARTS   AGE
bookinfo-ingress-gateway-deployment-deployment-595f7d5bc5-fqrbf   1/1     Running   0          23s
details-v1-586577784f-bp9dd                                       2/2     Running   0          4m41s
productpage-v1-589b848cc9-2zsw6                                   2/2     Running   0          4m38s
ratings-v1-679fc7b4f-stnk9                                        2/2     Running   0          4m30s
reviews-v1-7b76665ff9-2xvrh                                       2/2     Running   0          4m40s
reviews-v2-6b86c676d9-r2j6x                                       2/2     Running   0          4m39s
reviews-v3-b77c579-69pkq                                          2/2     Running   0          4m38s

アプリケーションにアクセスするにはイングレスゲートウェイ(実態はOCI LoadBalancerになります)を利用するので、以下のコマンドでIPアドレスを確認します。

$ kubectl get svc -n bookinfo
NAME                                          TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
bookinfo-ingress                              LoadBalancer   10.96.213.172   xxx.xxx.xxx.xxx 80:31700/TCP,443:31248/TCP   2m51s
bookinfo-ingress-gateway-deployment-service   ClusterIP      10.96.14.228    <none>          443/TCP                      2m51s
details                                       ClusterIP      10.96.174.202   <none>          9080/TCP                     13m
productpage                                   ClusterIP      10.96.222.216   <none>          9080/TCP                     13m
ratings                                       ClusterIP      10.96.120.160   <none>          9080/TCP                     13m
reviews                                       ClusterIP      10.96.22.199    <none>          9080/TCP                     13m

bookinfo-ingressに表示されるEXTERNAL-IP(xxx.xxx.xxx.xxx)がLoadBalancerのIPアドレスになります。

今回は、https://service-mesh.oracle.comでアクセスしたいので、ローカルのhostsファイルに以下の列を追記します。

xxx.xxx.xxx.xxx service-mesh.oracle.com

これでhttps://service-mesh.oracle.com/productpageにアクセスし、以下のような画面が表示されれば成功です!

bookinfo-product-page

また、OCIコンソール上から見るとOSOKを利用して各種リソースが作成されていることが確認できます。
OCIコンソールは、左上のメニューを展開して、開発者サービスをクリックし、サービス・メッシュをクリックします。

また、OCIコンソールからリソースを作成または変更すればOSOKがOKEクラスターに反映してくれます。

oci-service-mesh-bookinfo

これで、OCI Service Meshの構築は完了です。

Bookinfoアプリケーションの説明(オプション)

Bookinfoアプリケーションは、オープンソースのサービスメッシュプラットフォームであるIstioのプロジェクトの一部として配布されています。
オンライン書店の単一のカタログエントリと同様に、書籍に関する情報を表示します。
アプリケーションのページには、書籍の説明、書籍の詳細 (ISBN、ページ数など)、およびいくつかの書評が表示されます。

アプケーションの全体イメージは以下のようになります。

Bookinfo Application

次の4つの個別のマイクロサービスに分かれています。

  • productpage: detailsのマイクロサービスとreviewsのマイクロサービスを呼び出し、フロントエンドページを提供します。
  • details: 書籍情報を提供します。
  • reviews: 書評を提供します。また、ratingsのマイクロサービスも呼び出します。(以下を参照)
  • ratings: 書評に付随する評価(レートポイント)を提供します。

また、reviewsのマイクロサービスには3つのバージョンがあります。

  • バージョンv1では、ratingsは呼び出されません。
  • バージョンv2では、ratingsを呼び出し、各評価を1~5個の黒い星として表示します。
  • バージョンv3では、ratingsを呼び出し、各評価を1~5個の赤い星として表示します。

このアプリケーションは複数言語からされており、これらのサービスは特定のサービスメッシュプラットフォームに依存していません。

更新日時: