InterSystems IRISソリューションを CircleCI を使用して GCP Kubernetes Cluster GKE へデプロイする
私たちのほとんどは、多かれ少なかれDockerに慣れ親しんでいます。 Dockerを使用している人たちは、ほとんどのアプリケーションを簡単にデプロイし遊んで、何かを壊してしまってもDockerコンテナを再起動するだけでアプリケーションを復元できる点を気に入っています。
InterSystems も Docker を気に入っています。
InterSystems OpenExchange プロジェクトには、InterSystems IRISのイメージを簡単にダウンロードして実行できるDockerコンテナで実行するサンプルが多数掲載されています。また、Visual Studio IRISプラグインなど、その他の便利なコンポーネントもあります 。
特定のユースケース用の追加コードを使ってDockerでIRISを実行するのは簡単ですが、ソリューションを他のユーザーと共有する場合は、コマンドを実行し、コードを更新するたびに繰り返し実行するための何らかの方法が必要になります。 この記事では、継続的インテグレーション/継続的デリバリー (CI / CD)を使ってそのプロセスを簡素化する方法を説明します。
セットアップ
まず、IRISをベースにしたシンプルなREST APIアプリケーションから紹介します。
アプリケーションの詳細は、ビデオ「InterSystems IRIS、ObjectScript および DockerでREST API を作成する」でご覧いただけます。では、CI/CDを使用して似たようなアプリケーションを他の人と共有できるのかを見てみましょう。
最初は、コードを個人用GitHubリポジトリにCloneします。GitHubにアカウントを持っていない場合は、サインアップしてアカウントを1つ作成してください。便利なようにSSH経由でアクセスできるようにしてできるようにしておくとPullまたPushするたびにパスワードを入力する必要がなくなります。次に、GitHubのプロジェクトページintersystems-community/objectscript-rest-docker-templateGitHubに移動して、[Use this template] ボタンをクリックし、テンプレートに基づいて独自バージョンのリポジトリを作成します。「my-objectscript-rest-docker-template」のような名前を付けます。
次に、プロジェクトをローカルマシンにPullします。
次に、「hello, world!」を表示するRESTエンドポイントを追加します。
エンドポイントは src/cls/Sample/PersonREST.cls クラスで定義されています。 エンドポイントは次のようになります(最初の<Route>に定義されています)。
<Route Url="/all" Method="GET" Call="GetAllPersons"/>
...
HelloWorldメソッドを呼び出します。
{
Write "Hello, world!"
Quit $$$OK
}
ここで、リモートリポジトリにPushするときこれがどのように機能するかを考慮する必要があります。 考慮点は次のとおりです。
- Dockerイメージをビルドする。
- Dockerイメージを保存する。
- このイメージに基づいてコンテナを実行する。
すでにGitHubに統合されているCircleCIサービスを使用して、Dockerイメージをビルドします。 また、Dockerイメージを保存し、保存したイメージを基にしたコンテナをKubernetesで実行できるGoogle Cloudを使用します。 これについて少し掘り下げましょう。
Google Cloudの前提条件
サービスの無料枠を提供するGoogle Cloudのアカウントに登録したとしましょう。「Development」という名前のプロジェクトを作成し、「Create cluster」ボタンをクリックしてKubernetesクラスタを作成します。
デモでは、左側にある「Clusters」を選択します。Kubernetesの新しいバージョンを選択し、n1-standard-1のマシンタイプを選択します。 この目的では、1台のマシンで十分です。
「Create」ボタンをクリックして、クラスターへの接続を設定します。kubectlおよびgcloudユーティリティを使用します。
[2] Create a new configuration
Configuration name. “development”
[2] Log in with a new account
Pick cloud project to use
configure a default Compute Region and Zone? (Y/n)? y
Here europe-west-1b was chosen $ gcloud container clusters get-credentials dev-cluster --zone europe-west1-b --project <project_id>
[Connect]をクリックすると、最後のコマンドを取得できます。
kubectlからステータスを確認します。
gke_possible-symbol-254507_europe-west1-b_dev-cluster $ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-dev-cluster-pool-2-8096d93c-fw5w Ready <none> 17m v1.14.7-gke.10
次に、ルートプロジェクトディレクトリの下に k8s/という名前のディレクトリを作成し、Kubernetesの将来のアプリケーションを記述する次の3つのファイルを保持します:ワークスペース、デプロイメント、サービスを記述するNamespaceです。
apiVersion: v1
kind: Namespace
metadata:
name: iris $ cat deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: iris-rest
namespace: iris
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: iris
template:
metadata:
labels:
app: iris
spec:
containers:
- image: eu.gcr.io/iris-rest:v1
name: iris-rest
ports:
- containerPort: 52773
name: web $ cat service.yaml
apiVersion: v1
kind: Service
metadata:
name: iris-rest
namespace: iris
spec:
selector:
app: iris
ports:
- protocol: TCP
port: 52773
targetPort: 52773
type: LoadBalancer
これらの定義をk8s/ディレクトリからGoogle Kubernetes Engine(GKE)に送信します。
$ kubectl apply -f deployment.yaml -f service.yaml
まだDockerレジストリにeu.gcr.io/iris-rest:v1イメージを送信していないので正常に機能していません。そのため、エラーが表示されます。
NAME READY STATUS RESTARTS AGE
iris-rest-64cdb48f78-5g9hb 0/1 ErrImagePull 0 50s
$ kubectl -n iris get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
iris-rest LoadBalancer 10.0.13.219 <pending> 52773:31425/TCP 20s
Kubernetesは、 LoadBalancerサービスを検出すると、Google Cloud環境でバランサーを作成しようとします。 成功した場合、サービスは外部IP = <pending>ではなく実際のIPアドレスを取得します。
Kubernetesから少し離れる前に、CircleCIにサービスアカウントを作成して、DockerイメージをレジストリにPushし、Kubernetesデプロイを再起動する機能を持たせてみましょう。プロジェクトにサービスアカウントの編集者権限を付与します。 サービスアカウントの作成と保存に関する情報はここにあります。
少し後でCircleCIでプロジェクトを作成して設定するとき、次の3つの環境変数を追加する必要があります。
これらの変数の名前はご覧のとおりです。 GCLOUD_SERVICE_KEYの値は、サービスアカウントの作成後に「CREATE KEY」ボタンを押してキーを選択した際にGoogleが送信するJSON構造体です。
CircleCI
それでは、CircleCI に着目し、GitHubアカウントを使用して登録します([サインアップ]をクリックし、次に[GitHubでサインアップ]をクリックします)。 登録後、GitHubリポジトリのプロジェクトを含むダッシュボードが[Add Projects]タブに表示されます。 「my-objectscript-rest-docker-template」または、objectscript-rest-docker-templateリポジトリから作成された、任意の名前を付けたリポジトリの[Set Up Project]ボタンをクリックします。
注: すべてのCircleCIスクリーンショットは2019年10月の時点で作成されたものです。 新しいバージョンでは変更が加えられている場合があります。
開いたページに、プロジェクトをCircleCIで動作させる方法を説明しています。最初のステップは.circleciという名前のフォルダーを作成し、それにconfig.ymlという名前のファイルを追加することです。 この設定ファイルの構造は、公式ドキュメントで詳しく説明されています。 ファイルに含まれる基本的な手順は次のとおりです。
- リポジトリをPullする
- Dockerイメージをビルドする
- Amazon Cloudで認証する
- Google Dockerレジストリにイメージをアップロードする
- このイメージに基づいてGKEでコンテナを実行する
運が良ければ、すでに作成された構成( orbsと呼ばれる)をいくつか見つけて使うことができます。 公認のorbとサードパーティのorbがあります。 公認のGCP-GKE orbには制限がいくつもあるので、私たちのニーズを満たすサードパーティのorb(duksis)を見てみましょう。これを使用すると、設定ファイルは次のようになります(クラスタ名などの名前を実装に適した名前に置き換えてください)。
version: 2.1
orbs:
gcp-gke: duksis/gcp-gke@0.1.9
workflows:
main:
jobs:
- gcp-gke/publish-and-rollout-image:
google-project-id: GOOGLE_PROJECT_ID
gcloud-service-key: GCLOUD_SERVICE_KEY
registry-url: eu.gcr.io
image: iris-rest
tag: ${CIRCLE_SHA1}
cluster: dev-cluster
namespace: iris
deployment: iris-rest
container: iris-rest
publish-and-rollout-imageタスクの初期設定は、プロジェクトページで確認できます 。
この orb の最後の3つの通知ステップは、実際には必要ありませんが、理想的には一度作成した独自のorbを何度も使用できることができますが、ここではそれについて説明しません。
CircleCIの[Organization settings]タブで、サードパーティ製orbの使用を明確に許可する必要があることに注意してください。
最後に、すべての変更をGitHubとCircleCIに送信します。
$ git commit -m "Deploy project to GKE using CircleCI"
$ git push
CircleCIダッシュボードを確認してみましょう。
Googleサービスアカウントキーを追加するのを忘れた場合は、次のようになります。
ですから、Google Cloudの前提条件セクションの末尾で説明されているように、これらの環境変数を追加することを忘れないでください。 忘れた場合は、その情報を更新してから[Rerun workflow]をクリックしてください。
ビルドが成功すると、緑色のバーが表示されます。
CircleCI Web UIから別にKubernetesポッドの状態を確認することもできます。
NAME READY STATUS RESTARTS AGE
iris-rest-64chdb48f78-q5sbw 0/1 ImagePullBackOff 0 15m
…
iris-rest-5c9c86c768-vt7c9 1/1 Running 0 23s
その最後の行( 1/1ランニング)は良い兆候です。
テストしてみましょう。 あなたのIPアドレスは私のIPアドレスと異なることを忘れないでください。 また、HTTPを介したパスワードについては、この記事の範囲外であるため、独自に調べる必要があります。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
iris-rest LoadBalancer 10.0.4.242 23.251.143.124 52773:30948/TCP 18m
$ curl -XGET -u _system:SYS 23.251.143.124:52773/person/helloworld
Hello, world!
$ curl -XPOST -H "Content-Type: application/json" -u _system:SYS 23.251.143.124:52773/person/ -d '{"Name":"John Dou"}'
$ curl -XGET -u _system:SYS 23.251.143.124:52773/person/all
[{"Name":"John Dou"},]
アプリケーションは動作しているようです。 プロジェクトページで説明されているテストを続行できます 。
要するに、GitHub、CircleCI、およびGoogle Cloud Kubernetes Engineの組み合わせは、完全に無料ではないとしても、IRISアプリケーションのテストとデプロイメントには非常に有望と思われます。また、Kubernetesクラスターを実行すると、仮想の(そして実際の)お金が徐々に消費される可能性があることを忘れないでください。 弊社はあなたに請求される可能性のある料金については責任を負わないものとします。