Open Exchange App InterSystems IRISソリューションを CircleCI を使用して GCP Kubernetes Cluster GKE へデプロイする

Primary tabs

私たちのほとんどは、多かれ少なかれ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します。  

$ git clone git@github.com:<your_account>/my-objectscript-rest-docker-template.git

 

次に、「hello, world!」を表示するRESTエンドポイントを追加します。

エンドポイントは src/cls/Sample/PersonREST.cls クラスで定義されています。 エンドポイントは次のようになります(最初の<Route>に定義されています)。

<Route Url="/helloworld" Method="GET" Call="HelloWorld"/>
<Route Url="/all" Method="GET" Call="GetAllPersons"/>
...

 

HelloWorldメソッドを呼び出します。

ClassMethod HelloWorld() As %Status
{
          Write "Hello, world!"
          Quit $$$OK
}

 

ここで、リモートリポジトリにPushするときこれがどのように機能するかを考慮する必要があります。 考慮点は次のとおりです。

  1. Dockerイメージをビルドする。 
  2. Dockerイメージを保存する。 
  3. このイメージに基づいてコンテナを実行する。 

すでにGitHubに統合されているCircleCIサービスを使用して、Dockerイメージをビルドします。 また、Dockerイメージを保存し、保存したイメージを基にしたコンテナをKubernetesで実行できるGoogle Cloudを使用します。 これについて少し掘り下げましょう。

Google Cloudの前提条件 

サービスの無料枠を提供するGoogle Cloudのアカウントに登録したとしましょう。「Development」という名前のプロジェクトを作成し、「Create cluster」ボタンをクリックしてKubernetesクラスタを作成します。 

 

デモでは、左側にある「Clusters」を選択します。Kubernetesの新しいバージョンを選択し、n1-standard-1のマシンタイプを選択します。 この目的では、1台のマシンで十分です。  

「Create」ボタンをクリックして、クラスターへの接続を設定します。kubectlおよびgcloudユーティリティを使用します。

$ gcloud init
[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からステータスを確認します。  

$ kubectl config current-context
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です。

$ cat namespace.yaml
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 namespace.yaml
$ kubectl apply -f deployment.yaml -f service.yaml

 

まだDockerレジストリにeu.gcr.io/iris-rest:v1イメージを送信していないので正常に機能していません。そのため、エラーが表示されます。

$ kubectl -n iris get po
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という名前のファイルを追加することです。 この設定ファイルの構造は、公式ドキュメントで詳しく説明されています。 ファイルに含まれる基本的な手順は次のとおりです。 

  1. リポジトリをPullする 
  2. Dockerイメージをビルドする 
  3. Amazon Cloudで認証する 
  4. Google Dockerレジストリにイメージをアップロードする 
  5. このイメージに基づいてGKEでコンテナを実行する 

運が良ければ、すでに作成された構成( orbsと呼ばれる)をいくつか見つけて使うことができます。 公認のorbとサードパーティのorbがあります。 公認のGCP-GKE orbには制限がいくつもあるので、私たちのニーズを満たすサードパーティのorb(duksis)を見てみましょう。これを使用すると、設定ファイルは次のようになります(クラスタ名などの名前を実装に適した名前に置き換えてください)。  

$ cat .circleci/config.yml
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 add .circleci/ k8s/ src/cls/Sample/PersonREST.cls
$ git commit -m "Deploy project to GKE using CircleCI"
$ git push  

 

CircleCIダッシュボードを確認してみましょう。  

Googleサービスアカウントキーを追加するのを忘れた場合は、次のようになります。  

 

ですから、Google Cloudの前提条件セクションの末尾で説明されているように、これらの環境変数を追加することを忘れないでください。 忘れた場合は、その情報を更新してから[Rerun workflow]をクリックしてください。 

ビルドが成功すると、緑色のバーが表示されます。 

 

CircleCI Web UIから別にKubernetesポッドの状態を確認することもできます。

$ kubectl -n iris get po -w
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を介したパスワードについては、この記事の範囲外であるため、独自に調べる必要があります。

$ kubectl -n iris get svc
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クラスターを実行すると、仮想の(そして実際の)お金が徐々に消費される可能性があることを忘れないでください。 弊社はあなたに請求される可能性のある料金については責任を負わないものとします。