サービス・メッシュ用のOCI Service Operator for Kubernetesのインストール

OCI Service Operator for Kubernetesにより、Kubernetes環境からのOCIリソースの作成、管理および接続が容易になります。Kubernetesユーザーは、OCI Service Operator for Kubernetesをインストールするだけで、Kubernetes APIを使用してOCIリソースに対してアクションを実行できます。OCI Service Operator for Kubernetesにより、OCI CLIやその他のOCI開発者ツールを使用してサービスAPIと対話する必要がなくなります。

OCI Service Operator for Kubernetesは、Operatorの管理に使用されるオープン・ソース・ツールキットであるOperator Frameworkに基づいています。コントローラ・ランタイム・ライブラリを使用します。このライブラリは、操作ロジックを記述するための高レベルのAPIと抽象化を提供し、オペレータのスキャフォールディングおよびコード生成用のツールも提供します。

Operator SDKの詳細は、オペレータ・フレームワークのサイトを参照してください。

オペレータSDKおよびOLMのインストール

次のステップを使用して、オペレータSDKをローカル・マシンにインストールします。

  • オペレータSDKのインストール

    Operator SDKのインストール・ページに移動し、オペレーティング・システムのインストール手順に従います。

  • オペレータ・ライフサイクル・マネージャ(OLM)をインストールします。OLMは、ユーザーがKubernetesネイティブ・アプリケーション(オペレータ)のライフサイクルと、クラスタで実行されている関連サービスをインストール、更新および管理するのに役立ちます。次のコマンドを使用してインストールします。
    operator-sdk olm install --version 0.20.0
    ノート

    このステップを実行するには、マシンでKubernetesクラスタへのローカル・アクセスを設定する必要があります。
  • クラスタ内の必要なすべての顧客リソース定義(CRD)を最初にチェックして、OLMのインストールを確認します。次のコマンドを実行します
    operator-sdk olm status

    コマンドを実行すると、次のように出力されます。

    INFO[0003] Fetching CRDs for version "v0.20.0"          
    INFO[0003] Fetching resources for resolved version "v0.20.0" 
    INFO[0021] Successfully got OLM status for version "v0.20.0" 
    
    NAME                                            NAMESPACE    KIND                        STATUS
    operatorgroups.operators.coreos.com                          CustomResourceDefinition    Installed
    operatorconditions.operators.coreos.com                      CustomResourceDefinition    Installed
    olmconfigs.operators.coreos.com                              CustomResourceDefinition    Installed
    installplans.operators.coreos.com                            CustomResourceDefinition    Installed
    clusterserviceversions.operators.coreos.com                  CustomResourceDefinition    Installed
    olm-operator-binding-olm                                     ClusterRoleBinding          Installed
    operatorhubio-catalog                           olm          CatalogSource               Installed
    olm-operators                                   olm          OperatorGroup               Installed
    aggregate-olm-view                                           ClusterRole                 Installed
    catalog-operator                                olm          Deployment                  Installed
    cluster                                                      OLMConfig                   Installed
    operators.operators.coreos.com                               CustomResourceDefinition    Installed
    olm-operator                                    olm          Deployment                  Installed
    subscriptions.operators.coreos.com                           CustomResourceDefinition    Installed
    aggregate-olm-edit                                           ClusterRole                 Installed
    olm                                                          Namespace                   Installed
    global-operators                                operators    OperatorGroup               Installed
    operators                                                    Namespace                   Installed
    packageserver                                   olm          ClusterServiceVersion       Installed
    olm-operator-serviceaccount                     olm          ServiceAccount              Installed
    catalogsources.operators.coreos.com                          CustomResourceDefinition    Installed
    system:controller:operator-lifecycle-manager                 ClusterRole                 Installed

OCI Service Operator for Kubernetesのデプロイ

Kubernetes OLMバンドルのOCI Service Operatorには、CRD、RBAC、ConfigMapsなど、必要なすべての詳細が含まれます。デプロイメントでは、OCI Service Operator for KubernetesがKubernetesクラスタにインストールされます。まず、演算子のネームスペースを作成します。

kubectl create ns oci-service-operator-system
ノート

アプリケーション・ネームスペースにデプロイされている場合、演算子は通常機能します。このオプションは、オペレータ名前空間を作成するかわりに使用します。
ノート

接続されていないレルムの場合は、https://github.com/oracle/oci-service-operator/blob/main/BUILD_OSOK_OPERATOR.mdのステップに従って独自のOSOK演算子を作成します。次のコマンドのバンドルを、OSOKオペレータをインストールするために手動で作成されたバンドルに置き換えます。

次のコマンドを使用して、KubernetesクラスタのOCI Service Operator for Kubernetes Operatorをネームスペース(OCI-service-operator-system)にインストールします。

operator-sdk run bundle iad.ocir.io/oracle/oci-service-operator-bundle:X.X.X -n oci-service-operator-system --timeout 5m
ノート

X.X.Xを現在のバージョンのOCI Service Operator for Kubernetesに置き換えます。現在のバージョンを取得するには、GitHubリリースサイト(https://github.com/oracle/oci-service-operator/releases)にアクセスしてください。
ノート

コマンドを実行するには、Dockerのiad.ocir.ioにあるOracle Registryにログインする必要があります。ログインしていることを確認するには、Docker CLIを使用したイメージのプルを参照してください。

コマンドを実行すると、次のように出力されます。

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"

インストールを確認するには、次のステップを実行します。

  1. kubectlを使用してカスタム定義を確認します。
    $ kubectl get crds | grep "servicemesh.oci.oracle.com" | awk -F. '{print $1}'
    accesspolicies
    ingressgatewaydeployments
    ingressgatewayroutetables
    ingressgateways
    meshes
    virtualdeploymentbindings
    virtualdeployments
    virtualserviceroutetables
    virtualservices
  2. kubectlを使用して、すべてのサービス・メッシュ・リソースに対応するWebフックが正常にインストールされたことを確認します。

    まず、Webフックの検証を確認します。

    $ kubectl get validatingwebhookconfiguration | grep "servicemesh.oci.oracle.cloud.com" | awk -F. '{print $1}'
    ap-validator
    ig-validator
    igd-validator
    igrt-validator
    mesh-validator
    vd-validator
    vdb-validator
    vs-validator
    vsrt-validator

    次に、Webフックの変更を確認します。

    $ kubectl get mutatingwebhookconfiguration | grep "servicemesh.oci.oracle.com" | awk -F. '{print $1}'
    proxy-injector

トラブルシューティングの詳細は、「サービス・メッシュのトラブルシューティング」を参照してください。

メトリック・サーバーのインストール

イングレス・ゲートウェイを使用する場合は、メトリック・サーバーをインストールします。Kubernetes Horizontal Pod Autoscalarは、メトリック・サーバーを使用して、CPU使用率に基づいてイングレス・ゲートウェイ内のポッド数をスケーリングします。メトリック・サーバーは次のコマンドを使用してインストールします。

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

サービスオペレータの独自の証明書を取得する(オプション)

別の方法として、独自の証明書(BYOC)を使用して通信を保護します。Kubernetesは、certificates.k8s.io APIを提供します。これにより、ユーザーが制御する認証局(CA)によって署名されたTLS証明書をプロビジョニングできます。CAおよび証明書は、信頼を確立するためにワークロードで使用されます。KubernetesのOCI Service OperatorとKubernetes間の信頼を確立するには、certificates.k8s.ioを使用してCAと証明書を作成します。oci-service-operator-controller-manager-service-certシークレットにパッチを適用して、新しいCAおよび証明書を使用します。

詳細は、クラスタでのTLS証明書の管理を参照してください

CAおよびCertificateBundleを生成するには、cfssl(Cloudfare SSL)またはOpenSSLなどのツールを使用します。ユーザーが作成したCAを使用するには、デフォルト構成をインストールし、OLM for OCI Service Operator for Kubernetesによって生成されたkubernetes.io/tlsにパッチを適用してください。次のステップでは、CFSSLを使用した構成ステップを示します。

ノート

次のステップで、{operators-namespace}を、演算子が実行するネームスペースに置き換えます。
  1. 次のステップcfsslを使用して、証明書署名リクエスト(CSR)および秘密キーを作成します:
    ノート

    これらのステップの詳細は、証明書署名リクエストの作成を参照してください。
    cat <<EOF | cfssl genkey - | cfssljson -bare server
    {
      "hosts": [
        "oci-service-operator-webhook-service.{operators-namespace}.svc.cluster.local",
        "oci-service-operator-controller-manager-service.{operators-namespace}.svc.cluster.local"
      ],
      "CN": "kube.operator.cert",
      "key": {
        "algo": "ecdsa",
        "size": 256
      }
    }
    EOF

    このコマンドは2つのファイルを生成します。server.CSRファイルには、PEMでエンコードされたCSRが含まれています。server-key.PEMファイルには、まだ作成されていない証明書へのPEMエンコードされたキーが含まれています。

  2. CSRマニフェストを作成し、次の項に従ってKubernetesに送信します。
    ノート

    これらのステップの詳細は、Kubernetes APIに送信するCertificateSigningRequestオブジェクトの作成を参照してください。
    cat <<EOF | kubectl apply -f -
    apiVersion: certificates.k8s.io/v1
    kind: CertificateSigningRequest
    metadata:
      name: oci-service-operator-controller.{operators-namespace}
    spec:
      request: $(cat server.csr | base64 | tr -d '\n')
      signerName: oci.com
      usages:
      - digital signature
      - key encipherment
      - server auth
    EOF

    このコマンドの実行後、作成されたCSRは保留状態になります。

    kubectl describe csr {csr-name}

    CSRを承認します。

    kubectl certificate approve {csr-name}

    承認後に状態を検証します。値がCONDITION-Approvedであることを確認します。

  3. CSRに署名します。
    ノート

    これらのステップの詳細は、CertificateSigningRequestに署名を参照してください。
    1. 認証局キー・ファイル(ca-key.pem)および証明書(ca.pem)を作成します。
      cat <<EOF | cfssl gencert -initca - | cfssljson -bare ca
      {
        "CN": "My Example Signer",
        "key": {
          "algo": "rsa",
          "size": 2048
        }
      }
      EOF
    2. サーバー署名リクエストを作成して証明書を発行します。server-signing-config.json ファイルを作成します。
      {
          "signing": {
              "default": {
                  "usages": [
                      "digital signature",
                      "key encipherment",
                      "server auth"
                  ],
                  "expiry": "876000h",
                  "ca_constraint": {
                      "is_ca": false
                  }
              }
          }
      }

      server-signing-config.json署名構成、認証局のキー・ファイルおよび証明書ファイルを使用して、証明書リクエストに署名します。

      kubectl get csr oci-service-operator-controller.{operators-namespace} -o jsonpath='{.spec.request}' | \
        base64 --decode | \
        cfssl sign -ca ca.pem -ca-key ca-key.pem -config server-signing-config.json - | \
        cfssljson -bare ca-signed-server
    3. 署名付き証明書をアップロードします。
      kubectl get csr oci-service-operator-controller.{operators-namespace} -o json | \
        jq '.status.certificate = "'$(base64 ca-signed-server.pem | tr -d '\n')'"' | \
        kubectl replace --raw /apis/certificates.k8s.io/v1/certificatesigningrequests/oci-service-operator-controller.{operators-namespace}/status -f -

      前述の変更を適用した後、CSR条件が「承認済、発行済」であることを確認します。

    4. 証明書をダウンロードします。
      kubectl get csr {csr-name} -o jsonpath='{.status.certificate}' \
          | base64 --decode > server.crt

      前述のコマンドを実行すると、server.crtファイルが作成されます。

  4. ステップ(3)(d)のserver.crt、ステップ(3)(a)のca-key.pemファイルおよびステップ(1)のserver-key.pemファイルをエンコードおよびパッチ適用します。
    kubectl patch secret oci-service-operator-controller-manager-service-cert --namespace {operators-namespace} --type merge --patch }}{{'{"data":  "olmCAKey": "'$(base64 ca.pem | tr -d }}{{'\n')'", "tls.key": "'$(base64 server-key.pem | tr -d }}{{'\n')'", "tls.crt": "'$(base64 ca-signed-server.pem | tr -d }}{{'\n')'"}'
  5. oci-service-operator-controller-manager-service-certに最新の値が含まれていることを検証します。
  6. 前述のステップが完了すると、リソースが作成され、機能しています。ただし、x509: certificate signed by unknown authorityというエラーが表示された場合は、次のステップを確認してトラブルシューティングします。
    1. CSRに「承認済、発行済」の条件があるかどうかを確認します。それ以外の場合は、ステップ(3)(c)から再度開始します。
    2. base64デコードされたolmCAKeyがステップ(3)(d)のserver.crtと一致するかどうかを検証します。それ以外の場合は、olmCAKeyserver.crtファイルで更新します。
    3. base64デコードされたtls.keyがステップ(1)のserver-key.pemファイルと一致するかどうかを検証します。それ以外の場合は、tls.keyserver-key.pemファイルで更新します。
    4. base64デコードされたtls.crtがステップ(3)(a)のca-key.pemファイルと一致するかどうかを検証します。それ以外の場合は、ca-key.pemファイルでtls.crtを更新します。

サービス・メッシュに必要なリソースの設定

ステップの設定

サービス メッシュの使用を開始するには、独自のメッシュを作成する前に、いくつかの要件を満たす必要があります。

管理者でない場合は、サービス・メッシュ、Vaultおよび証明書の3つのサービスのリソースへのアクセス権を管理者に依頼してください。管理者は、Identity and Access Management (IAM)ポリシーを使用してこれらのサービスへのアクセス権を付与できます。

サービス・メッシュを使用するようにテナンシを準備するには、OCIアカウントで次のステップを実行します。

  1. ボールトを作成して、認証局の暗号化キーを格納します。詳細は、ボールトの管理を参照してください。

    VaultのHardware Security Module (HSM)暗号化鍵を追加します。キーの管理を参照してください。認証局キーの場合、Rivest- Shamir- Adleman (RSA) 2,048-bitキーまたは4,096-bitキーを使用できます。

  2. 認証局を作成します。「証明書認証局の管理」を参照してください。
    ノート

    認証局の「証明書の最大有効期間(日数)」設定は、少なくとも45日である必要があります。
  3. クライアントがアプリケーションへのTLS接続を確立できるように、TLS証明書を作成します。この証明書は、イングレス・ゲートウェイTLS暗号化へのHTTPリクエストを保持します。「証明書の管理」を参照してください。

詳細情報

サービス・メッシュに関連するIAMポリシーの詳細は、次を参照してください:

ノート

アプリケーションからサービス・メッシュ・サポートを削除する必要がある場合は、サービス・メッシュの概要チュートリアルアプリケーションのメッシュ解除(オプション)の項を参照してください。

次: サービス・メッシュに必要なポリシーの設定