docker
kubernetes
container
microservices
ibmcloudprivate

アプリケーションをKubernetes環境にデプロイする(GUI)

はじめに

ローカルPC(mac)で開発したJavaコードのアプリを,サーバー環境(Kubernetes)にデプロイする手順を追ってみます。

注意:
DockerやKubernetesを触った経験のある方にとっては "当たり前の内容" です

知識のある方は,本投稿はさっと読み飛ばして,Microservice Builderの活用記事を参照してみてください。
CI/CDを開発時点で組込み,Kubernetes環境に継続的にデプロイし続けることを支援する面白いツールです。

環境

開発端末(mac)

  • OS
    • macOS High Sierra V10.13.1
  • Docker
  • Terminal <== なんでもOK
  • 開発ツール
    • bxコマンド (IBM Cloud CLI Installer)
    • devプラグイン (bxコマンド導入後に $ bx plugin install dev でOK)

デプロイ先環境(Kubernetes)

以降,IBM Cloud PrivateをICPと呼びます

アプリケーションの開発

開発環境(mac)で実施します。
この項目のゴールは, アプリケーションを組込んだDockerイメージを作成すること です。
※既にDockerイメージの用意がある場合は,アプリケーションのデプロイ に進んでください。

必要な作業は,次の2ステップです。
1) アプリを開発
2) Java EEランタイムと合わせてDockerイメージを作成する

今回はMicroservice Builderというツールを使ってコマンドを数回叩くだけで作成してみます。

以下の3つのコマンド実行します。

先にDocker for Macを起動させておく

$ bx dev create  // インタラクティブにアプリタイプを選択しながら雛形プロジェクトを作成
$ bx dev build   // アプリのビルド
$ bx dev run     // Dockerコンテナでアプリ動作 (このタイミングでDockerイメージが作成される)

(手順の簡単な説明と,スクリーンショットを確認したい場合は,こちらを参照ください。)

コンテナ上で稼働中のアプリを確認
http://localhost:9080/APPLICATION_NAME/v1/example

私の場合は,capsmaltapp2という名前でアプリを作成したので,以下のURLです。
http://localhost:9080/capsmaltapp2/v1/example

アプリ動作を確認したら,Ctrl + c でフォアグラウンドプロセスをkillします。

アプリケーションのデプロイ

この項目のゴールは,DockerイメージをKubernetes環境にデプロイし,外部からアクセスできるようにすること です。

以下,適宜スクリーンショットを使って順に説明します。

1) DockerイメージをICP上にpush
2) Deploymentを作成
3) Serviceを作成

1) DockerイメージをICP上にpush

ICPのprivate image repository(Dockerイメージを保管するプライベートリポジトリ)を使用するためのフォーマットは以下です。

Dockerイメージのフォーマット: <cluster_CA_domain>:8500/namespace/imagename
(参考) Pushing and pulling images

※cluster_CA_domainのデフォルト値は,mycluster.icp
※namespaceや,imagenameは任意でOK
(今回は,namespace = capsmaltorgimagename = capsmaltapp2:v1とします)

(補足) namespaceの指定でロールベースアクセス制御が可能です。つまり,ここで指定したnamespaceへのアクセス権限があるUser(Team)のみがイメージ操作ができるように構成できます。

ローカル環境(mac)のhostsにmycluster.icpを設定します。

$ vi /etc/hosts

以下を追記
10.132.75.83    mycluster.icp  // ICPのインストール環境のIP

Dockerイメージに対してフォーマットに沿った名前とタグを設定します。

$ docker tag capsmaltapp2 mycluster.icp:8500/capsmaltorg/capsmaltapp2:v1

確認します。

$ docker images

REPOSITORY                                             TAG                 IMAGE ID            CREATED             SIZE
capsmaltapp2                                           latest              07eab9252b01        7 minutes ago       420MB
mycluster.icp:8500/capsmaltorg/capsmaltapp2            v1                  07eab9252b01        7 minutes ago       420MB

bx dev create/build/runで作ったアプリのDockerイメージは,capsmaltapp2:latestでしたが,
同じIMAGE IDで,mycluster.icp:8500/capsmaltorg/capsmaltapp2:v1を用意できたことが分かります。

private image repositoryにログインします。

$ docker login mycluster.icp:8500

※ログイン情報の初期設定は,admin/adminです。(ICPインストール時にPW変更している場合は読み替えてください)

Dockerイメージをpushします。

$ docker push mycluster.icp:8500/capsmaltorg/capsmaltapp2:v1

2) Deploymentを作成

コンテナをまとめたPodを管理するDeploymentを作成します。

ICPコンソールにログインします。
https://10.132.75.83:8443
※ICPインストール時に設定したログイン情報を使用します。デフォルト値は,admin/adminです。

[メニュー] > [Workloads] > [Deployments] > [Create Deployment] をクリックします。

image.png

図のようなポップアップが表示されます。
image.png

以下項目の値を入れていきます。(他はデフォルト値)

Deployment作成時の項目 説明
[General] > [Name] capsmaltapp2-deployment 任意のDeployment名
[Container settings] > [Name] capsmaltapp2-container 任意のコンテナ名
[Container settings] > [Image] mycluster.icp:8500/capsmaltorg/capsmaltapp2:v1 private image repository内のイメージ名

ポップアップ下部の [Create] をクリックします。
image.png

3) Serviceを作成

外部からのアクセスを可能にするServiceを作成します。

ICPコンソールにログインします。

[メニュー] > [Workloads] > [Services] > [Create Service] をクリックします。

image.png

図のようなポップアップが表示されます。
image.png

以下項目の値を入れていきます。(他はデフォルト値)

Serivice作成時の項目 説明
[General] > [Name] capsmaltapp2-service 任意のService名
[General] > [Type] NodePort WorkerノードのIPを使ってアクセス可能にする設定
[Ports] > [Name] port 任意のPort設定名
[Ports] > [Port] 9080 ローカルからPod接続する際のポート
[Ports] > [Target Port] 9080 Pod内の規定ポート(Java EEランタイムが稼働)
[Selectors] > [Selector] app DeploymentのLabelのKey(未設定の場合のデフォルトはapp)
[Selectors] > [Value] capsmaltapp2-deployment DeploymentのLabelのValue(未設定の場合のデフォルトはDeployment名)

(補足) ServiceのSelectorでDeploymentのLabelのKey/Valueを指定することで,ルーティングを制御できます
(補足) Deploymentで,nodeSelectorを設定することで,特定のHostでPodを動作するように制御できます

ポップアップ下部の [Create] をクリックします。
image.png

以上で,Kubernetes上に外部からアクセスできる形でアプリケーションをデプロイできました。

GUIでアプリケーション稼働確認

ICPのコンソール画面から,リンクを辿ってアプリケーション稼働を確認します。

ICPコンソールにログインします。

[メニュー] > [Workloads] > [Services] > [capsmaltapp2-service] をクリックします。
image.png

図の [Node port欄のリンク] をクリックします。
port 32507/TCP の部分です。(※port番号は実施者ごとに異なる)
image.png

WebSphere Liberty (Java EEアプリケーション・サーバー)のWelcome画面が開きます。
image.png

WebSphere Liberty上で稼働するアプリケーション(capsmaltapp2)を確認します。
URLのパスに,capsmaltapp2/v1/exampleと付加します。
例) http://10.132.75.83:32507/capsmaltapp2/v1/example
image.png

まとめ

ローカル環境(mac)でアプリを含んだDockerイメージを用意して,Kubernetes環境にデプロイする手順を紹介しました。
もちろん,GUI操作はコンソールによって違います。

Kubernetesでコンテナを管理する最もベーシックな方法は,
Dockerイメージつくって,Deployment作って,Service作る ということを理解して頂ければと思います。

これでとりあえずはサービス公開ができます。

今回はド基本なので面白みはまったく無かったと思いますが,
いくつか記事を投稿しているので,何らかの形で誰かのお役に立てれば幸いです。