5 インスタンスのプロビジョニング

この項では、Blockchain Platform Managerを使用してOracle Blockchain Platformインスタンスをプロビジョニングする方法について説明します。

Oracle Blockchain Platformインスタンスを作成する前に

Oracle Blockchain Platformをプロビジョニングする前に、開発者またはエンタープライズ・インスタンスがニーズを満たしているかどうかを判断します。

使用するプロビジョニング・シェイプの決定

インスタンスをプロビジョニングする際に、2つの構成から選択します。これらのオプション間の移行は現在サポートされていません。

構成 機能
開発者

このスタータ・シェイプは、開発および評価に使用することをお薦めします。

  • 1つのFabric-CAノード
  • 3ノード Fabric Ordering Service Network
  • インスタンス・メタデータの1ノード・リポジトリ
  • 動的に管理されるチェーンコード実行コンテナ
  • 操作Webユーザー・インタフェース用のコンソール・サービス
  • RESTful APIのRESTプロキシ・サービス
  • 認証およびロール管理のためのLDAPサーバー統合
エンタープライズ

各サービスのレプリカ数が多い高可用性インスタンス構成。

  • 3つのFabric-CAノード
  • 3ノード Fabric Ordering Service Network
  • インスタンス・メタデータの高可用性のための3ノードのクラスタ・リポジトリ
  • 動的に管理されるチェーンコード実行コンテナ
  • 操作Webユーザー・インタフェース用のコンソール・サービス
  • RESTful API用のRESTプロキシ・サービス用の複数のレプリカ
  • 認証およびロール管理のためのLDAPサーバー統合

Blockchain Platform Managerを使用したインスタンスのプロビジョニング

Blockchain Platform Managerでブロックチェーン・ファウンダまたは参加者インスタンスを作成するには、新規インスタンスの作成ウィザードを使用します。

プロビジョニングできるOracle Blockchain Platformインスタンスには、2つのタイプがあります:
  • ファウンダ組織: 参加者が後で参加できる新しいネットワークを含む、完全なブロックチェーン環境。

  • 参加者インスタンス: 参加するファウンダ組織がすでに存在する場合は、資格証明によってネットワークへのアクセス権が付与されていれば、参加者インスタンスを作成できます。参加者は単独では機能できないことに注意してください。

  1. Blockchain Platform Managerで、インスタンス・ページを開きます。
  2. インスタンスの作成を選択します。
  3. 次のフィールドを指定します。
    フィールド 説明
    インスタンス名

    Oracle Blockchain Platformインスタンスの名前を入力します。

    サービス・インスタンス名:

    • 1つ以上の文字を含める必要があります。
    • 15文字より長くすることはできません。
    • ASCII文字(aからz)で始める必要があります。
    • ASCII文字または数字のみ使用できます。
    • ハイフンは使用できません。
    • その他の特殊文字は使用できません。
    • アイデンティティ・ドメイン内で一意である必要があります。
    説明

    オプションです。

    Oracle Blockchain Platformインスタンスの簡単な説明を入力します。

    ドメイン名

    クラスタのドメイン名を入力します。

    ブロックチェーン・インスタンス・サービスに対して生成されるホスト名は、ドメイン名とインスタンス名をそれぞれ親ドメインおよびサブドメインとして使用します。

    ロール

    ファウンダは、完全なブロックチェーン環境を作成する場合に選択します。このインスタンスはファウンダ組織になるので、後で新しい参加者をネットワークに組み込むことができます。

    参加者は、このインスタンスを使用する前に別の場所で作成された既存のブロックチェーン・ネットワークに参加するインスタンスを作成する場合に選択します。

    構成
    デプロイメントのニーズを満たすプロビジョニング・シェイプを選択します:
    • 開発者
    • エンタープライズ
    同僚

    このサービス・インスタンスに初期作成されるピア・ノードの数を指定します。後で、Oracle Blockchain Platformコンソールで追加のピア・ノードを作成できます。

  4. 「インスタンスの作成」をクリックします。

プロビジョニングの前提条件

Oracle Blockchain Platformサービス・コンソールにアクセスする前に、ブロックチェーン・プラットフォーム・マネージャのホスト名に対して以前に行ったものと同様に、ブロックチェーン・インスタンス・サービスのホスト名解決を構成します。次のコマンドを使用して、作成されたブロックチェーン・インスタンスのホスト名のリストを取得します:
kubectl get virtualservice -n <instance-namespace> -o json | jq -r
      .items[].spec.hosts[0]
Oracle Blockchain Platformサービス・コンソールにアクセスする前に、Blockchain Platform Managerのホスト名に対して前に行ったのと同じように、ブロックチェーン・インスタンス・サービスのホスト名解決を構成します。次のコマンドを使用して、作成されたブロックチェーン・インスタンスのホスト名のリストを取得します:
kubectl get virtualservice -n <instance-namespace> -o json | jq -r
      .items[].spec.hosts[0]

Oracle Blockchain Platform Enterprise Editionインスタンスを作成した後、コンポーネントのパブリック・ホスト名をOpenShiftローカル・ネットワークから解決できるようにDNSを構成する必要があります。

インスタンスを作成すると、インスタンス名と親ドメインがOracle Blockchain Platform Enterprise Editionコンポーネントのサブドメインとして使用されます。DNSリクエストが、公開されたサービスが解決されるカスタムDNSポッドに転送されるように、OpenShiftのデフォルトのDNS構成でDNS転送を設定する必要があります。次のステップを実行して、DNS転送を構成します。
  1. 次のコマンドを実行します
    oc new-project obp-coredns
  2. 次のコマンドを実行して、カスタムcorednsサーバーをobp-corednsネームスペースにデプロイします。
    kubectl apply -f <coredns-deployment-yaml-file>
    次のマニフェストファイルをコマンドとともに使用します。
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns
      namespace: obp-coredns
    data:
      Corefile: |-
        .:1053 {
          errors
          health {
            lameduck 5s
          }
          ready
          kubernetes cluster.local in-addr.arpa ip6.arpa {
            pods insecure
            fallthrough in-addr.arpa ip6.arpa
          }
          prometheus :9153
          forward . /etc/resolv.conf
          cache 30
          loop
          reload
          loadbalance
        }
        import custom/*.server
     
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: obp-coredns
      name: obp-coredns
      namespace: obp-coredns
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: obp-coredns
      strategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: obp-coredns
        spec:
          containers:
          - args:
            - -conf
            - /etc/coredns/Corefile
            image: docker.io/coredns/coredns:latest
            imagePullPolicy: IfNotPresent
            livenessProbe:
              failureThreshold: 5
              httpGet:
                path: /health
                port: 8080
                scheme: HTTP
              initialDelaySeconds: 60
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 5
            name: coredns
            ports:
            - containerPort: 1053
              name: dns
              protocol: UDP
            - containerPort: 1053
              name: dns-tcp
              protocol: TCP
            - containerPort: 9153
              name: metrics
              protocol: TCP
            readinessProbe:
              failureThreshold: 3
              httpGet:
                path: /ready
                port: 8181
                scheme: HTTP
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
            resources:
              limits:
                memory: 170Mi
              requests:
                cpu: 100m
                memory: 70Mi
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                add:
                - NET_BIND_SERVICE
                drop:
                - all
              readOnlyRootFilesystem: true
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:
            - mountPath: /etc/coredns
              name: config-volume
              readOnly: true
            - mountPath: /etc/coredns/custom
              name: custom-config-volume
              readOnly: true
          dnsPolicy: Default
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          serviceAccount: obp-coredns
          serviceAccountName: obp-coredns
          terminationGracePeriodSeconds: 30
          volumes:
          - configMap:
              defaultMode: 420
              items:
              - key: Corefile
                path: Corefile
              name: coredns
            name: config-volume
          - configMap:
              defaultMode: 420
              name: coredns-custom
              optional: true
            name: custom-config-volume
     
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: obp-coredns
      name: obp-coredns
      namespace: obp-coredns
    spec:
      ports:
      - name: dns
        port: 53
        protocol: UDP
        targetPort: 1053
      - name: dns-tcp
        port: 53
        protocol: TCP
        targetPort: 1053
      - name: metrics
        port: 9153
        protocol: TCP
        targetPort: 9153
      selector:
        app: obp-coredns
      sessionAffinity: None
      type: ClusterIP
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: obp-coredns
      namespace: obp-coredns
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: obp-coredns
    rules:
    - apiGroups:
      - ""
      resources:
      - endpoints
      - services
      - pods
      - namespaces
      verbs:
      - list
      - watch
    - apiGroups:
      - ""
      resources:
      - nodes
      verbs:
      - get
    - apiGroups:
      - discovery.k8s.io
      resources:
      - endpointslices
      verbs:
      - list
      - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: obp-coredns
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: obp-coredns
    subjects:
    - kind: ServiceAccount
      name: obp-coredns
      namespace: obp-coredns
    
  3. ブロックチェーン・インスタンスのYAML形式でcoredns-custom-configmapファイルを作成します。
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: obp-coredns
    data:
      obp.server: |2
     
        <instanceName>.<domain>:1053 {
            log
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods insecure
                fallthrough in-addr.arpa ip6.arpa
            }
            rewrite stop {
                name regex (.*)\.<instanceName>\.<domain>\.com istio-ingressgateway.istio-system.svc.cluster.local answer auto
            }
            forward . /etc/resolv.conf
        }
    
    前述の例では、<instanceName>はインスタンスの名前、<domain>はインスタンスの作成時に渡されるドメインです。
  4. 次のコマンドを実行して、カスタムConfigMapオブジェクトを適用します。
    kubectl apply -f <coredns-custom-configmap-yaml-file>
  5. 次のコマンドを実行して、クラスタのIPアドレスを取得します。その IP アドレスを記録します。
    kubectl get svc -n obp-coredns
  6. 次のコマンドを実行して、OpenShift DNSカスタム・リソースを編集します。
    kubectl edit dnses.operator/default
  7. 次の例に示すように、DNSカスタム・リソースのzonesセクションを更新して、インスタンス名とドメイン名を使用します。
    ## Add the following section to the dns custom resource under spec
      servers:
      - forwardPlugin:
          policy: Random
          upstreams:
          - 192.0.2.233
        name: obp-server
        zones:
        - <instanceName>.<domain>
    前述の例では、<instanceName>はインスタンスの名前、<domain>は親ドメインです。
  8. 新しいインスタンスを追加するには、次の例に示すように、coredns-custom-configmapファイルにエントリを追加し、新しいインスタンスのドメインのOpenShift DNSカスタム・リソースを更新します。
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: obp-coredns
    data:
      obp.server: |2
     
        myobp.example.com:1053 {
            log
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods insecure
                fallthrough in-addr.arpa ip6.arpa
            }
            rewrite stop {
                name regex (.*)\.myobp\.example\.com istio-ingressgateway.istio-system.svc.cluster.local answer auto
            }
            forward . /etc/resolv.conf
        }
     
        otherobp.example.org:1053 {
            log
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods insecure
                fallthrough in-addr.arpa ip6.arpa
            }
            rewrite stop {
                name regex (.*)\.otherobp\.example\.org istio-ingressgateway.istio-system.svc.cluster.local answer auto
            }
            forward . /etc/resolv.conf
        }
    
    
    
    ## Edit the Openshift's DNS custom resource
    kubectl edit dnses.operator/default
     
    ## Add the new instance domain to the existing .spec.servers.zones
      servers:
      - forwardPlugin:
          policy: Random
          upstreams:
          - 192.0.2.233
        name: obp-server
        zones:
        - myobp.example.com
        - otherobp.example.org
    Blockchain Platform Manager for DNSの変更を有効にするには、Blockchain Platformインスタンスを停止して再起動する必要があります。

DNS の構成

Oracle Blockchain Platform Enterprise Editionインスタンスを作成した後、コンポーネントのパブリック・ホスト名をOpenShiftローカル・ネットワークから解決できるようにDNSを構成する必要があります。

インスタンスを作成すると、インスタンス名と親ドメインがOracle Blockchain Platform Enterprise Editionコンポーネントのサブドメインとして使用されます。DNSリクエストが、公開されたサービスが解決されるカスタムDNSポッドに転送されるように、OpenShiftのデフォルトのDNS構成でDNS転送を設定する必要があります。次のステップを実行して、DNS転送を構成します。
  1. 次のコマンドを実行します
    oc new-project obp-coredns
  2. 次のコマンドを実行して、カスタムcorednsサーバーをobp-corednsネームスペースにデプロイします。
    kubectl apply -f <coredns-deployment-yaml-file>
    次のマニフェストファイルをコマンドとともに使用します。
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns
      namespace: obp-coredns
    data:
      Corefile: |-
        .:1053 {
          errors
          health {
            lameduck 5s
          }
          ready
          kubernetes cluster.local in-addr.arpa ip6.arpa {
            pods insecure
            fallthrough in-addr.arpa ip6.arpa
          }
          prometheus :9153
          forward . /etc/resolv.conf
          cache 30
          loop
          reload
          loadbalance
        }
        import custom/*.server
     
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: obp-coredns
      name: obp-coredns
      namespace: obp-coredns
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: obp-coredns
      strategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: obp-coredns
        spec:
          containers:
          - args:
            - -conf
            - /etc/coredns/Corefile
            image: docker.io/coredns/coredns:latest
            imagePullPolicy: IfNotPresent
            livenessProbe:
              failureThreshold: 5
              httpGet:
                path: /health
                port: 8080
                scheme: HTTP
              initialDelaySeconds: 60
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 5
            name: coredns
            ports:
            - containerPort: 1053
              name: dns
              protocol: UDP
            - containerPort: 1053
              name: dns-tcp
              protocol: TCP
            - containerPort: 9153
              name: metrics
              protocol: TCP
            readinessProbe:
              failureThreshold: 3
              httpGet:
                path: /ready
                port: 8181
                scheme: HTTP
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
            resources:
              limits:
                memory: 170Mi
              requests:
                cpu: 100m
                memory: 70Mi
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                add:
                - NET_BIND_SERVICE
                drop:
                - all
              readOnlyRootFilesystem: true
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:
            - mountPath: /etc/coredns
              name: config-volume
              readOnly: true
            - mountPath: /etc/coredns/custom
              name: custom-config-volume
              readOnly: true
          dnsPolicy: Default
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          serviceAccount: obp-coredns
          serviceAccountName: obp-coredns
          terminationGracePeriodSeconds: 30
          volumes:
          - configMap:
              defaultMode: 420
              items:
              - key: Corefile
                path: Corefile
              name: coredns
            name: config-volume
          - configMap:
              defaultMode: 420
              name: coredns-custom
              optional: true
            name: custom-config-volume
     
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: obp-coredns
      name: obp-coredns
      namespace: obp-coredns
    spec:
      ports:
      - name: dns
        port: 53
        protocol: UDP
        targetPort: 1053
      - name: dns-tcp
        port: 53
        protocol: TCP
        targetPort: 1053  
      - name: metrics
        port: 9153
        protocol: TCP
        targetPort: 9153
      selector:
        app: obp-coredns
      sessionAffinity: None
      type: ClusterIP
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: obp-coredns
      namespace: obp-coredns
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: obp-coredns
    rules:
    - apiGroups:
      - ""
      resources:
      - endpoints
      - services
      - pods
      - namespaces
      verbs:
      - list
      - watch
    - apiGroups:
      - ""
      resources:
      - nodes
      verbs:
      - get
    - apiGroups:
      - discovery.k8s.io
      resources:
      - endpointslices
      verbs:
      - list
      - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: obp-coredns
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: obp-coredns
    subjects:
    - kind: ServiceAccount
      name: obp-coredns
      namespace: obp-coredns
    
  3. ブロックチェーン・インスタンスのYAML形式でcoredns-custom-configmapファイルを作成します。
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: obp-coredns
    data:
      obp.server: |2
     
        <instanceName>.<domain>:1053 {
            log
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods insecure
                fallthrough in-addr.arpa ip6.arpa
            }
            rewrite stop {
                name regex (.*)\.<instanceName>\.<domain>\ istio-ingressgateway.istio-system.svc.cluster.local answer auto
            }
            forward . /etc/resolv.conf
        }
    
    前述の例では、<instanceName>はインスタンスの名前、<domain>は親ドメインです。
  4. 次のコマンドを実行して、カスタムのConfigMapオブジェクトを適用します。
    kubectl apply -f <coredns-custom-configmap-yaml-file>
  5. 次のコマンドを実行して、クラスタのIPアドレスを取得します。その IP アドレスを記録します。
    kubectl get svc -n obp-coredns
  6. 次のコマンドを実行して、OpenShift DNSカスタム・リソースを編集します。
    kubectl edit dnses.operator/default
  7. 次の例に示すように、DNSカスタム・リソースのzonesセクションを更新して、インスタンス名とドメイン名を使用します。
    ## Add the following section to the dns custom resource under spec
      servers:
      - forwardPlugin:
          policy: Random
          upstreams:
          - 192.0.2.233
        name: obp-server
        zones:
        - <instanceName>.<domain>
    前述の例では、<instanceName>はインスタンスの名前、<domain>は親ドメインです。
  8. 新しいインスタンスを追加するには、次の例に示すように、coredns-custom-configmapファイルにエントリを追加し、新しいインスタンスのドメインのOpenShift DNSカスタム・リソースを更新します。
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: obp-coredns
    data:
      obp.server: |2
     
        myobp.example.com:1053 {
            log
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods insecure
                fallthrough in-addr.arpa ip6.arpa
            }
            rewrite stop {
                name regex (.*)\.myobp\.example\.com istio-ingressgateway.istio-system.svc.cluster.local answer auto
            }
            forward . /etc/resolv.conf
        }
     
        otherobp.example.org:1053 {
            log
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods insecure
                fallthrough in-addr.arpa ip6.arpa
            }
            rewrite stop {
                name regex (.*)\.otherobp\.example\.org istio-ingressgateway.istio-system.svc.cluster.local answer auto
            }
            forward . /etc/resolv.conf
        }
    
    
    
    ## Edit the Openshift's DNS custom resource
    kubectl edit dnses.operator/default
     
    ## Add the new instance domain to the existing .spec.servers.zones
      servers:
      - forwardPlugin:
          policy: Random
          upstreams:
          - 192.0.2.233
        name: obp-server
        zones:
        - myobp.example.com
        - otherobp.example.org
    DNSの変更を有効にするには、インスタンスを停止して再起動する必要があります。
Oracle Blockchain Platformサービス・コンソールにアクセスする前に、Blockchain Platform Managerのホスト名に対して前に行ったのと同じように、ブロックチェーン・インスタンス・サービスのホスト名解決を構成します。次のコマンドを使用して、作成されたブロックチェーン・インスタンスのホスト名のリストを取得します:
kubectl get virtualservice -n <instance-namespace> -o json | jq -r
      .items[].spec.hosts[0]

クラスタへのノードの追加

クラスタ内のノードが不足しているため、インスタンスの作成に失敗する可能性があります。これが発生した場合は、クラスタにノードを追加する必要がある場合があります。
  1. 次のコマンドを実行して、「保留中」状態のポッドを確認します:
    kubectl get pods -n <instancename> | grep Pending
    さらに、使用可能なポッドがないことを確認できます:
    kubectl get pods -n instancename
  2. 次に、使用可能なワーカー・ノードを確認します。
    kubectl get nodes | grep worker
  3. 新しいポッドを取得するために使用できるノードがあるかどうかを確認するには、各ワーカー・ノードに対して次のコマンドを実行します:
    kubectl describe node $<worker_node>
    ここで、<worker_node>はワーカー・ノードの名前です。ワーカー・ノードが100%の容量を超えないようにしてください。
  4. ノードを追加するには、最初にクラスタ内のMachineSetsの数を取得します。
    oc get machinesets -n openshift-machine-api
  5. ノードが2つ未満のMachineSetsの場合は、それらをスケール・アップしてみてください。
    oc scale --replicas=2 machineset <obpee00-qtthx-worker-eastus2> -n openshift-machine-api
    <obpee00-qtthx-worker-eastus2>は、2ノードまでスケール・アップするMachineSetの名前の例です。
  6. 準備完了および使用可能なノードのリストが、選択したノード数に達するまで、MachineSetsを再度問い合せます。
  7. これで、失敗したインスタンスを再デプロイできます。

インスタンスが作成され、インスタンス・リストに表示されたら、インスタンス名の横にあるメニューからサービス・コンソールを起動できます。Oracle Blockchain Platformの使用コンソールとはの説明に従って、コンソールを使用してネットワークを構成します。