Argo CDとOCI Kubernetes EngineでGitOpsを導入

この記事では、Argo CDおよびOracle Cloud Infrastructure Kubernetes Engineを使用したGitOpsのデプロイメントの基礎となる基本的なアーキテクチャについて説明します。

GitOpsはCI/CDの風味で、Gitリポジトリを信頼できる唯一の情報源として使用してInfrastructure as Codeを提供します。ソース・コードおよびアプリケーションの構成から、アプリケーション全体をGitリポジトリに宣言的に配置することを推奨します。これにより、アプリケーションの構成に変更をデプロイする一貫した方法が提供され、プル・リクエストやマージ・リクエストなど、よく知られたGitワークフローを使用してバージョン管理が提供されます。

GitOps原則を使用すると、次のことが保証されます。
  • アプリケーション開発の標準ワークフロー。
  • アプリケーション要件を事前に設定するためのセキュリティの強化。
  • Gitによる可視性とバージョン管理により信頼性を向上
  • 任意のクラスタ、任意のクラウドおよび任意のオンプレミス環境全体で一貫性があります。
Argo CDは、Kubernetes向けに構築された宣言的な継続的デリバリ・ツールです。Argo CDでは、Githubリポジトリの変更により、Kubernetes構成が均一に作成されます。これにより、Gitリポジトリは、Kubernetesクラスタで提供されるすべてのアプリケーション構成の信頼できる唯一の情報源となります。Argo CDは、変更のソースに関係なくGitリポジトリの変更をチェックするプル・モデルを使用します。これらの変更は、CIパイプラインから行うことも、開発者または管理者の手動設定にすることもできます。これにより、CI/CDパイプラインを分離できます。CIはコードを構築するため、開発者が保守するのに適していますが、CDはOpsチームの関心事です。両者を分離することで、各チームはCI/CDパイプラインを互いに独立して変更できます。

アプリケーション・ソース・コードと構成用に個別のGitリポジトリを用意することがベスト・プラクティスです。通常、構成の変更ではアプリケーション・ソース・コードの変更は不要です。異なるリポジトリがあると、CIビルドをトリガーせずにアプリケーション構成を変更できます。

Argo CDは、次の形式のKubernetes構成をサポートしています。
  • Kubernetesマニフェスト
  • Helmチャート
  • マニフェストに慣れる
Argo CDが管理するアプリケーションの場合、アプリケーションのライブ状態の構成は継続的に監視されます。これは、Gitリポジトリで指定された目的の状態と比較されます。ライブ状態が目的の状態から逸脱した場合、Argo CDはアプリケーションをOutOfSyncとして識別し、Gitリポジトリから構成をプルして変更を適用します。

アーキテクチャ

このアーキテクチャは、Argo CDツールが独自のネームスペースにデプロイされたOCI Kubernetes Engineクラスタを示しています。

Argo CDアプリケーションには、Web UIまたはArgo CDコマンドライン・インタフェースからアクセスできます。Argo CDツールへの接続は、OCI Kubernetes Engineクラスタにデプロイされたロード・バランサ・サービスによって提供されます。Argo CDがデプロイされたら、OCI Kubernetes Engineクラスタに必要なポートとGitリポジトリの資格証明にIP接続があるかぎり、内部または外部でホストされるGitリポジトリとOracle Cloud Infrastructureと同期するように構成します。Argo CDがリポジトリと同期されると、リポジトリで行われたアプリケーション構成の更新がOCI Kubernetes Engineクラスタに適用されます。Gitリポジトリの外部でアプリケーションに変更が加えられた場合、Argo CDはアプリケーションが同期していないと判断し、Gitリポジトリの希望の状態と一致するように変更を元に戻します。

次の図は、このリファレンス・アーキテクチャを示しています。

argocd.pngの説明が続きます
図argocd.pngの説明

アルゴクド-oracle.zip

このアーキテクチャには次のコンポーネントがあります。
  • Tenancy

    Oracle Autonomous Transaction Processingは、トランザクション処理ワークロード用に最適化された、自動運転、自己保護および自己修復が可能なデータベース・サービスです。ハードウェアの構成や管理、ソフトウェアのインストールを行う必要はありません。Oracle Cloud Infrastructureは、データベースの作成に加え、データベースのバックアップ、パッチ適用、アップグレードおよびチューニングも処理します。

  • リージョン

    Oracle Cloud Infrastructureリージョンとは、可用性ドメインと呼ばれる1つ以上のデータ・センターを含む、ローカライズされた地理的領域です。リージョンは他のリージョンから独立し、長距離の場合は(複数の国または大陸にまたがって)分離できます。

  • コンパートメント

    コンパートメントは、Oracle Cloud Infrastructureテナンシ内のクロスリージョン論理パーティションです。Oracle Cloudでのリソースの編成、リソースへのアクセスの制御、および使用割当ての設定には、コンパートメントを使用します。特定のコンパートメント内のリソースへのアクセスを制御するには、誰がリソースにアクセスできるか、どのアクションを実行できるかを指定するポリシーを定義します。

  • 可用性ドメイン

    可用性ドメインは、リージョン内の独立したスタンドアロン・データ・センターです。各可用性ドメイン内の物理リソースは、他の可用性ドメイン内のリソースから分離されているため、フォルト・トレランスが提供されます。可用性ドメインどうしは、電力や冷却、内部可用性ドメイン・ネットワークなどのインフラを共有しません。そのため、あるアベイラビリティ・ドメインでの障害がリージョン内の他のアベイラビリティ・ドメインに影響を及ぼすことはほとんどありません。

  • フォルト・ドメイン

    フォルト・ドメインは、可用性ドメイン内のハードウェアおよびインフラストラクチャのグループです。各アベイラビリティ・ドメインに3つのフォルト・ドメインがあり、電源とハードウェアは独立しています。複数のフォルト・ドメインにリソースを分散する場合、アプリケーションは、物理サーバーの障害、システム・メンテナンスおよびフォルト・ドメイン内の電源障害を許容できます。

  • 仮想クラウド・ネットワーク(VCN)およびサブネット

    VCNは、Oracle Cloud Infrastructureリージョンで設定する、カスタマイズ可能なソフトウェア定義のネットワークです。VCNは、従来のデータ・センター・ネットワークと同様に、ネットワーク環境の完全な制御を可能にします。VCNには重複しない複数のCIDRブロックを含めることができ、VCNの作成後にそれらを変更できます。VCNをサブネットにセグメント化して、そのスコープをリージョンまたは可用性ドメインに設定できます。各サブネットは、VCN内の他のサブネットと重複しない連続した範囲のアドレスで構成されます。サブネットのサイズは、作成後に変更できます。サブネットはパブリックにもプライベートにもできます。

  • ロード・バランサ

    Oracle Cloud Infrastructure Load Balancingサービスは、単一のエントリ・ポイントからバック・エンド内の複数のサーバーへの自動トラフィック分散を提供します。ロード・バランサは、様々なアプリケーションへのアクセスを提供します。

  • コード・リポジトリ

    DevOpsサービスでは、独自のプライベート・コード・リポジトリを作成するか、GitHub、GitLab、Bitbucketクラウドなどの外部コード・リポジトリに接続できます。

  • セキュリティ・リスト

    サブネットごとに、サブネット内外で許可する必要があるトラフィックのソース、宛先およびタイプを指定するセキュリティ・ルールを作成できます。

  • NATゲートウェイ

    NATゲートウェイを使用すると、VCN内のプライベート・リソースは、受信インターネット接続にそれらのリソースを公開せずに、インターネット上のホストにアクセスできます。

  • サービス・ゲートウェイ

    サービス・ゲートウェイは、VCNからOracle Cloud Infrastructure Object Storageなどの他のサービスへのアクセスを提供します。VCNからOracleサービスへのトラフィックは、Oracleネットワーク・ファブリック上を移動し、インターネットを通過することはありません。

  • クラウド・ガード

    Oracle Cloud Guardを使用して、Oracle Cloud Infrastructure内のリソースのセキュリティをモニターおよびメンテナンスできます。クラウド・ガードでは、定義できるディテクタ・レシピを使用して、リソースにセキュリティの弱点がないか確認し、オペレータおよびユーザーにリスクのあるアクティビティがないか監視します。構成の誤りやセキュアでないアクティビティが検出されると、クラウド・ガードは修正アクションを推奨し、ユーザーが定義できるレスポンダ・レシピに基づいてそれらのアクションの実行を支援します。

  • セキュリティ・ゾーン

    セキュリティ・ゾーンは、データの暗号化やコンパートメント全体のネットワークへのパブリック・アクセスの防止などのポリシーを適用することで、Oracleのセキュリティのベスト・プラクティスを最初から保証します。セキュリティ・ゾーンは、同じ名前のコンパートメントに関連付けられ、コンパートメントとそのサブコンパートメントに適用されるセキュリティ・ゾーン・ポリシーまたは「レシピ」が含まれます。セキュリティ・ゾーン・コンパートメントに標準コンパートメントを追加または移動することはできません。

  • オブジェクト・ストレージ

    オブジェクト・ストレージでは、データベースのバックアップ、分析データ、イメージやビデオなどのリッチ・コンテンツなど、任意のコンテンツ・タイプの構造化データおよび非構造化データにすばやくアクセスできます。インターネットから直接またはクラウド・プラットフォーム内から、安全かつセキュアにデータを格納し、取得できます。パフォーマンスやサービスの信頼性を低下させることなく、ストレージをシームレスに拡張できます。迅速、即時、頻繁にアクセスする必要があるホット・ストレージには、標準ストレージを使用します。長期間保持し、ほとんどまたはほとんどアクセスしないコールド・ストレージには、アーカイブ・ストレージを使用します。

  • FastConnect

    Oracle Cloud Infrastructure FastConnectは、データ・センターとOracle Cloud Infrastructureの間に専用のプライベート接続を作成する簡単な方法を提供します。FastConnectは、インターネットベースの接続と比較して、高帯域幅のオプションと、より信頼性の高いネットワーキング・エクスペリエンスを提供します。

  • ローカル・ピアリング・ゲートウェイ(LPG)

    LPGを使用すると、1つのVCNを同じリージョン内の別のVCNとピア接続できます。ピアリングとは、VCNがプライベートIPアドレスを使用して通信することを意味し、トラフィックがインターネットを横断したり、オンプレミス・ネットワーク経由でルーティングしたりすることはありません。

  • 自律型データベース

    Oracle Cloud Infrastructureの自律型データベースは、トランザクション処理およびデータ・ウェアハウス・ワークロードに使用できる、完全管理型の事前構成済データベース環境です。ハードウェアの構成や管理、ソフトウェアのインストールを行う必要はありません。Oracle Cloud Infrastructureは、データベースの作成に加え、データベースのバックアップ、パッチ適用、アップグレードおよびチューニングも処理します。

  • Autonomous Data Warehouse

    Oracle Autonomous Data Warehouseは、データ・ウェアハウス・ワークロード用に最適化された、自動運転、自己保護および自己修復のデータベース・サービスです。ハードウェアの構成や管理、ソフトウェアのインストールを行う必要はありません。Oracle Cloud Infrastructureは、データベースの作成に加え、データベースのバックアップ、パッチ適用、アップグレードおよびチューニングも処理します。

  • Autonomous Transaction Processing

    Oracle Autonomous Transaction Processingは、トランザクション処理ワークロード用に最適化された、自動運転、自己保護および自己修復が可能なデータベース・サービスです。ハードウェアの構成や管理、ソフトウェアのインストールを行う必要はありません。Oracle Cloud Infrastructureは、データベースの作成に加え、データベースのバックアップ、パッチ適用、アップグレードおよびチューニングも処理します。

  • Exadata DBシステム

    Exadata Cloud Serviceを使用すると、クラウド内でExadataの機能を活用できます。ニーズの増加時にデータベース・コンピュート・サーバーおよびストレージ・サーバーをシステムに追加できるフレキシブルX8Mシステムをプロビジョニングできます。X8Mシステムでは、高帯域幅と低レイテンシを実現するRoCE (RDMA over Converged Ethernet)ネットワーク、永続メモリー(PMEM)モジュールおよびインテリジェントExadataソフトウェアを提供します。X8Mシステムをプロビジョニングするには、クォータ・ラックのX8システムと同等のシェイプを使用し、プロビジョニング後にデータベース・サーバーおよびストレージ・サーバーをいつでも追加します。

レコメンデーション

Argo CDおよびOCI Kubernetes Engineを使用してGitOpsをデプロイする場合は、次の推奨事項を開始点として使用します。実際の要件は、ここで説明するアーキテクチャとは異なる場合があります。
  • VCN

    VCNを作成するときには、必要なCIDRブロックの数を決定し、VCN内のサブネットにアタッチする予定のリソースの数に基づいて各ブロックのサイズを決定します。標準のプライベートIPアドレス領域内にあるCIDRブロックを使用します。

    プライベート接続を設定する他のネットワーク(Oracle Cloud Infrastructure、オンプレミス・データ・センターまたは別のクラウド・プロバイダ)と重複しないCIDRブロックを選択します。

    VCNを作成した後、そのCIDRブロックを変更、追加および削除できます。

    サブネットを設計するときには、トラフィック・フローおよびセキュリティ要件を考慮してください。特定の層またはロール内のすべてのリソースを、セキュリティ境界として機能できる同じサブネットにアタッチします。

    リージョナル・サブネットを使用します。

  • セキュリティ

    Oracle Cloud Guardを使用して、Oracle Cloud Infrastructure内のリソースのセキュリティを事前にモニターおよびメンテナンスします。クラウド・ガードでは、定義できるディテクタ・レシピを使用して、リソースにセキュリティの弱点がないか確認し、オペレータおよびユーザーにリスクのあるアクティビティがないか監視します。構成の誤りやセキュアでないアクティビティが検出されると、クラウド・ガードは修正アクションを推奨し、ユーザーが定義できるレスポンダ・レシピに基づいてそれらのアクションの実行を支援します。

    最大限のセキュリティーを必要とするリソースの場合、Oracleではセキュリティーゾーンを使用することをお勧めします。セキュリティ・ゾーンは、ベスト・プラクティスに基づくセキュリティ・ポリシーのOracle定義レシピに関連付けられたコンパートメントです。たとえば、セキュリティ・ゾーン内のリソースにパブリック・インターネットからアクセスできず、顧客管理キーを使用して暗号化する必要があります。リソースをセキュリティ・ゾーンで作成および更新すると、Oracle Cloud Infrastructureでは、その操作がセキュリティ・ゾーン・レシピのポリシーに対して検証され、ポリシーに違反する操作が拒否されます。

  • クラウド・ガード

    Oracleが提供するデフォルトのレシピをクローニングおよびカスタマイズして、カスタム・ディテクタおよびレスポンダ・レシピを作成します。これらのレシピを使用すると、警告を生成するセキュリティ違反のタイプ、およびそれらに対して実行を許可するアクションを指定できます。たとえば、可視性がpublicに設定されているオブジェクト・ストレージ・バケットを検出できます。

    クラウド・ガードをテナンシ・レベルで適用して、最も広い範囲をカバーし、複数の構成を維持する管理上の負担を軽減します。

    管理対象リスト機能を使用して、特定の構成をディテクタに適用することもできます。

  • セキュリティ・ゾーン

    Oracleが提供するデフォルトのレシピをクローニングおよびカスタマイズして、カスタム・ディテクタおよびレスポンダ・レシピを作成します。これらのレシピを使用すると、警告を生成するセキュリティ違反のタイプ、およびそれらに対して実行を許可するアクションを指定できます。たとえば、可視性がpublicに設定されているオブジェクト・ストレージ・バケットを検出できます。

    クラウド・ガードをテナンシ・レベルで適用して、最も広い範囲をカバーし、複数の構成を維持する管理上の負担を軽減します。管理対象リスト機能を使用して、特定の構成をディテクタに適用することもできます。

  • ネットワーク・セキュリティ・グループ(NSG)

    NSGを使用して、特定のVNICに適用されるイングレスおよびエグレス・ルールのセットを定義できます。NSGでは、VCNのサブネット・アーキテクチャをアプリケーションのセキュリティ要件から分離できるため、セキュリティ・リストではなくNSGを使用することをお薦めします。

    NSGを使用して、特定のVNICに適用されるイングレスおよびエグレス・ルールのセットを定義できます。NSGでは、VCNのサブネット・アーキテクチャをアプリケーションのセキュリティ要件から分離できるため、セキュリティ・リストではなくNSGを使用することをお薦めします。

  • ロード・バランサの帯域幅

    ロード・バランサの作成時に、固定帯域幅を提供する事前定義済のシェイプを選択するか、帯域幅範囲を設定するカスタム(フレキシブル)シェイプを指定して、トラフィック・パターンに基づいて帯域幅を自動的にスケーリングできます。どちらの方法でも、ロード・バランサの作成後にいつでもシェイプを変更できます。

デプロイ

このリファレンス・アーキテクチャのTerraformコードは、Oracle Cloud Infrastructure Resource Managerのサンプル・スタックとして使用できます。このサンプルTerraformスタックは、OCIデータ・フロー・アプリケーション環境を、IAMポリシーおよびOCI Object Storageバケット(サードパーティ・ストレージではない)とともにデプロイします。デフォルトでは、デモPython Sparkアプリケーションもデプロイされます。GitHubからコードをダウンロードし、特定の要件にあわせてカスタマイズすることもできます。

  • Oracle Cloud Infrastructure Resource Managerのサンプル・スタックを使用してデプロイします:
    1. をクリックしますOracle Cloudへのデプロイ

      まだサインインしていない場合は、テナンシおよびユーザー資格証明を入力します。

    2. スタックをデプロイするリージョンを選択します。
    3. 画面に表示されるプロンプトと手順に従ってスタックを作成します。
    4. スタックの作成後、「Terraformアクション」をクリックし、「プラン」を選択します。
    5. ジョブが完了するまで待機し、計画をレビューします。

      変更を行うには、「スタックの詳細」ページに戻り、「スタックの編集」をクリックして、必要な変更を行います。次に、「プラン」アクションを再実行します。

    6. これ以上の変更が必要ない場合は、「スタックの詳細」ページに戻り、「Terraformアクション」をクリックして、「適用」を選択します。
  • GitHubのTerraformコードを使用してデプロイします:
    1. GitHubに移動します。
    2. リポジトリをローカル・コンピュータにクローニングまたはダウンロードします。
    3. READMEドキュメントの手順に従います。

GitHubで提供されているTerraformコードに加えて、次のコード・スニペットは、Amazon Web Services S3への接続方法とデータの問合せ方法を示しています。

  • S3に接続してデータを問い合せるには、hadoop-aws.jarおよびaws-java-sdk.jarパッケージを含める必要があります。次のように、pom.xmlファイルでこれらのパッケージを参照できます。
    <dependency>
    	<groupId>org.apache.hadoop</groupId>
    	<artifactId>hadoop-aws</artifactId>
    	<version>2.9.2</version>
    	<exclusions>
    	<exclusion>
    		<groupId>org.apache.hadoop</groupId>
    		<artifactId>hadoop-common</artifactId>
    	</exclusion>
    	</exclusions>
    </dependency>
    <dependency>
    	<groupId>com.amazonaws</groupId>
    	<artifactId>aws-java-sdk</artifactId>
    	<version>1.7.4</version>
    </dependency>
  • 次のようなコードを使用して、Amazon Web Services S3に接続します。アクセス・キーと秘密キーを指定する必要があります。次のスニペットでは、これらの値はそれぞれ変数ACCESSおよびSECRETで表されます。
    SparkSession spark = SparkSession.builder().master("local")
    	.config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
    	.config("spark.hadoop.fs.s3a.access.key", ACCESS)
    	.config("spark.hadoop.fs.s3a.secret.key", SECRET)
    	.config("fs.s3a.connection.ssl.enabled", "false")
    	.getOrCreate();
  • 次のようなコードを使用して、S3の場所と指定した表名を使用してデータを問い合せます。
    Dataset<Row> ds = sqlContext.read().format("csv").option("header","true").load("<S3 Location>");
    ds.createOrReplaceTempView("<Table Name>");
    Dataset<Row> result_ds = sqlContext.sql("<SQL Query Using <Table Name>>");

詳細の参照

Argo CDの詳細と、それを使用してOCI Kubernetes EngineでGitOpsをデプロイする方法をご覧ください。

次の追加リソースを確認します。

確認

作成者: Chiping Hwang