Subscribe to my channel https://t.me/zufarexplained
Walkthroughs, tutorials, guides, and tips. This story will teach you how to do something new or how to do something better.
This story contains new, firsthand information uncovered by the writer.
前回の記事 「マイクロサービス アーキテクチャ パターン パート 1: 分解パターン」では、マイクロサービスの魅力的な世界について詳しく説明しました。これは、マイクロサービスとそのパターンに関する私の包括的な記事シリーズの始まりでした。
論理的なステップとしては、このシリーズの第 2 部に進むことになりますが、次に調査してお話ししたいのは、これらのマイクロサービスをエンド ユーザーにシームレスに提供する重要なプロセスであると判断しました。
CI/CD は、アプリ開発のさまざまな段階に自動化を追加することで実現される、アプリを顧客に配信するための手法です。 CI/CD (継続的インテグレーションと継続的デプロイメント) を把握することで、開発者はバックエンド プロジェクトの成果物がプロジェクト リポジトリの境界を越えてどのように存在するかをより深く理解できるようになると私は信じています。この理解は、開発者の視点に根本的な変化をもたらす可能性もあります。自分の仕事を単にコード行として見るのではなく、プロジェクトのより広範なコンテキストを価値のある製品として受け入れることができるようになります。
この記事では、実際の応用を通じて CI/CD プロセスをわかりやすく説明することを目的としています。ステップバイステップのチュートリアルをモジュールごとに分けて説明し、CI/CD パイプラインを手動で構築します。これを行うために、 AWS、Docker、Kubernetes、Ansible、Git、Apache Maven、 Jenkinsなどの最新の DevOps ツールの力を活用します。それでは、この旅を始めましょう!
このモジュールは、AWS EC2 仮想サーバー インスタンスの作成専用です。この記事の一部として、Jenkins、Ansible、Kubernetes 用に 3 つの EC2 インスタンスをセットアップします。現時点では、次のモジュールに進み、「[モジュール 2]: Jenkins」、「[モジュール 6]: Ansible」、および「[モジュール 7]: Kubernetes」セクションでこのモジュールに再度アクセスできます。
https://aws.amazon.com にアクセスします。
[AWS アカウントの作成]ボタンをクリックします。
「AWS アカウントの作成」ボタンへのポインターが表示された AWS メイン Web ページのスクリーンショット
アカウント作成 Web ページの指示に従います。
https://console.aws.amazon.com/console/home に移動します。 「サインイン」ボタンをクリックします。
「サインイン」ボタンへのポインタが表示された AWS メイン Web ページのスクリーンショット
この Web ページに必要な資格情報をすべて入力します。
検索ボックスで EC2 を検索します。
検索ボックスへのポインターが表示された AWS Web ページのスクリーンショット
[EC2 サービス]をクリックして、[EC2 仮想サーバー] を選択します。
「EC2」AWS サービスへのポインタが表示された AWS Web ページのスクリーンショット
[インスタンスの起動]ボタンをクリックします。
「インスタンスの起動」ボタンへのポインタが表示された AWS Web ページのスクリーンショット
「名前とタグ」セクションに進みます。
「名前とタグ」セクションへのポインターが表示された AWS Web ページのスクリーンショット
「名前」セクションに新しい AWS EC2 仮想サーバー インスタンスの名前を入力します。
「名前とタグ」セクションの「名前」入力ボックスへのポインターが表示された AWS Web ページのスクリーンショット
「追加タグを追加」をクリックして、仮想サーバーにタグを追加することもできます。
「アプリケーションと OS イメージ (Amazon マシン イメージ)」セクションに進みます。
「アプリケーションと OS イメージ (Amazon マシン イメージ)」セクションへのポインタが表示された AWS Web ページのスクリーンショット
仮想サーバーを無料でプレイするには:
「アプリケーションと OS イメージ (Amazon マシン イメージ)」セクションの「OS」ボタンと「マシン タイプ」ボタンへのポインタが表示された AWS Web ページのスクリーンショット
「インスタンスタイプ」セクションに進みます。
「インスタンスタイプ」セクションへのポインタが表示された AWS Web ページのスクリーンショット
仮想サーバーを無料でプレイするには:
[インスタンス タイプ]セクションで、無料利用枠対象タグを持つタイプを選択します。
私の場合、それはt2.micro (ファミリー: t2 1cCPU 1 GiB メモリ、現在の世代: true)です。
「インスタンス タイプ」セクションの「インスタンス タイプ」ドロップダウンへのポインタが表示された AWS Web ページのスクリーンショット
「ストレージの構成」セクションに進みます。
「ストレージの構成」セクションへのポインターが表示された AWS Web ページのスクリーンショット
仮想サーバーを無料でプレイするには:
デフォルト設定を変更しないでください。無料利用枠の対象となるお客様は、30 GB の EBS 汎用 (SSD) または磁気ストレージを入手できます。
「ストレージの構成」セクションにあるストレージの可能な構成へのポインターが表示された AWS Web ページのスクリーンショット
「ネットワーク設定」セクションに進みます。
「ネットワーク設定」セクションへのポインターが表示された AWS Web ページのスクリーンショット
仮想サーバーのセキュリティを設定する必要があります。これをする、
デフォルトでは、仮想サーバーは (タイプ - SSH、プロトコル - TCP、ポート - 22 ) 経由でアクセスできます。追加の接続タイプが必要な場合は、追加の受信セキュリティ グループ ルールを追加して接続タイプを追加します。
「ネットワーク設定」セクションの「セキュリティ グループ」へのポインタが表示された AWS Web ページのスクリーンショット
「キーペア(ログイン)」セクションに進みます。
「Ket ペア (ログイン)」セクションへのポインターが表示された AWS Web ページのスクリーンショット
新しいキーペアをまだ作成していない場合は作成します。
「Ket ペア (ログイン)」セクションの「キー ペア名」、「キー ペア タイプ」、「秘密キー ファイル形式」へのポインターが表示された AWS Web ページのスクリーンショット
「キーペア」をまだ作成していない場合:
[インスタンスの起動]ボタンをクリックして EC2 仮想サーバー インスタンスを起動します。
「インスタンスの起動」ボタンへのポインタが表示された AWS Web ページのスクリーンショット
EC2 仮想サーバー インスタンスの作成プロセスが完了すると、次のように表示されます。
EC2 仮想サーバー インスタンスの作成プロセスが正常に完了したことを示す「成功」通知を表示する AWS Web ページのスクリーンショット
次に、 「すべてのインスタンスを表示」ボタンをクリックして「インスタンス」セクションに移動する必要があります。
実行中の EC2 インスタンスへのポインターが表示された AWS Web ページのスクリーンショット
これで、AWS EC2 仮想サーバー インスタンスが実行されていることがわかります。
次に、EC2 仮想サーバー インスタンスで JenkinsServer を構成しましょう。
Jenkins を実行するには仮想サーバーが必要です。
このチュートリアルの「[モジュール 1]: AWS EC2 仮想サーバー」セクションの手順に従ってこのステップを完了し、JenkinsServer という名前の EC2 仮想サーバー インスタンスを作成します。
セキュリティグループ設定を追加することを忘れないでください。これにより、 JenkinsとSSH がそれぞれポート8080と22で動作できるようになります。
EC2 仮想サーバー インスタンスを区別するには、 「JenkinsServer」という名前を使用します。
新しい「JenkinsServer」 AWS EC2 インスタンス用に「CI_CD_Pipeline」セキュリティ グループと「CI_CD_Pipeline_Key_Pair」を作成します。記事内でさらに再利用できます。
AWS コンソールのホームページ→ EC2 管理コンソールのダッシュボード→インスタンスに移動します。
次に、 JenkinsServerを選択し、 「接続」ボタンをクリックします。
「接続」ボタンへのポインタが表示された AWS 「インスタンス」Web ページのスクリーンショット
すると、この Web ページが表示されます。もう一度「接続」ボタンをクリックしてください。
「接続」ボタンへのポインタが表示された AWS 「インスタンスへの接続」Web ページのスクリーンショット
これで、EC2 仮想サーバー インスタンスのオンライン ターミナルが表示されます。
AWS EC2 仮想サーバーインスタンスのオンラインターミナルのスクリーンショット
次に、EC2 仮想サーバー インスタンスに Jenkins をダウンロードする必要があります。
次の指示に従ってください。
Jenkins のダウンロードWeb ページに移動します。
安定版 (LTS) および通常リリース (毎週) のオプションが表示されます。 Red Hat/Fedora/Alma/Rocky/CentOS LTS オプションを選択します。
このWebページが表示されます。
Jenkins ダウンロード Web ページのスクリーンショット
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
これで Jenkins がダウンロードされました。
Jenkins のインストールを完了するには、Jenkins キーをインポートする必要があります。
Jenkins キーをインポートするには、 「sudo rpm..」コマンドをコピーして実行する必要があります。
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
このようにして、 「rpm」パッケージ マネージャーは、インストールする Jenkins パッケージが Jenkins プロジェクトによって公開されたものとまったく同じであること、および改ざんまたは破損していないことを確認できます。
Jenkins を実行するには、EC2 仮想サーバー インスタンスにJavaをインストールする必要があります。
Javaをインストールするには、次のコマンドを使用します。
sudo amazon-linux-extras install java-openjdk11 -y
次のコマンドを使用して、 Javaが正しくインストールされたかどうかを確認します。
java -version
そのようなものが見られます。
JDK 11 がインストールされた AWS EC2 仮想サーバー インスタンスのオンライン ターミナルのスクリーンショット
Jenkins を実行するには、EC2 仮想サーバー インスタンスにfontconfigをインストールする必要があります。
このコマンドを使用します。
sudo yum install fontconfig java-11-openjdk -y
Fontconfig は、システム全体のフォント構成、カスタマイズ、アプリケーション アクセスを提供するように設計されたライブラリです。 Jenkins にはフォントをレンダリングする機能があるため、Jenkins にはこれが必要です。
前のステップでは、特定の Jenkins リポジトリを使用するように EC2 仮想サーバー インスタンスを構成し、このリポジトリに関連付けられた GPG キーをインポートしました。次に、追加した Jenkins も含め、認識しているすべてのリポジトリを検索して Jenkins パッケージを見つけるコマンドを実行する必要があります。 Jenkins リポジトリで Jenkins パッケージを見つけると、ダウンロードしてインストールします。
このコマンドを実行してみましょう。
sudo yum install jenkins -y
このコマンドを使用して Jenkins を起動できます。
sudo systemctl start jenkins
Jenkins が実行されていることを確認するには、次のコマンドを使用します。
sudo systemctl status jenkins
以下のスクリーンショットに出力がそのまま表示されます。
Jenkins がインストールされた AWS EC2 仮想サーバー インスタンスのオンライン ターミナルのスクリーンショット
これで、Jenkins が起動して実行されるようになります。
Jenkins アプリケーションにアクセスするには、任意の Web ブラウザを開いて、EC2 インスタンスのパブリック IP アドレスまたはドメイン名に続いてポート 8080 を入力します。
http://<your-ec2-ip>:8080
初めて Jenkins にアクセスすると、自動生成されたパスワードでロックされます。
AWS EC2 仮想サーバーにインストールされた Jenkins と管理者パスワードへのポインタのスクリーンショット
次のコマンドを使用して、このパスワードを表示する必要があります。
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
このパスワードをコピーし、ブラウザに戻り、管理者パスワード フィールドに貼り付けて、[続行] をクリックします。
すると、このWebページが表示されるようになります。
「Jenkins のカスタマイズ」Web ページへのポインタが表示された、AWS EC2 仮想サーバーにインストールされた Jenkins のスクリーンショット
これで、Jenkins サーバーを使用できるようになりました。
これで、Jenkins が正常に動作しているので、Jenkins パイプラインの作成を開始できます。 Jenkins パイプラインを作成するには、新しい「Freestyle プロジェクト」を作成する必要があります。新しい「Freestyle プロジェクト」を作成するには、Jenkins ダッシュボードに移動し、 「新しい項目」ボタンをクリックする必要があります。
「新しい項目」ボタンへのポインターが表示された Jenkins ダッシュボード Web ページのスクリーンショット
Github の名前「Freestyle プロジェクト」(「パイプライン」という名前は今後使用されます) を入力し、 「OK」ボタンをクリックします。
「項目名」項目ボックスへのポインターが表示された Jenkins 新しい項目 Web ページのスクリーンショット
次に、パイプラインの説明を入力します。
「説明」入力ボックスへのポインターが表示された Jenkins ジョブ構成 Web ページのスクリーンショット
次に、「適用」ボタンをクリックして「保存」します。その後、このチュートリアルで構築するパイプラインの基礎を作成したことになります。
Jenkins が AWS EC2 仮想サーバー インスタンス上で実行されるようになったので、パイプラインを使用して Git を構成できます。
Git は、ソフトウェア チームが特別な種類のデータベース内のコードに対するすべての変更を追跡できるように設計された、無料のオープンソースの分散バージョン管理システム (VCS) です。間違いがあった場合、開発者は時計を戻し、コードの以前のバージョンを比較して、チームメンバー全員への混乱を最小限に抑えながら間違いを修正することができます。 VCS は特に次の場合に役立ちます。
最も一般的なバージョン管理システムである Git を使用すると、プロジェクトの Github リポジトリから、Jenkins がインストールされている EC2 仮想サーバー インスタンスに最新のコードをプルできます。
このコマンドを使用して Git をインストールします。
sudo yum install git -y
次に、次のコマンドを使用して、Git が動作していることを確認します。
git --version
現在、Git は EC2 仮想サーバー インスタンス上で正常に動作しています。
Git は EC2 仮想サーバー インスタンス上で正常に動作しているため、Jenkins を Git と統合できるようになりました。
この統合を開始するには、Jenkins Github プラグインをインストールしましょう。
Jenkins ダッシュボード セクションに移動します。
Jenkins ダッシュボードのスクリーンショット
「Jenkins の管理」ボタンをクリックし、 「プラグインの管理」ボタンをクリックします。
「プラグインの管理」ボタンへのポインターが表示された Jenkins ダッシュボードのスクリーンショット
「利用可能なプラグイン」ボタンをクリックします。
「利用可能なプラグイン」ボタンへのポインターが表示された Jenkins プラグイン マネージャー Web ページのスクリーンショット
Githubプラグインの検索ボックスを見つけます。
「Github」プラグインへのポインターが表示された Jenkins Plugin Manager Web ページのスクリーンショット
Githubプラグインを選択します。
Githubプラグインを選択します。そして、 「再起動せずにインストール」ボタンをクリックします。
「再起動せずにインストール」ボタンへのポインタが表示された Jenkins Plugin Manager Web ページのスクリーンショット
Github プラグインのダウンロードが完了するまで待ちます。
Github プラグインをダウンロードしている Jenkins Plugin Manager Web ページのスクリーンショット
はい! Jenkins Github プラグインがインストールされています。
GitHub Jenkins プラグインがインストールされたので、最終的に Jenkins を Git と統合するようにこのプラグインを構成できます。そのためには、「トップページに戻る」ボタンをクリックしてメインページに戻る必要があります。
「トップページに戻る」ボタンへのポインタが表示された Jenkins Plugin Manager Web ページのスクリーンショット
次に、メイン ページで、 「Jenkins の管理」ボタンをクリックし、 「グローバル ツール構成」ボタンをクリックする必要があります。
「グローバル ツール構成」ボタンへのポインターが表示された Jenkins Plugin Manager Web ページのスクリーンショット
次に、グローバル ツール構成 Web ページで、Git セクションに移動する必要があります。
「名前」および「Git 実行可能ファイルへのパス」入力ボックスへのポインターが表示された Jenkins Global Tool Configuration Web ページのスクリーンショット
[Git] セクションでは、コンピューター上の Git の名前とパスを指定して Git を構成する必要があります。
次に、 「適用」ボタンと「保存」ボタンをクリックします**。**
これで、Jenkins Github プラグインの構成が完了しました。
Jenkins Github プラグインがインストールされて構成されたので、パイプライン内でこのプラグインを利用できるようになります。これにより、モジュール 2 で作成したパイプラインが、指定した GitHub リポジトリからプロジェクト コードをプルできるようになります。
このプラグインをパイプラインに統合するには、[ソース コード管理] セクションに移動し、パイプラインで Git を選択する必要があります。次に、プロジェクト リポジトリの URL を指定する必要があります。プロジェクト リポジトリが Github で公開されている場合、認証情報を提供する必要はありません。プロジェクト リポジトリが Github 上でプライベートである場合は、認証情報を提供する必要があります。
「ソース コード管理」設定を含む Jenkins ジョブ構成 Web ページのスクリーンショット
次のリポジトリ URL: https://github.com/Sunagatov/Hello.gitで私のプロジェクトを使用できます。
それをコピーして「リポジトリ URL」入力に貼り付けるだけです。次に、 「適用」ボタンと「保存」ボタンをクリックして、Git とパイプラインの統合を完了します。
これで、更新されたパイプラインを使用して、Github からプロジェクトをプルできるようになりました。これを行うには、**「今すぐビルド」** ボタンをクリックする必要があります。その結果、ビルド履歴にビルドが成功したことが表示されます。
「今すぐビルド」ボタンと「ビルド履歴」セクションへのポインターを含む Jenkins Web ページのスクリーンショット
ビルド履歴から最初のビルドを開きます。
成功したジョブ結果を含む Jenkins Pull_Code_From_Github_Job のスクリーンショット
これで、最初のビルドの成功したジョブ結果が表示されます。 AWS EC2 ターミナルを開いた場合。パイプラインが正常に動作していることを確認できます。
このコマンドを使用するだけです。
cd /var/lib/jenkins/workspace/{your pipeline name}
このようにして、Github からのプロジェクトが AWS EC2 仮想サーバー インスタンスにプルされたことがわかります。
EC2 インスタンスのターミナルにダウンロードされた Github プロジェクトのスクリーンショット
Apache Maven は、ソフトウェア開発において広く使用されているビルド自動化およびプロジェクト管理ツールです。プロジェクトの依存関係を管理し、一貫したビルド ライフサイクルを提供することで、コードのコンパイル、テスト、パッケージ化のプロセスを合理化します。 Maven は、XML ベースの構成ファイル (POM ファイル) を使用してプロジェクトの構造、依存関係、およびタスクを定義し、開発者が複雑なソフトウェア プロジェクトを効率的に管理および展開できるようにします。
Git をパイプラインに統合したので、プロジェクトをビルド、テスト、パッケージ化できる Apache Maven を組み込むことでパイプラインをさらに強化できます。これを行うには、Jenkins と Git がインストールされている AWS EC2 仮想サーバー インスタンスに Apache Maven をインストールする必要があります。
Apache Maven をダウンロードするには、 「/opt」ディレクトリに移動します。
cd /opt
そして、このコマンドを使用します。
sudo wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz
このコマンドは、最新の公式 Apache Maven をダウンロードします (公式 Apache Maven Web サイトで最新バージョンを確認してください)。最新の公式 Apache Maven リリースを見つけるには、リンクhttps://maven.apache.org/download.cgiを使用してください。
次のコマンドを使用して、ダウンロードしたアーカイブから Apache Maven を抽出します。
sudo tar -xvzf apache-maven-*.tar.gz
このコマンドを使用してルート フォルダーに移動します。
cd ~
このコマンドを使用して.bash_profileファイルを編集します。
vi .bash_profile
JAVA_HOME変数と M2_HOME 変数を追加します。
JAVA_HOME変数には JDK11 へのパスを割り当て、 M2_HOME変数には Maven ディレクトリへのパスを割り当てます。
JDK パスを検索するには、次のコマンドを使用します。
sudo find / -name java
.bash_profile ファイルを含む AWS EC2 仮想サーバー インスタンスのターミナル Web ページのスクリーンショット
VIMの使い方
変更を保存します。
次に、このコマンドを実行してシステム変数を更新します。
source .bash_profile
$PATHを確認するには、次のコマンドを使用します。
echo $PATH
Apache Maven を確認するには、次のコマンドを使用します。
mvn -v
すべてを正しく実行すると、Apache Maven のバージョンを表示できるようになります。
Apache Maven のバージョンを使用した AWS EC2 仮想サーバー インスタンスのターミナル Web ページのスクリーンショット
Apache Maven は EC2 インスタンスで使用できるため、Apache Maven プラグインをインストールしてパイプラインと統合できます。
これを実現するには、次の手順に従います。
AWS EC2 仮想サーバーにインストールされた Jenkins と Maven プラグインへのポインターのスクリーンショット
ダウンロードプロセスが終了するまで待ちます。
そして「トップページに戻る」ボタンをクリックしてください。
AWS EC2 仮想サーバーにインストールされた Jenkins と Maven プラグインのダウンロード プロセスへのポインターのスクリーンショット
Apache Maven Jenkins プラグインが正常にインストールされると、モジュール 2 と 3 で作成および更新したパイプライン内でこのプラグインを利用できるようになります。
これを行うには、次の手順に従います。
AWS EC2 仮想サーバーにインストールされた Jenkins と JDK 設定へのポインターのスクリーンショット
次に「Maven」セクションに進みます。 「Maven を追加」ボタンをクリックします。 「自動的にインストールする」のチェックを外します。
次に、名前とMAVEN_HOMEパスを追加します。
AWS EC2 仮想サーバーにインストールされた Jenkins と Apache Maven 構成へのポインターのスクリーンショット
「適用」ボタンと「保存」ボタンをクリックします。
これで、Apache Maven Jenkins プラグインの構成が完了しました。
Apache Maven GitHub プラグインがインストールされて構成されたので、パイプライン内で Apache Maven を利用できるようになりました。これにより、「[モジュール 2]: Jenkins Server」で作成したパイプラインでプロジェクト コードを構築し、jar アーティファクトを作成できるようになります。
Apache Maven をパイプラインに統合するには、次の手順に従う必要があります。
「適用」ボタンと「保存」ボタンへのポインターを含む、パイプライン構成の「ビルドステップ」セクションのスクリーンショット
最後に、 「適用」ボタンと「保存」ボタンをクリックして、Apache Maven とパイプラインの統合を完了する必要があります。
これで、更新されたパイプラインを使用して Github プロジェクトを構築できるようになりました。これを行うには、**「今すぐビルド」** ボタンをクリックする必要があります。その結果、ビルド履歴にジョブの成功結果が表示されます。
AWS EC2 ターミナルを開いた場合。パイプラインが正常に動作していることを確認できます。
このコマンドを使用するだけです。
cd /var/lib/jenkins/workspace/{your pipeline name}/target
こうすることで、GitHub からのプロジェクトのビルドが成功したことを示す JAR アーティファクトを確認できます。
次に、Docker と Ansible をインストールする新しい EC2 インスタンスを「Ansible Server」という名前で作成しましょう。
このチュートリアルの「 AWS EC2 仮想サーバー インスタンスの起動」セクションの手順に従って、このステップを完了します。セキュリティグループ設定を追加することを忘れないでください。これにより、Docker と SSH がそれぞれポート 8080 と 22 で動作できるようになります。
「接続」ボタンをクリックします。
「接続」ボタンへのポインタが表示された AWS Web ページのスクリーンショット
これで、EC2 仮想サーバー インスタンスのオンライン ターミナルが表示されます。
AWS EC2 仮想サーバーインスタンスのオンラインターミナルのスクリーンショット
sudo chown ansible-admin:ansible-admin /opt/docker
次に、Ansible EC2 インスタンスに docker をインストールする必要があります。これを行うには、新しい docker フォルダーを作成する必要があります。
sudo mkdir /opt/docker
次に、次のコマンドを実行して docker をインストールします。
sudo yum install docker -y
Docker 管理者権限を付与するには、現在のユーザー「ansible-admin」をEC2 仮想サーバー「AnsibleServer」の Docker グループに追加する必要があります。
sudo usermod -a -G docker ansible-admin
これらの変更を有効にするには、ログアウトしてから再度ログインする必要があります。
その後、次のコマンドを実行できます
id ansible-admin
新しい docker ユーザーが存在することを確認します。
Docker ユーザーへのポインターを含む Ansible EC2 インスタンスのスクリーンショット
これで、Docker が Ansible EC2 インスタンスにインストールされたので、次のコマンドを実行して起動できるようになります。
sudo systemctl start docker
Docker が起動すると、次のコマンドを実行できます。
sudo systemctl status docker
docker がアクティブで現在実行中であることを確認します。
アクティブな Docker ステータスを示す Ansible EC2 インスタンスのスクリーンショット
パイプラインの最終バージョンでは、プロセスに GitHub プロジェクトから新しい Docker イメージを作成し、それを Docker Hub にプッシュすることが含まれます。これを実現するには、GitHub プロジェクトに Dockerfile が含まれている必要があります。
「 [モジュール 3]: Git と Github」モジュールで提供されたプロジェクト「Hello」を使用した場合、このプロジェクト リポジトリには既に Dockerfile が含まれているため、新しい Dockerfile を作成する必要はありません。
FROM eclipse-temurin:17-jre-jammy ENV HOME=/opt/app WORKDIR $HOME ADD hello-0.0.1-SNAPSHOT.jar $HOME ENTRYPOINT ["java", "-jar", "/opt/app/hello-0.0.1-SNAPSHOT.jar" ]
独自のプロジェクト リポジトリを使用していて、そこに Dockerfile が含まれていない場合は、新しい Dockerfile を作成する必要があります。
新しい Dockerfile を作成するには、次のコマンドを実行すると、新しいファイルが作成されます。
sudo touch Dockerfile
次に、コンテナ化されたアプリケーション環境を構築する方法を説明する一連のコマンドをこのファイルに入力します。これらのコマンドには、イメージへのファイルのコピー、ソフトウェアのインストール、環境変数の設定、コンテナーの構成などのアクションが含まれます。
これらのコマンドを Dockerfile に入力するには、次のコマンドを実行します。
vim Dockerfile
Dockerfile を使用する準備ができました。
Dockerfile を使用する準備ができたので、**"JenkinsServer"**EC2 インスタンスからプロジェクトの JAR アーティファクトをコピーし、それを"AnsibleServer" EC2 インスタンスに貼り付けます。この転送はパイプラインを通じてさらに自動化されることに注意することが重要です。
このステップを完了すると、セットアップした Docker 環境とともに Dockerfile をテストする準備が整います。
テストを開始する前に、Dockerhub で必ず認証を行ってください。次のコマンドを実行します。
docker login
このコマンドでは、ユーザー名とパスワードを含む Dockerhub ログイン資格情報の入力を求められます。
「AnsibleServer」EC2インスタンスで成功したdockerログインのスクリーンショット
これで、 Dockerへのログインプロセスが完了し、テストを続行する準備が整いました。
Dockerhub へのログインが完了すると、準備した Dockerfile のテストを開始する準備が整いました。
このコマンドを実行してdockerイメージを作成します。
docker build -t hello:latest .
次に、後続のコマンドを実行して、イメージの Dockerhub へのアップロードを容易にするタグを確立します。
docker tag hello:latest zufarexplainedit/hello:latest
最後に、このコマンドを実行して、Docker イメージを Dockerhub にプッシュします。
docker push zufarexplainedit/hello:latest
これらの手順に従って、Dockerhub アカウントに移動して、新しいイメージが表示されるかどうかを確認します。
新しい画像が追加された Dockerhub アカウントのスクリーンショット
画像が効果的に追加されたことが確認できるはずです。この結果により、Docker 環境のインストールが成功し、Dockerfile が正しいことが確認されます。
次に、EC2 仮想サーバー インスタンス上で Ansible サーバーを構成しましょう。
Ansible を実行するには仮想サーバーが必要です。
このチュートリアルの「[モジュール 1]: AWS EC2 仮想サーバー」セクションの指示に従ってこのステップを完了し、Ansible の EC2 仮想サーバー インスタンスを作成します。
セキュリティグループ設定を追加することを忘れないでください。これにより、 AnsibleとSSH がそれぞれポート8080と22で動作できるようになります。
EC2 仮想サーバー インスタンスを区別するには、 「AnsibleServer」という名前を使用します。
「CI_CD_Pipeline」セキュリティ グループと「CI_CD_Pipeline_Key_Pair」を新しい「AnsibleServer」 EC2 インスタンスに再利用できます。
AWS コンソールのホームページ → EC2 管理コンソールのダッシュボード → インスタンス → AnsibleServer に移動します。
次に「接続」ボタンをクリックします。
「接続」ボタンへのポインタが表示された AWS Web ページのスクリーンショット
すると、この Web ページが表示されます。もう一度「接続」ボタンをクリックしてください。
「接続」ボタンへのポインタが表示された AWS 「インスタンスへの接続」Web ページのスクリーンショット
これで、EC2 仮想サーバー インスタンスのオンライン ターミナルが表示されます。
AWS EC2 仮想サーバーインスタンスのオンラインターミナルのスクリーンショット
次に、EC2 仮想サーバー インスタンス上で Ansible Server を構成しましょう。
EC2 仮想サーバー インスタンスで AnsibleServer を構成する場合、最初に行う必要があるのは、ホスト名を変更することです。
やりましょう。次のコマンドを実行してホスト名ファイルを開きます。
sudo vi /etc/hostname
次のようなものが表示されるはずです。
ホスト名ファイルを含む AWS EC2 仮想サーバー インスタンスのスクリーンショット
このホスト名を「ansible-server」に置き換えます。次に、再起動します。
sudo init 6
ホスト名へのポインターが表示された AWS EC2 仮想サーバー インスタンスのターミナルのスクリーンショット
次に、新しいansible-adminユーザーを AWS EC2 仮想サーバー インスタンスに追加しましょう。
これを行うには、次のコマンドを使用します。
sudo useradd ansible-admin
次に、 ansible-adminユーザーのパスワードを設定します。
sudo passwd ansible-admin
また、 sudoersファイルを編集してユーザー権限を構成する必要があります。
sudo visudo
このsudoersファイルに「ansible-admin ALL=(ALL) ALL」を追加します。
管理者権限へのポインタが表示された AWS EC2 仮想サーバー インスタンスのターミナルのスクリーンショット
また、 /etc/ssh/sshd_configファイルを編集して PasswordAuthentication を有効にする必要があります。
sudo vi /etc/ssh/sshd_config
管理設定へのポインターが表示された AWS EC2 仮想サーバー インスタンスのターミナルのスクリーンショット
次に、サービスをリロードしてこれらの変更を確認する必要があります。
sudo service sshd reload
このコマンドを実行すると、次のように表示されます。
sshd リロード結果へのポインターが表示された AWS EC2 仮想サーバー インスタンス ターミナルのスクリーンショット
これで、このコマンドを使用して、以降のすべてのコマンドに sudo を追加することを避けることができます。
sudo su - ansible-admin
この記事では、K8s EC2 仮想サーバー インスタンスなどのリモート サーバーをさらに管理することを計画しています。このため、SSH キーを設定する必要があります。
ssh-keygen
このコマンドを実行すると、次のように表示されます。
ssh-keygen の結果へのポインターが表示された AWS EC2 仮想サーバー インスタンスのターミナルのスクリーンショット
これで SSH キーが生成され、使用できるようになりました。
これで、 「AnsibleServer」 EC2 仮想サーバー インスタンスに Ansible をインストールできるようになりました。
やりましょう。
このコマンドを実行して Ansible をインストールします。
sudo amazon-linux-extras install ansible2
Ansible を確認するには、次のコマンドを使用します。
ansible --version
このコマンドを実行すると、次のように表示されます。
sudo yum install ansible の結果へのポインターが表示された AWS EC2 仮想サーバー インスタンスのターミナルのスクリーンショット
Ansible は「AnsibleServer」 EC2 仮想サーバー インスタンスにインストールされているため、Ansible と統合するように Jenkins を構成できます。 Jenkins を Ansible がインストールされている EC2 仮想サーバー インスタンスおよびKubernetesがインストールされている他の EC2 仮想サーバー インスタンスと統合するには、「Publish over SSH」プラグインをインストールする必要があります。
「ダッシュボード」 →「 Jenkinsの管理」 → 「システムの構成」 → 「利用可能なプラグイン」に移動します。
次に、検索ボックスに「Publish over SSH」と入力します。
AWS EC2 仮想サーバーにインストールされた Jenkins と、「利用可能なプラグイン」Web ページへのポインターのスクリーンショット
「再起動せずにインストール」ボタンをクリックします。ダウンロードプロセスが終了するまで待ちます。
AWS EC2 仮想サーバーにインストールされた Jenkins と「ダウンロードの進行状況」Web ページへのポインタのスクリーンショット
これで、「Publish over SSH」プラグインが Jenkins EC2 仮想サーバー インスタンスにインストールされました。
Apache Maven Jenkins プラグインが正常にインストールされると、モジュール 2 と 3 で作成および更新したパイプライン内でこのプラグインを利用できるようになります。
これを行うには、次の手順に従います。
「ダッシュボード」 → 「Jenkins の管理」 → 「システムの構成」 → 「SSH 経由で公開」に移動します。
「Publish over SSH」プラグインを使用した AWS EC2 仮想サーバー インスタンス ターミナルのスクリーンショット
ホスト名、ユーザー名、秘密キー (該当する場合はパスワード) など、必要なデータをスクリーンショットにあるとおりにすべて入力します。
「Publish over SSH」プラグインを使用した AWS EC2 仮想サーバー インスタンス ターミナルのスクリーンショット
次に、 「適用」ボタンと「保存」ボタンをクリックします。
これで、 「Publish over SSH」 Jenkins プラグインの構成が完了しました。
次に、「設定のテスト」をクリックして、プラグインが正しく動作していることを検証します。
「Test Configuration」ボタンを備えた「Publish over SSH」プラグインのスクリーンショット
左側では、テスト プラグインの設定ステータスが「成功」であることがわかります。これはプラグインの設定が正しいことを意味します。
AnsibleServer EC2 インスタンス上に、プロジェクト JAR が保存される新しいフォルダーを作成する必要があります。この jar は、後で Docker イメージを作成するために使用されます。
はじめましょう。
AnsibleServer EC2 インスタンスの「/opt」フォルダーに移動します。
cd /opt
そこに新しいフォルダー「docker」を作成します。
sudo mkdir docker
この「docker」フォルダーに権限を与えます。
sudo chown ansible-admin:ansible-admin docker
次に、このコマンドを実行して「docker」フォルダーの権限を確認します。
ll
「docker」フォルダーに「ansible-admin」ユーザーでアクセスできることがわかります。
「AnsibleServer」EC2インスタンスの「docker」フォルダーのスクリーンショット
「Publish over SSH」 Github プラグインがインストールおよび構成されたので、「[モジュール 2]: Jenkins Server」で作成したパイプラインにプラグインを統合して、プロジェクトの jar アーティファクトを「 JenkinsServer」から「AnsibleServer」 。
「Publish over SSH」 Github プラグインをパイプラインに統合するには、次の手順に従う必要があります。
パイプライン構成の「SSH 経由でビルド アーティファクトを送信する」セクションのスクリーンショット
最後に、 「適用」ボタンと「保存」ボタンをクリックして、 「SSH 経由で公開」プラグインとパイプラインの統合を完了する必要があります。
これで、更新されたパイプラインを使用して、プロジェクト jar アーティファクトを「 JenkinsServer」から「AnsibleServer」に転送できるようになりました。これを行うには、 「今すぐビルド」ボタンをクリックする必要があります。その結果、ビルド履歴にジョブの成功結果が表示されます。
「AnsibleServer」 AWS EC2ターミナルを開いた場合。パイプラインが正常に動作していることを確認できます。
このコマンドを使用するだけです。
cd /opt/docker
こうすることで、GitHub からのプロジェクトのビルドが成功したことを示す JAR アーティファクトを確認できます。
プロジェクト jar アーティファクトを含む /opt/docker ディレクトリのスクリーンショット
Ansible Playbook を実行するときは、それを実行するホストを指定します。これは 2 つの方法で行うことができます。
hosts
パラメーターを IP アドレスまたはホスト名のリストに設定できます。/etc/ansible/hosts
です。
/etc/ansible/hosts
を編集すると、Playbook を実行するたびにホストの IP アドレスを書き出すことなく、ホストのグループを簡単に管理できます。
次のコマンドを実行して、AnsibleServer EC2 インスタンスのホストを調べてみましょう。
sudo ifconfig
AnsibleServer EC2 インスタンスのネットワークインターフェース設定のスクリーンショット
AnsibleServer EC2 インスタンス ホストを見つけたら、次のコマンドを実行して、それを Ansible hosts ファイルに追加できます。
sudo vi /etc/ansible/hosts
「[ansible]」を参照として追加することもできます
Ansible hosts ファイルのスクリーンショット
サーバーのクラスターを管理していて、そのすべてにプレイブックを適用したい場合は、プレイブックで各サーバーの IP アドレスを指定する代わりに、すべてのサーバーをインベントリ ファイルのグループに追加して、プレイブック内のグループ。
Ansible は、リモート サーバー上のタスクを自動化するように設計されています。パスワードレス SSH 認証により、Ansible は手動でパスワードを入力しなくてもこれらのサーバーに接続できるようになります。
このコマンドを実行して、ansible-admin ユーザーの SSH キーを使用して、自分のコンピューターから別のコンピューター (IP アドレス 172.31.34.41 のコンピューターなど) への安全な接続を作成します。
sudo ssh-copy-id -i /home/{your user name}/.ssh/id_rsa.pub {your user name}@{your host address}
私の場合はこんな感じです。
sudo ssh-copy-id -i /home/ansible-admin/.ssh/id_rsa.pub ansible-admin@172.31.34.41
パスワードなしの ssh 認証のインストールが成功した結果のスクリーンショット
「追加されたキーの数: 1」が表示されます。パスワードなしの SSH 認証のインストールが正常に完了したことを意味します。
Ansible の設定がすべて完了し、準備が整ったので、パイプライン用の新しい Ansible プレイブックを作成できます。この Playbook により、Ansible が新しい Docker イメージを作成して Dockerhub に送信できるようになります。
その方法は次のとおりです。
touch hello-app.yml
hello-app.yml
ファイルを編集します。このコマンドを使用して編集用に開きます。 vi hello-app.yml
--- - hosts: ansible user: root tasks: - name: create docker image command: docker build -t hello:latest . args: chdir: /opt/docker - name: create tag to push image onto dockerhub command: docker tag hello:latest zufarexplainedit/hello:latest - name: push docker image onto dockerhub command: docker push zufarexplainedit/hello:latest
Docker タスク用の Ansible プレイブックを使用する準備ができました。
Ansible、Ansible Playbook、AnsibleServer、および JenkinsServer がすべて適切に構成されたら、Ansible Playbook をテストします。
Ansible プレイブックの場所に移動します。
cd /opt/docker
次に、以下のコマンドを実行します。
sudo -u ansible-admin ansible-playbook /opt/docker/hello-app.yml
完了すると、Ansible プレイブックの実行結果が正常に表示されることがわかります。
Docker タスクの Ansible Playbook の正常な実行結果のスクリーンショット
さらに、Dockerhub アカウントにアクセスして、新しいイメージが表示されるかどうかを確認してください。
新しい画像が追加された Dockerhub アカウントのスクリーンショット
新しく追加された画像が表示されるはずです。この結果により、Ansible プレイブックが正しいことが確認されます。
「Publish over SSH」 Github プラグイン、Ansible、Docker がインストールおよび設定されたので、「[モジュール 2]: Jenkins Server」で作成したパイプラインにそれらをすべて統合して、プロジェクトの jar アーティファクトを転送できるようになりました。 「 JenkinsServer」から「AnsibleServer」に変更し、プロジェクトから新しい Docker イメージを構築して、この Docker イメージを Dockerhub にプッシュします。
これを実現するには、次の手順に従う必要があります。
パイプライン構成の「SSH 経由でビルド アーティファクトを送信する」セクションのスクリーンショット
最後に、 「適用」ボタンと「保存」ボタンをクリックして、パイプラインとの Ansible Docker タスクの統合を終了します。
これで、アップグレードされたパイプラインをテストして、プロジェクトの jar アーティファクトを「 JenkinsServer」から「AnsibleServer」にシームレスに転送し、プロジェクトから新しい Docker イメージを構築して、この Docker イメージを Dockerhub にプッシュできるようになりました。これを行うには、 「今すぐビルド」ボタンをクリックする必要があります。その結果、ビルド履歴にジョブの成功結果が表示されます。
さらに、Dockerhub アカウントにアクセスして、新しいイメージが表示されるかどうかを確認してください。
新しい画像が追加された Dockerhub アカウントのスクリーンショット
新しく追加された画像が表示されるはずです。この結果は、Docker タスクを含む Ansible プレイブックがパイプラインに正常に統合されたことを確認します。
次に、EC2 インスタンスで K8 を構成しましょう。新しい EC2 インスタンスを作成し、 Kubernetesクラスターとさらに対話するための kubectl コマンドライン ツールをインストールします。
このチュートリアルの「 AWS EC2 仮想サーバー インスタンスの起動」セクションの手順に従って、このステップを完了します。
セキュリティグループ設定を追加することを忘れないでください。これにより、すべてのツールとSSH がそれぞれポート8080と22で動作できるようになります。
EC2 仮想サーバー インスタンスを区別するには、 「K8sServer」という名前を使用します。
「CI_CD_Pipeline」セキュリティ グループと「CI_CD_Pipeline_Key_Pair」を新しい「K8sServer」 EC2 インスタンスに再利用できます。
「接続」ボタンをクリックします。
「接続」ボタンへのポインタが表示された AWS Web ページのスクリーンショット
これで、EC2 仮想サーバー インスタンスのオンライン ターミナルが表示されます。
AWS EC2 仮想サーバーインスタンスのオンラインターミナルのスクリーンショット
EC2 仮想サーバー インスタンス上で KuberenetesServer を構成する場合、最初に行う必要があるのは、ホスト名を変更することです。
やりましょう。次のコマンドを実行してホスト名ファイルを開きます。
sudo vi /etc/hostname
このようなものが表示されるはずです。
ホスト名ファイルを含む AWS EC2 仮想サーバー インスタンスのスクリーンショット
このホスト名を「kubernetes-server」に置き換えて再起動します。
sudo init 6
ホスト名が変更されました。
ホスト名へのポインターが表示された AWS EC2 仮想サーバー インスタンスのターミナルのスクリーンショット
このコマンドを使用してAWS のバージョンを確認します。
aws --version
こうすることで、現在の aws-cli バージョンを確認できます。
aws バージョンのコマンド結果を含む AWS EC2 仮想サーバー インスタンスのオンライン ターミナルのスクリーンショット
バージョンaws-cli/1.18が表示される場合は、最新バージョンをダウンロードする必要があります。
EC2 インスタンスに古い aws-cli バージョンがあることがわかったので、それを更新する必要があります。それには、AWS → ドキュメント → AWS コマンドラインインターフェイス → バージョン 2 のユーザーガイドに移動します。
バージョン 2 のユーザー ガイドを含む AWS EC2 仮想サーバー インスタンス Web ページのスクリーンショット
curl コマンドをコピーして貼り付けます。
まず、このコマンドを実行して awscli バージョン 2 をダウンロードします。
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
ダウンロードプロセスが開始されるまで待ちます。
このようなものが表示されるはずです。
aws バージョン 2 の結果をダウンロードしている AWS EC2 仮想サーバー インスタンスのオンライン ターミナルのスクリーンショット
次に、このコマンドを実行して、awscli バージョン 2 アーカイブを解凍する必要があります。
unzip awscliv2.zip
3 番目に、このコマンドを実行して awscli バージョン 2 をインストールする必要があります。
sudo ./aws/install
次に、Kubernetes EC2 仮想サーバー インスタンスのオンライン ターミナルをリロードします。
次に、このコマンドを使用して AWS のバージョンを確認します。
aws --version
aws cli に aws-cli/2 があることがわかります。
AWS EC2 仮想サーバー インスタンスのオンライン ターミナルと aws バージョン コマンドの結果のスクリーンショット
Kubectl は、基盤となるインフラストラクチャに関係なく、Kubernetes クラスターと対話するための基本的なコマンドライン ツールです。これにより、Kubernetes クラスター内でリソースの管理、アプリケーションのデプロイ、ネットワークの構成、ログへのアクセス、その他のさまざまなタスクの実行が可能になります。
次に、Kubernetes クラスターとさらに対話するために、kubectl コマンドライン ツールをインストールする必要があります。そのためには、 「AWS」 → 「ドキュメント」 → 「Amazon EKS」 → 「ユーザーガイド」 →「 kubectl のインストールまたは更新」 → 「Linux」に移動する必要があります。
または、リンクhttps://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.htmlをクリックするだけです。
AWS EKS ユーザーガイドのスクリーンショット
まず、このコマンドを実行してkubectlをダウンロードします。
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.27.1/2023-04-19/bin/linux/amd64/kubectl
ダウンロードプロセスを待ちます。
このようなものが表示されます。
kubectl の結果をダウンロードしている AWS EC2 仮想サーバー インスタンスのオンライン ターミナルのスクリーンショット
kubectlに権限を与えます。
chmod +x kubectl
kubectl を /usr/local/bin フォルダーに移動します。
sudo mv kubectl /usr/local/bin
kubectlのバージョンを確認してください。
kubectl version --output=yaml
Eksctlは、特に Amazon EKS サービスに合わせて調整された別のコマンドライン ツールです。 Eksctl を使用すると、AWS EKS クラスターの作成、ノード グループの管理、および AWS インフラストラクチャのセットアップと管理の多くを抽象化することによる IAM ロールや他の AWS サービスとの統合など、EKS に固有のタスクを実行できます。
コマンドを実行してkubectlをダウンロードします。
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
eksctl を /usr/local/bin フォルダーに移動します。
sudo mv /tmp/eksctl /usr/local/bin
eksctlのバージョンを確認してください。
eksctl version
バージョンが表示されるはずです
eksctl バージョンを使用した AWS EC2 仮想サーバー インスタンスのオンライン ターミナルのスクリーンショット
IAM ロールを作成し、 「KubernetesServer」 EC2 インスタンスにアタッチする必要があります。
これを行うには、検索ボックスで EC2 を見つける必要があります。
https://us-east-1.console.aws.amazon.com/ec2 / のリンクをクリックして、EC2 仮想サーバーを選択します。
「IAM」へのポインタが表示された AWS Web ページのスクリーンショット
IAMダッシュボード→ロールに移動します。
「IAM ロール」へのポインターが表示された AWS Web ページのスクリーンショット
IAMロール Web ページで[ロールの作成]ボタンをクリックします。
次に、 「AWS サービス」、「EC2」を選択します。そして「次へ」ボタンをクリックします。
「IAM ロール構成」へのポインターが表示された AWS Web ページのスクリーンショット
次に、検索ボックスで「AmazonEC2FullAccess」 、 「AmazonEC2FullAccess」 、 「IAMFullAccess」 、 「AWSCloudFormationFullAccess」を見つけて、 「アクセス許可の追加」ボタンをクリックします。
そして、 「次へ」ボタンをクリックします。
AdministratorAccess 権限へのポインターが表示された AWS Web ページのスクリーンショット
次に、 「ロール名」入力に「Eksctl_Role」と入力します。
そして「ロールの作成」ボタンをクリックします。
権限ロール設定へのポインターが表示された AWS Web ページのスクリーンショット
最後にロールが作成されます。
AWS EC2 インスタンスの Web ページに移動します。 「KuberbetesServer」を選択します。次に、 「アクション」 → 「セキュリティ」 → 「IAM ロールの変更」をクリックします。
KubernetesServer Security ボタンへのポインターが表示された AWS Web ページのスクリーンショット
「Eksctl_Role」を選択し、 「IAM ロールを更新」ボタンをクリックします。
Elsctl_Role IAM ロールへのポインターが表示された AWS Web ページのスクリーンショット
これで、IAM ロールが「EKS_Server」および eksctl ツールに接続されました。
Amazon EKS (Elastic Kubernetes Service)クラスターは、AWS 上の管理された Kubernetes 環境であり、セットアップ、スケーリング、メンテナンスなどの複雑なインフラストラクチャタスクを自動化します。これは、コンテナ化されたアプリケーションのデプロイ、管理、スケーリング、運用の合理化、開発者が基盤となるインフラストラクチャの管理ではなくコーディングに集中できるようにするための、効率的で安全な AWS に最適化されたプラットフォームを提供するため、不可欠です。
次に、EKS クラスターをセットアップします。
これを実現するには、次の手順に従います。
eksctl create cluster --name cluster-name \ --region region-name \ --node-type instance-type \ --nodes-min 2 \ --nodes-max 2 \ --zones <AZ-1>,<AZ-2>
例えば私の場合はこんな感じです。
eksctl create cluster --name zufarexplainedit \ --region eu-north-1 \ --node-type t3.micro
変更したコマンドを実行し、クラスターの作成プロセスが完了するまで辛抱強く待ちます。 AWS CloudFormation Web ページでは、EKS クラスターのステータスが「作成中」と表示されていることがわかります。
AWS CloudFormation へのポインターが表示された AWS Web ページのスクリーンショット。EKS クラスターの「作成中」ステータスが表示されます。
クラスターの作成手順には通常、約 20 分かかります。完了すると、ターミナルにプロセスの結果が表示されます。
EKS クラスターの作成結果が表示される AWS EC2 ターミナルへのポインターが表示された AWS Web ページのスクリーンショット
さらに、AWS CloudFormation ウェブページでEKS クラスターの作成が成功したことを確認できます。
EKS クラスターの作成結果を確認できる AWS CloudFormation へのポインターを含む AWS Web ページのスクリーンショット
Kubernetes デプロイメント YAML ファイルは、 Kubernetes クラスター内の特定のアプリケーションまたはサービスを管理および保守する方法を定義する YAML 形式で記述された構成スクリプトです。これには、アプリケーションを実行しているコンテナーのデプロイ、スケーリング、更新、および監視を調整するための手順がカプセル化されています。このファイルには、コンテナー イメージ、必要なレプリカ数、リソース制限、環境変数、ネットワーク設定などの詳細が含まれます。 Kubernetes クラスターに適用すると、デプロイメント YAML ファイルはアプリケーションの望ましい状態を確保し、コンテナーの作成、スケーリング、リカバリを自動的に管理して、望ましいレベルの可用性と信頼性を維持します。
これで、Kubernetes クラスター、eksctl、kubectl がインストールおよび構成されたので、Kubernetes デプロイメント yaml ファイルを作成できます。
次のコマンドを実行することでこれを行うことができます。
touch hello-app-deployment.yaml
次に、次のコマンドを実行してこのファイルを編集します。
vi hello-app-deployment.yaml
このコンテンツを hello-app-deployment.yaml に追加します。
apiVersion: apps/v1 kind: Deployment metadata: name: zufarexplainedit-hello-app labels: app: hello-app spec: replicas: 2 selector: matchLabels: app: hello-app template: metadata: labels: app: hello-app spec: containers: - name: hello-app image: zufarexplainedit/hello imagePullPolicy: Always ports: - containerPort: 8080 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1
これで hello-app-deployment.yaml が作成され、使用できるようになりました。
Kubernetes Service YAML ファイルは、ポッドのセットのネットワーク抽象化を定義する YAML 形式で記述された構成スクリプトであり、Kubernetes クラスター内で一貫してポッドにアクセスできるようにします。このファイルは、他のサービスまたは外部クライアントによるサービスの検出、アクセス、および負荷分散の方法を概説します。これには、サービス タイプ (ClusterIP、NodePort、LoadBalancer)、ポート番号、ポッドを識別するセレクターなどの仕様が含まれます。 Kubernetes クラスターに適用すると、サービス YAML ファイルは、トラフィックを適切なポッドにルーティングする仮想 IP とポートを作成し、基礎となるポッドの変更を抽象化し、通信に安定したエンドポイントを提供して、シームレスな接続と動的なスケーリングを可能にします。
Kubernetes クラスター、eksctl、kubectl がインストールおよび構成されているので、Kubernetes Service yaml ファイルを作成できます。
これを行うには、次のコマンドを実行して Kubernetes Service yaml ファイルを作成する必要があります。
touch hello-app-service.yaml
次に、次のコマンドを実行してこのファイルを編集します。
vi hello-app-service.yaml
このコンテンツを hello-app-deployment.yaml に追加します。
apiVersion: v1 kind: Service metadata: name: zufarexplainedit-hello-app-service labels: app: hello-app spec: selector: app: hello-app ports: - port: 8080 targetPort: 8080 type: LoadBalancer
これで hello-app-service.yaml が作成され、使用できるようになりました。
Kubernetes EKS クラスターが正常にインストールおよび構成され、Kubernetes サービスとデプロイメント ファイルの準備ができたら、kubectl コマンドを使用してテストを行ってみましょう。
デプロイメントを適用します。
次のコマンドを使用して、デプロイメント構成を適用します。
kubectl apply -f hello-app-deployment.yaml
これにより、指定された数のレプリカとローリング アップデート戦略を使用したデプロイメントが作成され、アプリケーションの可用性と管理性が確保されます。
2. サービスを適用します。
次に、サービス構成を適用します。
kubectl apply -f hello-app-service.yaml
これにより、LoadBalancer タイプのサービスがセットアップされ、アプリケーションがインターネットに公開されます。
LoadBalancer がプロビジョニングされ、外部 IP アドレスが取得されるまでに少し時間がかかる場合があることに注意してください。
ロードバランサーのステータスを確認します。
を使用してサービスのステータスを監視します。
kubectl get service zufarexplainedit-hello-app-service
外部 IP が割り当てられると、アプリケーションにアクセスする準備がほぼ整います。
アプリケーションにアクセスします。
Web ブラウザを使用して、割り当てられた外部 IP アドレスの後に「:8080」を入力します。しばらくすると、ページが読み込まれ、「HelloWorld」メッセージが表示されます。初期読み込みには数秒かかる場合があることに注意してください。
Hello アプリの Web ページのスクリーンショット
Kubernetes 環境内のリソースを整理する必要がある場合は、次の kubectl コマンドを使用して、デプロイメント、ポッド、サービスを効果的に削除できます。
1. すべてのデプロイメントを削除します。
すべてのデプロイメントを削除するには、次のコマンドを使用できます。
kubectl delete deployments --all
このアクションにより、クラスター内にアクティブなデプロイメント インスタンスが残らないようになります。
2. すべてのポッドを削除します。
デプロイメントによって管理されているかどうかに関係なく、すべてのポッドを削除する必要がある場合は、次のコマンドを使用できます。
kubectl delete pods --all
ポッドをクリアすると、クラスターの状態をリセットしたり、新しいデプロイメントの準備をしたりするのに役立ちます。
3. すべてのサービスを削除します。
アプリケーションをネットワークに公開するサービスをクリーンアップするには、次のコマンドを使用できます。
kubectl delete services --all
サービスの削除にはダウンタイムが伴う可能性があるため、続行する前にその影響を考慮してください。
eksctl
で作成された指定された Amazon EKS クラスターに関連付けられたすべてのリソース (ワーカーノード、ネットワークコンポーネント、その他のリソースを含む) を削除するには、次のコマンドを使用できます。
eksctl delete cluster --name {your cluster name} --region {your region name}
私にとってはそうです。
eksctl delete cluster --name zufarexplainedit --region eu-north-1
クラスターを停止すると元に戻せなくなり、データが失われる可能性があるため、必ずクラスターを停止してください。
次に、新しいansible-adminユーザーを「KubernetesServer」 AWS EC2 仮想サーバー インスタンスに追加しましょう。
これを行うには、このコマンドを使用します。
sudo useradd ansible-admin
次に、 ansible-adminユーザーのパスワードを設定します。
sudo passwd ansible-admin
また、 sudoersファイルを編集してユーザー権限を構成する必要があります。
sudo visudo
このsudoersファイルに「ansible-admin ALL=(ALL) ALL」を追加します。
管理者権限へのポインタが表示された AWS EC2 仮想サーバー インスタンスのターミナルのスクリーンショット
また、 /etc/ssh/sshd_configファイルを編集して PasswordAuthentication を有効にする必要があります。
sudo vi /etc/ssh/sshd_config
管理設定へのポインターが表示された AWS EC2 仮想サーバー インスタンスのターミナルのスクリーンショット
次に、これらの変更を行うためにサービスをリロードする必要があります。
sudo service sshd reload
このコマンドを実行すると、次のように表示されます。
sshd リロード結果へのポインターが表示された AWS EC2 仮想サーバー インスタンス ターミナルのスクリーンショット
これで、このコマンドを使用して、以降のすべてのコマンドに sudo を追加することを避けることができます。
sudo su - ansible-admin
この記事では、 K8s EC2 仮想サーバー インスタンスなどのリモート サーバーをさらに管理することを計画しています。このため、SSH キーを設定する必要があります。
ssh-keygen
このコマンドを実行すると、次のように表示されます。
ssh-keygen の結果へのポインターが表示された AWS EC2 仮想サーバー インスタンスのターミナルのスクリーンショット
これで SSH キーが生成され、使用できるようになりました。
Ansible は、リモート サーバー上のタスクを自動化するように設計されています。パスワードレス SSH 認証により、Ansible は手動でパスワードを入力しなくてもこれらのサーバーに接続できるようになります。
このコマンドを実行して、ansible-admin ユーザーの SSH キーを使用して、自分のコンピューターから別のコンピューター (IP アドレス 172.31.34.41 のコンピューターなど) への安全な接続を作成します。
sudo ssh-copy-id -i /home/{your user name}/.ssh/id_rsa.pub {your user name}@{your host address}
私の場合はこんな感じです。
sudo ssh-copy-id -i /home/ansible-admin/.ssh/id_rsa.pub ansible-admin@172.31.34.41
パスワードなしの ssh 認証のインストールが成功した結果のスクリーンショット
「追加されたキーの数: 1」が表示されます。パスワードなしの SSH 認証のインストールが正常に完了したことを意味します。
Ansible Playbook を実行するときは、それを実行するホストを指定します。このステップでは、KubernetesServer EC2 インスタンスのホストを指定する必要があります。これを行うには、「 [モジュール 6]: Ansible」で実行したのと同じ手順を繰り返す必要があります。
次のコマンドを実行して、KubernetesServer EC2 インスタンスのホストを調べてみましょう。
sudo ifconfig
「ifconfig」ファイルのスクリーンショット
KubernetesServer EC2 インスタンス ホストを見つけたら、次のコマンドを実行して、それを Ansible hosts ファイルに追加できます。
sudo vi /etc/ansible/hosts
ansible ホストと kubernetes ホストを含む「hosts」ファイルのスクリーンショット
「[kubernetes]」を参照として追加することもできます
Kubernetes のセットアップがすべて完了し、準備が整ったので、パイプライン用の Kubernetes タスクを含む新しい Ansible プレイブックを作成できます。この Playbook により、Ansible は kubectl コマンドを使用して Kubernetes クラスター上でアプリを実行できるようになります。
その方法は次のとおりです。
touch kubernetes-hello-app.yml
hello-app.yml
ファイルを編集します。このコマンドを使用して編集用に開きます。 vi kubernetes-hello-app.yml
--- - hosts: kubernetes tasks: - name: deploy regapp on kubernetes command: kubectl apply -f hello-app-deployment.yaml - name: create service for regapp command: kubectl apply -f hello-app-service.yaml - name: update deployment with new pods if image updated in docker hub command: kubectl rollout restart deployment.apps/zufarexplainedit-hello-app
Kubernetes タスク用の Ansible プレイブックを使用する準備ができました。
Kubernetes、Ansible、および Kubernetes タスク用の Ansible プレイブックがすべてセットアップされ、準備が整ったので、これを Jenkins と統合できます。
「JenkinsServer」→「Jenkins ダッシュボード」→「新しい項目」に移動します。
「CD-Job」という名前で新しい Jenkins Freestyle プロジェクトを作成します。
新しい Jenkins フリースタイル プロジェクト「CD-Job」のスクリーンショット
「OK」ボタンをクリックします。
「ビルド後のアクション」セクションに進みます。
「ビルド後のアクションを追加」ボタンをクリックします。
「SSH 経由でビルド アーティファクトを送信する」オプションを選択します。
SSH サーバーとして「AnsibleServer」を選択します。
このコマンドを「exec command」入力に追加します。
sudo -u ansible-admin ansible-playbook /opt/docker/kubernetes-hello-app.yml
「適用」ボタンと「保存」ボタンをクリックします。
Jenkins ダッシュボード → 「CI_CD_Pipeline」 → 「構成」 → 「ビルド後のアクション」セクションに移動します。
「ビルド後のアクションを追加」ボタンをクリックします。
「他のプロジェクトをビルドする」オプションを選択します。
「他のプロジェクトのビルド」セクションに進みます。
「ビルドが安定している場合にのみトリガーする」オプションを選択します。
「ビルドするプロジェクト」入力に「CD ジョブ」を追加します。
「他のプロジェクトのビルド」セクションのスクリーンショット
「適用」ボタンと「保存」ボタンをクリックします。
これで、パイプラインが完全に完成し、使用できる状態になったと考えることができます。
ここで、パイプラインの最終バージョンをテストします。
Jenkins → Jenkins ダッシュボード → 「CI_CD_Pipeline」に移動します。
「今すぐビルド」ボタンをクリックします。
結果を確認するには、ビルド コンソールのログを確認してください。
ビルドコンソールログのスクリーンショット
ビルド コンソール ログで「CD ジョブ」がトリガーされ、最終ステータスが SUCCESS とマークされていることがわかります。
4
さらに、Dockerhub にアクセスして、新しい Docker イメージの追加を確認できます。
最後に、Web ブラウザを使用してアプリケーションにアクセスできます。割り当てられた外部 IP アドレスに「:8080」を続けて入力します。しばらくすると、ページが読み込まれ、「HelloWorld」メッセージが表示されます。
この最新の CI/CD パイプラインのセットアップはうまくいきました。
あなたは素晴らしい仕事をしました、そしてあなたは本物のヒーローです!
ご尽力ありがとうございました!
Zufar Sunagatov は、最新のソフトウェア システムの設計に情熱を注ぐ経験豊富なシニア ソフトウェア エンジニアです。
ズファル・スナガトフ
AWS、K8S、Docker、Ansible、Git、Github、Apache Maven、Jenkins を使用した CI/CD パイプラインの構築 | HackerNoon