本記事シリーズでは、Alibaba Cloud Container Serviceを利用したCI/CD(Continuous Integration and Deployment:継続的インテグレーションとデプロイメント)のライフサイクルを実装するための実践的なアプローチを紹介しています。
本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。
#1. 前提条件
ステップバイステップのガイドを通過する前に、ユーザーは以下の前提条件を持っている必要があります。
- まともなコンピュータまたはラップトップ。
- ウェブブラウザ、Google Chrome
- 安定したインターネット接続
- Alibaba Cloudアカウント
- Linuxオペレーティングシステムの操作に関する基本的な知識。
- DockerコンテナとDockerfileの使い方についての理解と基礎知識。
- Kubernetesの基礎知識。
- GitHubのアカウント。
#2. リソース
このチュートリアルでは、サンプルアプリケーションのソースコードを含む多くのサードパーティのリソースを使用しています。GitHub のアプリケーションソースコードを提供してくれた Satya Depareddy さんに感謝します。
https://github.com/depareddy/java-webapp-docker
#3. 序章
DevOpsシリーズの後編です。前回は、コンテナサービスとコンテナレジストリの自動化機能を利用したCI/CDパイプラインの設定について見てきました。本パートでは、Alibaba Cloud Container ServiceへのDockerイメージのデプロイと、クラウド上での継続的なデプロイの流れを自動化する手順を中心に紹介します。
#4. コンテナサービスのセットアップ
コンテナクラスタを作成する前に、初めて利用する人のためにアクティベートしておく必要があるサービスがあります。クラウドリソースが有効化されていない場合は、Kubernetesクラスタの作成に進む前に有効化する必要があります。
###4.1 Kubernetesクラスタを作成する
コンテナサービスコンソールに移動し、Kubernetesを選択して、Create Kubernetes Clusterボタンをクリックします。
Alibaba Cloud上で作成できるKubernetesクラスタには、4つの異なるエディションがあります。
- Kubernetes - このエディションは、基盤となるインフラストラクチャを完全に制御できる標準のKubernetesクラスタです。マスターノードとワーカーノードを直接管理できます。
- Managed Kubernetes - これは、マスターノードがAlibaba Cloudによって管理されているManaged Kubernetesで、マスターノードの健全性やスケーラビリティを心配する必要はありません。あなたが集中する必要があるのは、ワーカーノードを制御することだけです。
- Multi-AZ Kubernetes - これは、異なるアベイラビリティゾーンにまたがるクラスタです。このオプションを選択すると、物理的なデータセンターの可用性に耐障害性が向上します。
- Serverless Kubernetes (beta) - この記事を書いている時点で、このエディションは現在ベータ版です。このエディションでは、基盤となるインフラストラクチャリソースの最高レベルの抽象化を実現しています。開発者はアプリケーションのデプロイメントにのみ焦点を当て、インフラストラクチャの管理はクラウドサービスプロバイダに任せる必要があります。
このラボでは、標準のKubernetesクラスタを選択します。
Kubernetes Clusterの設定ページに移動し、Cluster Nameに名前を指定してから、任意のRegionとZoneを選択し、VPCは「Use Existing」を選択します。VPCにはvpc-devops、VSwitchにはvswitch-devopsを選択します。
VPCとVSwitchが作成されていない場合は、「Auto Create for VPC」を選択します。
マスタノードとワーカーノードの構成、インスタンスタイプ(推奨2コア、4G RAM、40GBウルトラディスク)を選択します。
マスターノードの場合、デフォルトではマスターノードは3台に固定されており、ワーカーノードの数は2台に設定する必要があります。
マスタークラスタのログオンパスワードを「Kubernetes@2019」または任意のパスワードに設定し、SSHでクラスタにログオンできるログオン方法を選択します。CloudMonitorのオプションをクリアすることで、クラスタ作成にかかる時間を短縮することができます。すべてデフォルトのままにしておきます。
作成ボタンをクリックして、Kubernetesクラスタを作成します。
クラスタ作成中であることが画面に表示されます。クラスタ作成中は大量のサービスが作成されますので、15分~20分程度は気長にお待ちください。作成状況はコンテナサービスコンソールで確認できます。以下に正常に作成されたサービスを示します。
上記のような画面が表示されれば正常にクラスタが作成されました。クラスタ一覧に戻るをクリックします。クラスタが起動している場合は、クラスタの状態を確認してください。
クラスタ名をクリックすると詳細情報が表示されます。
API サーバー インターネットのエンドポイント。Kubernetes APIサーバがインターネット向けのサービスを提供するために使用するサービスアドレスとポート。このサービスを経由してユーザー端末でkubectlなどのツールを利用してクラスタを管理することができます。
API Server イントラネットのエンドポイント。Kubernetes APIサーバーがイントラネット向けのサービスを提供するために使用するサービスアドレスとポートです。このIPアドレスは、バックエンドの3つのマスターノードがサービスを提供するServer Load Balancerのアドレスです。
マスターノードのSSH IPアドレスです。マスターノードにSSHで直接ログオンすることができ、クラスタの日常的なメンテナンスを容易にします。
サービスアクセスドメイン。クラスタ内のサービスをテストするために使用するドメイン名です。
#5. コンテナレジストリの設定
###5.1 GitHub アカウントの作成 (オプション)
GitHub のアカウントをお持ちでない場合は、www.github.com にアクセスして新しいアカウントを作成してください。ユーザー名、メールアドレス、パスワードを入力します。そして、確認後、無料アカウントを選択します。
登録が完了すると、メインのランディングページに移動します。
###5.2 アプリケーションのソースコードをフォークする
この研究室では、GitHub をソースコードのリポジトリとして使用します。まず、既存の Git リポジトリからソースコードをフォークする必要があります: https://github.com/echoesian/java-webapp-docker これを行うには、自分の GitHub にログインし、このリポジトリに移動します https://github.com/echoesian/java-webapp-docker 画面右上のフォークをクリックします。
フォークが成功したら、自分のリポジトリにソースコードがあるはずです。
###5.3 GitHubアカウントをコンテナレジストリにバインドする
Alibaba Cloudコンソールに移動し、ページ左上の「Home」をクリックし、「Container Registry」を選択します。
最初のログオン時に下図のようなプロンプトが表示されます。左上隅でマレーシア(クアラルンプール)またはその他の地域を選択し、OKをクリックします。
コードソースに移動し、アカウントのバインドをクリックします。
ポップアップダイアログで右矢印をクリックします。GitHub アカウントにサインインするための新しいリンクが開きます。
GitHubのサインインページで、ログイン情報を入力してサインインをクリックします。
Authrizationページで、"Authroize Aliyun Developer "をクリックします。
承認されると、通知メールが送られてくるはずです。コンテナ レジストリのページに戻ります。Account Bound ボタンをクリックします。
これで、GitHub のコードソースに "Bound" と表示されるようになったはずです。
###5.4 ネームスペース
ネームスペースページに戻ります。defaut プロンプトで、[OK] をクリックします。
初めての場合は、Reset Docker Login Passwordをクリックします。
Dockerのログオンパスワードを[Aliyun-test]または[お好みのパスワード]に設定します。
ネームスペースとは、リポジトリの集合体です。企業や組織のリポジトリを1つのネームスペースにグループ化することをお勧めします。
- ネームスペースとして会社名を使用します。
- ネームスペースとしてチームや組織を使用する: misaka-team
次の図は、ネームスペースの一覧です。このラボでは、既存のネームスペース devops-workshop を使用します。
###5.5 新規リポジトリの作成
下図のようにリポジトリを作成します。リージョンをマレーシア(クアラルンプール)など任意のリージョンに設定します。
次の図に従ってパラメータを設定し、[次へ] をクリックします。先ほど作成したネームスペースを選択します。
GitHubを選択し、アカウントユーザー名とプロジェクトを入力します。リポジトリの作成をクリックします。
下図は、リポジトリが作成されたことを示しています。
管理をクリックしてリポジトリを開きます。
このリポジトリに画像をプッシュするための詳細なコマンドが表示されます。
次の図に示す最初のコマンドをECSターミナルにコピーし、リポジトリのログオンパスワードを入力します。
###5.6 Dockerイメージをコンテナレジストリにプッシュする
ターミナルのルートレベルで、アプリケーションのソースコードディレクトリに移動します。
$ cd java-webapp-docker
利用可能なdockerイメージを一覧表示します。
$ docker images
下図の 2 番目のコマンドを ECS 端末にコピーする(「ImageId」を実際のものに置き換え、「tag」を v1 に設定)。
下図の 3 番目のコマンドを ECS 端末にコピーします([tag]を v1 に設定)。
下図は画像をアップロードしているところです。
下図は、画像がアップロードされたことを示しています。
Alibaba Cloudコンソールに移動し、タグを選択します。アップロードされた画像が表示されます。
###5.7 自動画像ビルドの設定
ビルドセクションに移動し、イメージを自動的にビルドするオプションを有効にします。
他の環境でのダウンロード方法については、リポジトリガイドを参照してください。
#6. アプリケーションをコンテナサービスにデプロイする
###6.1 Kubernetesクラスタへのアプリケーションの初期展開
Container Registryのページに移動し、先ほど作成したリポジトリの管理リンクをクリックします。
「アプリケーションのデプロイ」をクリックします。
プロンプトアップページで、「デプロイ」ボタンをクリックします。
コンテナサービスのページで、すべてのデフォルトのままにして、[次へ] をクリックします。
最新の画像バージョン(1.0)を選択し、「Always pull image」を有効にして「次へ」をクリックします。
[作成]をクリックします。
次のページでは「Create Success」と表示されるはずです。デプロイが成功したかどうかを確認します。
###6.2 サービスの作成
ディスカバリー->ロードバランシングページ->サービスに移動します。作成をクリックして、アプリケーションのポートを公開する新しいサーバーロードバランサーを作成します。
サービス名を入力し、タイプは Service Load balancer と public を選択し、関連するコンテナアプリケーションを選択します。ポートマッピングでは、サービスポートとコンテナポートにそれぞれ 8080 を入力します。プロトコルはデフォルトでTCPにしておきます。
###6.3 トリガーの作成
コンテナサービス→デプロイ
新しいトリガーを作成するには、トリガーセクションに移動し、「トリガーの作成」ボタンをクリックします。
ポップアップダイアログで、アクションとして「Redeploy」を選択します。確認をクリックします。
トリガーが作成されると、以下のようにURLリンクが表示されるはずです。このリンクをクリップボードにコピーして、後のセクションで使用できるようにしてください。
コンテナレジストリのページに戻り、トリガーセクションに移動します。右上の「作成」ボタンをクリックします。
ポップアップダイアログで、以下の詳細を入力し、先にコピーしたコンテナサービスのトリガーページからURLリンクを貼り付けます。
#7. コンテナサービス上での継続的インテグレーションとデプロイメント
このラボでは、ソースコードリポジトリとしてGitHubを使用しています。ここでは、既存のタグにコード変更をコミットし、その変更をリモートのGitにプッシュします。
一般的に、コードコミットのワークフローは以下の通りです。
- タグでブランチを作成する
git branch {tagname}-branch {tagname}
git checkout {tagname}-branch
- 変更のみの場合は、修正を手動で行います。
git add .
git ci -m "Fix included"
- ローカルでタグを削除して再作成
git tag -d {tagname}
git tag {tagname}
- リモートでタグを削除して作り直します。
git push origin :{tagname} // deletes original remote tag
git push origin {tagname} // creates new remote tag
###7.1 Gitをインストールする
$yum install -y git
###7.2 ソースコードをローカルコンピュータにクローンする
次に、コードをローカルコンピュータにクローンする必要があります。それを行うには、ターミナルまたはコマンドプロンプトを開きます。以下のように入力してください。
$git clone https://github.com/echoesian/java-webapp-docker
コードが正常にクローン化された後。
###7.3 新しいタグの作成
新しいタグを作成するには
$git tag release-v1.0
###7.4 新規ブランチの作成
タグから新しいブランチを作成するには
$git branch release-v1.0-branch release-v1.0
###7.5 ブランチからのコーデをチェックする
新しいブランチのソースコードをチェックアウト
$git checkout release-v1.0-branch
###7.6 既存のソースコードの変更
プロジェクトのソースコードのホームディレクトリ - java-webapp-docker に移動します。ディレクトリを src/main/webapp に変更します。vi や vim などのエディタで index.jsp を開きます。ヘッダを変更します。
"Welcome to Alibaba Cloud DevOps v1.0"へ
<html>
<body>
<h1>Welcome to Alibaba Cloud DevOps v1.0</h1>
</body>
</html>
###7.7 変更のコミットと新しいタグの作成
次のように入力して、コミットするファイルをGitに追加します。
$git add .
そして、コードをリポジトリにコミットします。
$git commit -m "changed header text"
タグの削除と再作成をリモートで行います。
$git push origin :release-v1.0
新しいタグを作成するには、以下のようにします。
$git push origin release-v1.0
リモートの GitHub 関数のクレデンシャルキャッシュを有効にします。
$ git config credential.helper store
$ git remote -v
Username for 'https://github.com': <USERNAME>
Password for 'https://USERNAME@github.com': <PASSWORD>
###7.8 自動ビルド
変更がGitHubのリモートリポジトリにプッシュされると、Alibaba Cloud Container Registryがトリガーされ、新しいイメージが自動的にビルドされているはずです。コンテナレジストリのページに移動してビルドし、ビルドのステータスを確認します。ステータスには「Successful」と表示されているはずです。
ビルドタスクのログを見ることができます。
ポップアップページ右上の更新をクリックすると、最新のログが表示されます。
コンテナ サービスに戻り、デプロイメント セクションに移動します。simplewebapp-default をクリックし、イベントセクションに移動します。デプロイメントジョブが以前のポッドをスケールダウンしていることに気づくでしょう、最新のイメージを引っ張り出し、新しいイメージをポッドにデプロイします。
履歴バージョンのセクションに行くと、最新バージョンがリストの一番上に表示されます。以前のバージョンにロールバックする必要がある場合は、バージョンの「ロールバック」リンクをクリックしてください。
ブラウザを開き、コンテキストパス/simplewebappでサービスアドレスをキー入力します。新しいサイトには「Welcome to Alibaba Cloud DevOps v1.0」と表示されているはずです。
URLアドレスはContainer Service -> Serviceページで確認できます。ExternalEndpointのラベルに外部IPアドレスが表示されます。
シリーズの次のパートでは、このチュートリアルではKubernetesのデプロイ戦略であるローリングアップデート、ブルーグリーンリリース、カナリアリリースを実行するように拡張していきます。ご期待ください。
アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ