このシリーズでは,コードとしてのインスフラストラクチャ(IaC)を導入する方法について説明していきます。開発者の皆さんにIaCのコンセプトをしっかりご理解いただけるよう,チュートリアルやコードサンプルを交えて作成しました。各記事では以下のトピックについて取り上げます。

今回の記事では,アプリケーション用に泊坞窗イメージを作成して,泊坞枢纽にプッシュする方法を説明します。HashiCorpの起程拓殖を使用して,作成した泊坞イメージを谷歌Kubernetes引擎(GKE)クラスタにデプロイする方法にも触れていきます。この記事で行う手順は以下のとおりです。

事前にパート1の前提条件セクションに记载されている手顺をすべて完了する必要があります。前提条件の手顺が完了したら,こちらのコードリポジトリに含まれるサンプルNode.js的アプリケーションに基づいて泊坞窗イメージを作成する方法から始めていきましょう。

泊坞窗イメージの作成

前回の記事では,起程拓殖を使用してGKEクラスタを作成しました。しかし,アプリケーションやサービスがデプロイされていない状態では,クラスタは何の役にも立ちません。Kubernetes(美丽)はコンテナオーケストレーターなので,アプリやサービスは泊坞窗イメージにパッケージ化する必要があります。そうすることで,アプリケーションやサービスを実行する泊坞窗コンテナが生成されます。

泊坞窗イメージ码头工人建造コマンドで作成します。码头工人イメージを作成するには,作成方法を指定するためのDockerfileが必要です.Dockerfileについて解说する前に,.dockerignoreファイルについて少し说明しておきましょう。

.dockerignoreファイル

.dockerignoreファイルを使用すると,ファイル内に宣言したパターンと一致するファイルおよびディレクトリを除外できます。このファイルは,サイズが大きいまたは機密情報の含まれるファイルやディレクトリを必要がないのにデーモンに送信した結果、これらをパブリックイメージに追加してしまうのを防止する役目を果たします。今回のプロジェクトでは、.dockerignoreファイルを使用して起程拓殖関連の不要なファイルとnode . jsのローカル依存関係を除外します。

Dockerfile

Dockerfileは,多克尔イメージの作成に欠かせないファイルです。イメージの作成方法と设定方法に加え,イメージにインポートするファイルの情报も指定します.Dockerfileは非常にダイナミックなので,さまざまな方法でさまざまな目的を达成することができます。正常に机能するイメージを作成するためには,Dockerfileの机能をよく理解しておく必要があります。では,今回のプロジェクトのコードリポジトリに含まれるDockerfileについて详しく见ていきましょう。

从节点:12#创建的应用程序目录WORKDIR / usr / src目录/应用程序#安装的应用程序的依赖关系COPY包*上传.json ./ RUN NPM --only安装=生产#捆绑应用源COPY。。暴露5000 CMD ["npm", "start"]

从节点:12の行では,継承元のイメージを定義しています。イメージを作成するとき,码头工人は親イメージを継承します。今回の親イメージは节点:12です。ローカルに存在しない場合は码头工人中心からプルされます。

安装应用程序依赖项拷贝包*json ./运行npm install—only=生产

上記のコードブロックでは,码头工人イメージ内の作業ディレクトリを指定するWORKDIRパラメーターを定義しています。COPY包*以.json ./の行でパッケージ関連ファイルを码头工人イメージにコピーします。运行npm安装の行で,package.jsonファイルに列記されているアプリケーション依存関係をインストールします。

复制。暴露5000 CMD ["npm", "start"]

上记のコードブロックは,.dockerignoreファイルに列記されているファイルとディレクトリを除くすべてのファイルを码头工人イメージにコピーします。EXPOSE 5000の行で,この泊坞イメージに公开するポートを指定します最后。に,CMD ["npm", "start"]の行で,このイメージの起動方法を定義します。今回は,このプロジェクトのpackage.jsonファイルに指定されている开始セクションを実行します。このCMDパラメーターは既定の実行コマンドです。Dockerfileについてひととおりご説明できたので、ここからは Dockerfile を使用してローカルでイメージを作成してみましょう。

码头工人建造コマンド

Dockerfileと码头工人建造コマンドを使用して,Dockerfile内のディレクティブから新しいイメージを作成できます。码头工人イメージを作成するにあたって,理解しておくべき命名規則がいくつかあります。これらは,イメージを共有する場合に非常に重要です。

イメージの作成に入る前に,イメージの命名规则について确认しておきましょう.Dockerイメージは,タグのコンセプトを采用しています。タグとは,スラッシュで区切られた名前コンポーネントのことです。このチュートリアルでは,イメージを泊坞枢纽にプッシュします。したがって,イメージ名のプレフィックスとして码头工人中心ユーザー名を指定する必要があります。この例ではariv3ra /です。私はいつもこの後ろに,プロジェクト名か,イメージのわかりやすい説明を続けます。この码头工人イメージのフルネームはariv3ra / learniac: 0.0.1になります。:0.0.1はアプリケーションのバージョンタグですが,イメージの详细说明に使用することもできます。

イメージ名について理解できたでしょうか。では,いよいよイメージの作成です。プロジェクトリポジトリのルートから以下のコマンドを実行します(ariv3raの部分は実際の码头工人中心名で置き換えてください)。

搬运工构建-t ariv3ra / learniac -t ariv3ra / learniac:0.0.1。

次に,以下のコマンドを実行して,マシン上の泊坞イメージの一覧を表示します。

码头工人的图片

今回の例では以下の内容が出力されます。

存储库标签图像ID创建大小ariv3ra/learniac 0.0.1 ba7a22c461ee

搬运工推コマンド

これで码头工人に中心イメージをプッシュする准备が整ったので,イメージを公开しましょう.Docker枢纽のサービスにアクセスするには认证が必要なので,登录コマンドを実行して認証します。以下のコマンドでログインします。

泊坞窗登录

プロンプトが表示されたら,码头工人中心認証情報を入力してアカウントを認証します。このログイン操作が必要になるのはマシン1台につき1回のみです。さあ,準備は万端なので,イメージをプッシュしましょう。

以下のコマンドを実行して新しいメージを码头工人中心にプッシュします。ここでは必ず码头工人的图片コマンドを実行して表示されたイメージ名を使用してください。

搬运工推ariv3ra / learniac

今回の例では以下の内容が出力されます。

推送指库[docker.io/ariv3ra/learniac] 2109cf96cc5e:推94ce89a4d236:推e16b71ca42ab:推8271ac5bc1ac:推a0dec5cb284e:从库安装/节点03d91​​b28d371:从文库/节点4d8e964e233a安装:从库安装/节点

これで泊坞中心に泊坞イメージが保管され,GKEクラスタにデプロイできる状态になりました。アプリケーションを新しいKubernetesクラスタにデプロイするためのすべてのピースが揃ったところで,次はTerraformを使用してKubernetes部署を构筑します。

本シリーズのパート1では,起程拓殖を使用して新しい谷歌Kubernetes引擎(GKE)クラスタを作成する方法を取り上げました。既に触れたように,このクラスタはアプリケーションやサービスを一切提供しません。なぜなら,このクラスタにはアプリケーションもサービスもデプロイしていないからです。ここからは,起程拓殖を使用してKubernetes部署をデプロイするのに必要な要素について见ていきます。

起程拓殖Kubernetes部署

起程拓殖にはKubernetes部署のリソースがあります。このリソースによって,GKEクラスタに配置するKubernetes部署を定義し,実行するわけです。本シリーズのパート1では,part01 iac_gke_cluster /ディレクトリ内のTerraformコードを使用してGKEクラスタを新规作成しました。今回は,part02 / iac_gke_cluster /ディレクトリとpart02 / iac_kubernetes_app /ディレクトリを使用します。iac_gke_cluster /は,パート1で使用したのと同じコードです。ここでは,このコードとiac_kubernetes_app /ディレクトリを组み合わせて使用​​します。

起程拓殖Kubernetesプロバイダー

パート1では,Terraformの谷歌云平台プロバイダーを使用してGKEクラスタを新規作成しました。これは谷歌云平台に固有のクラスタですが,まだKubernetesの配下にあります。GKEは基本的にKubernetesクラスタなので,GKEクラスタに配置するアプリケーションを構成してデプロイするには,起程拓殖KubernetesプロバイダーKubernetes部署リソースを使用する必要があります。

Terraformコード

part02 / iac_kubernetes_app /ディレクトリには以下のファイルが含まれています。

  • providers.tf
  • variables.tf
  • main.tf
  • deployments.tf
  • services.tf
  • output.tf

これらのファイルには,Kubernetesクラスタにデプロイするアプリケーションを定义,作成,构成するために使用するコードがすべて含まれています。それでは,各ファイルの役割について详しく见ていきましょう。

解説:providers.tf

provider.tfファイルでは,これから使用するTerraformプロバイダー(起程拓殖Kubernetesプロバイダー)を定义します。provider.tfは以下のようになります。

供应商 “kubernetes”{}

上記のコードブロックは,この起程拓殖プロジェクトで使用するプロバイダーを定義しています。{}ブロックが空なのは,別のプロセスによって認証要求を処理するからです。

解説:variables.tf

このファイルは一見,パート1のvariables.tfとよく似ていますが,今回の起程拓殖Kubernetesプロジェクトで使用する入力変数のみが指定されています。

变量 “集群”{默认= “CICD-研讨会”}变量 “应用程序”{类型=字符串描述= “应用程序的名称” 默认= “CICD-101”}可变 “区”{默认= “US-east1-d”}变量“搬运工图像” {类型=字符串描述=“泊坞窗图像的名称来部署”默认=“ariv3ra / learniac:最新”}

ここで定義されている変数は,この起程拓殖プロジェクト全体を通じてさまざまなファイルのコードブロック内で使用されます。これらすべての変数には默认値がありますが,コードの実行時にCLIを使って定義することで変更可能です。これらの変数を使用することで起程拓殖コードに求められる柔軟性が確保され,変数コードを再利用できるようになります。上記では变量“docker-image”の既定のパラメーターに私の泊坞イメージが指定されていますが,この値は実际の泊坞イメージのファイルで置き换えてください。

解説:main.tf

main.tfファイルの要素を1つずつ解説していきたいと思います。起程拓殖ブロックから始めましょう。このブロックではTerraform后端のタイプを指定します.Terraformの「バックエンド」によって,ステートを読み込む方法や,适用などのオペレーションの実行方法が决定されます。この抽象化により,非ローカルのファイルステートストレージやリモート実行が使用可能になります。今回のコードブロックでは,远程バックエンドを使用します。このバックエンドは起程拓殖云を使用し,パート1の前提条件セクションに沿って作成したiac_kubernetes_appワークスペースに接続しています。

terraform {required_version = "~>0.12"后端"remote" {organization = "datapunks" workspaces {name = "iac_kubernetes_app"}}

解说:deployments.tf

続いて,deployments.tfファイルの構文を見ていきます。このファイルは,起程拓殖Kubernetes部署リソースを使用して,アプリケーションをGKEクラスタにリリースするために必要なすべてのKubernetesリソースを定义,构成,作成します。

元数据资源”kubernetes_deployment”“应用”{{name = var.app标签={应用= var.app}}规范{副本= 3选择模板{match_labels ={应用= var.app}}{元数据规范{标签={应用= var.app}}{容器{图像= var.docker-image name = var.app端口{name =“端口- 5000”container_port = 5000}}}}}}

具体的に何が起こっているのかを理解するために,コードの要素をそれぞれ确认しておきましょう。

资源 “kubernetes_deployment”, “应用程序”{{元数据名字= var.app标签= {应用= var.app}}

上记のコードブロックでは,Kubernetesのデプロイオブジェクトを定义するTerraform Kubernetes部署リソースを使用するよう指定しています.Kubernetesサービスで使用するパラメーターの値は,元数据ブロックで指定します。

规范{副本= 3选择模板{match_labels ={应用= var.app}}{元数据={应用= var.app}}{标签规范容器{{图像= var.docker-image name = var.app端口{name =“端口- 5000”container_port = 5000}}}}}

リソースの规范{…}ブロックでは,クラスタ内のアプリケーションのために実行する3つのKubernetes豆荚を指定しています。选择器{…}ブロックはラベルセレクターであり,Kubernetesのコアグループのプリミティブです。ユーザーはこれらを使って,オブジェクトのセットを选択します。

リソースの模板{…}ブロック内には规范{…}ブロックが入れ子になっており,その内部にはさらに容器{…}プロパティブロックが入れ子になっています。このブロック内には,デプロイで使用するコンテナを定义,构成するパラメーターが含まれています。コードからおわかりのように,ここに荚の泊坞图像(使用するイメージ)を定義します。コンテナの名称はKubernetes内の名前になります。港口は,入口に実行中のアプリケーションへのアクセスを許可するコンテナ上で公開されます。値は同じディレクトリ内のvariables.tfファイルから取得されたものです。起程拓殖Kubernetes部署リソースは非常に堅牢な構成が実行できます。ツールについて理解を深めるために,他のプロパティを指定して実験してみることをお勧めします。

解説:services.tf

起程拓殖Kubernetes部署リソースファイルを作成し,このアプリケーションで使用するKubernetes部署を定义しました。アプリのデプロイを完了する前に,もう1つ详细を确认しておくべきものがあります。これからデプロイするアプリケーションは标准的な网络サイトです。すべての网络サイトと同様に,利用するにはアクセス许可が必要になります。ここまででdeployments.tfファイルには,码头工人イメージを使用してKubernetes podをデプロイするディレクティブと必要なpodの数が指定されていますが,デプロイにおける重要な要素がまだ欠けています。それはKubernetesサービスです。このサービスは,复数の荚で実行中のアプリケーションをネットワークサービスとして公开するための抽象化を提供します.Kubernetesでは,驯染みのないサービスディスカバリメカニズムを使用する场合にも,アプリケーションを変更する必要はありませんが.Kubernetes荚にIPアドレスを割り当て,一连の荚に単一のDNS名を割り当てて,负荷分散处理を行います。

Terraform Kubernetesサービスを定义するのが,services.tfファイルです。このサービスはKubernetes要素をつなぎ合わせ,入口にクラスタ内のpodで実行中のアプリケーションへのアクセスを許可します。services.tfファイルの中身を见ていきましょう。

资源“kubernetes_service”“app”{元数据{name = var.app} spec {selector = {app = kubernetes_deployment.app.metadata.0.labels。target_port = 5000} type = " load均衡器"}}

规范{…}ブロックと,このブロック内にある要素に注目してください。选择器{应用…}ブロックでは,deployments.tfファイルに定義されている名前を指定します。このブロックは,部署リソース内にある元数据ブロックの标签プロパティの应用値を表します。これは,関連リソースに既に割り当てられている値を再利用する一例です。重要な値を合理化して,ここに示したような重要なデータの参照整合性を確立するメカニズムも提供します。

端口{…}ブロックには港口target_portの2つのプロパティが含まれ,これらのパラメーターでサービスがアプリケーションへのリクエストを待機する外部ポートを定義します。今回の例では,ポート80を使用します。target_portはpodが待機する内部ポートであり,ポート5000です。このサービスは,すべてのトラフィックをポート80からポート5000にルーティングします。

ここで取り上げる最后の要素は类型パラメーターです。これから作成するサービスのタイプを指定しますの.Kubernetesサービスには3つのタイプがあります。今回の例で使用するのは,loadbalanceタイプです。クラウドプロバイダーのロードバランサーを使用してサービスを外部に公開します。外部ロードバランサーのルーティング先であるNodePortとClusterIP服务は自動的に作成されます。今回はGCPにより,トラフィックの制御とGKEクラスタへのルーティングを行うloadbalanceが作成,構成されます。

解説:output.tf

TerraformではTerraformでは出力値と呼ばれるコンセプトが采用されています.Terraformモジュールが返した値は,子モジュールに出力され,そのリソース属性のサブセットが亲モジュールに公开されるか,terraform申请の実行后にCLI出力に特定の値が出力されます。以下のoutput.tfブロックでは,出力値を使用して,クラスタ名や新規作成したLoadBlancerサービスの入口IPアドレスなどの値を読み出します。このアドレスを使用すると,GKEクラスタ上のpodでホスティングされているアプリケーションにアクセスできます。

输出 “gke_cluster”{值= var.cluster}输出 “端点”{值= kubernetes_service.app.load_balancer_ingress.0.ip}

part02 / iac_gke_clusterでの起程拓殖の初期化

Terraformのプロジェクトと构文についての理解が深まったところで,今度はTerraformを使用してGKEクラスタのプロビジョニングを行います。まずはpart02 / iac_gke_clusterディレクトリに移动しましょう。

cd part02 / iac_gke_cluster

part02 / iac_gke_clusterディレクトリで以下のコマンドを実行します。

terrform init

今回の例では以下の内容が出力されます。

初始化后端...成功配置后端“远程”!除非后端配置发生更改,否则Terraform将自动使用此后端。初始化插件提供者……-检查可用的提供商插件…-下载插件提供商"谷歌" (hashicorp/谷歌)3.31 1.0…以下提供程序在配置中没有任何版本限制,因此安装了最新版本。为了防止自动升级到可能包含破坏更改的新主要版本,建议在配置中向相应的提供者块添加version = "…"约束,约束字符串如下。*供应商。谷歌:version = "~> 3.31" Terraform已经初始化成功!

うまくいきました。次は,いよいよGKEクラスタの作成です。

part02 / iac_gke_clusterでの起程拓殖の適用

起程拓殖には,起程拓殖コードをドライ実行して,実際には何も実行することなくバリデーションできる起程拓殖计划というコマンドがあります。このコマンドでは,Terraformが既存のインフラストラクチャに対して実行するすべてのアクションと変更をグラフ化することも可能です。ターミナルで以下を実行します。

起程拓殖计划

今回の例では以下の内容が出力されます。

清爽Terraform状态在内存中的计划之前...刷新的状态将被用来计算这个计划,但不会持久保存到本地或远程状态存储。——生成执行计划,如下所示。资源操作用以下符号表示:+ create Terraform将执行以下操作:# google_container_cluster。primary将被创建+资源“google_container_cluster”“primary”{+ additional_zones =(应用后已知)+ cluster_ipv4_cidr =(应用后已知)+ default_max_pods_per_node =(应用后已知)+ enable_binary_authorization = false…

Terraformはmain.tfファイル内のコードに基づいてGCPリソースを新规作成します。インフラストラクチャを新规作成してアプリケーションをデプロイする准备が整ったので,ターミナルで以下のコマンドを実行します。

terraform申请

コマンドを确认するメッセージが表示されたら,と入力して输入キーを押します。

你要执行这些操作?Terraform将执行上述动作。只有“是”将被接受批准。输入一个值:是

起程拓殖により,GCP上に新しい谷歌Kubernetes引擎クラスタが作成されます。

:クラスタの完成には3 ~ 5分かかります。バックエンドシステムがプロビジョニングを行ってからクラスタをオンラインにするため,瞬時には処理されません。

クラスタが完成すると,以下のような内容が出力されます。

应用完成了!资源:增加1个,改变0个,销毁0个。输出:cluster = cicd-workshop cluster_ca_certificate = <敏感>主机= <敏感>密码= <敏感>用户名= <敏感>

GKEクラスタが新規作成され,输出の結果が表示されます。機密情報としてマークされていると,出力値が> <敏感タグによってマスキングされ,結果に表示されません。このように,機密データは必要に応じて保護することができます。

次に,part02 / iac_kubernetes_app /ディレクトリ内のコードを使用して,Kubernetes部署と付随するloadbalanceサービスを作成します。

part02 / iac_kubernetes_app /でのTerraformの初期化

part02 / iac_kubernetes_app /ディレクトリ内のコードを使用してGKEクラスタにアプリケーションをデプロイします。まず,以下のコマンドでディレクトリを移動します。

cd part02 / iac_kubernetes_app /

part02 / iac_kubernetes_app /で以下のコマンドを実行してTerraformプロジェクトを初期化します。

terrform init

今回の例では以下の内容が出力されます。

初始化后端...成功配置后端“远程”!除非后端配置发生更改,否则Terraform将自动使用此后端。初始化提供插件...  - 检查可用的提供插件...  - 下载插件的提供者“kubernetes”(hashicorp / kubernetes)1.11.3 ...下面的供应商不必在配置中的任何版本的限制,所以最新版本安装。为了防止自动升级到可能包含破坏更改的新主要版本,建议在配置中向相应的提供者块添加version = "…"约束,约束字符串如下。* provider.kubernetes:版本= “〜> 1.11” Terraform已成功初始化!

GKEクラスタの认证情报

Terraformでgoogle_container_clusterを作成できたら,クラスタの認証を行う必要があります。谷歌云CLIを使用してクラスタアクセスを構成し,kubeconfigファイルを生成します。以下のコマンドを実行して,Kubernetesクラスタにアクセスします。

gcloud容器群获得的凭据CICD工作坊--zone = “US-east1-d”

このコマンドを実行すると,認証メカニズムとしてgcloudを使用するkubeconfigエントリが,gcloudによって生成されます。上记のコマンドでは,cicd-workshops値をクラスタ名として使用します。この値はvariables.tfにも指定されています。続いて,アプリをGKEにデプロイします。

part02 / iac_kubernetes_appでの起程拓殖の適用

いよいよTerraformを使用してアプリケーションをGKEクラスタにデプロイする准备が整いました。以下のコマンドを実行します。

起程拓殖计划

今回の例では以下の内容が出力されます。

清爽Terraform状态在内存中的计划之前...刷新的状态将被用来计算这个计划,但不会持久保存到本地或远程状态存储。——生成执行计划,如下所示。资源操作以表示以下符号:+创建Terraform将执行以下操作:#kubernetes_deployment.app将被创建+资源“kubernetes_deployment”,“应用程序” {+ ID =(称为后应用)+元数据{+代=(已知后应用)+标签= {+ “应用程序”= “CICD-101”} +名称= “CICD-101” +名称空间= “默认” + resource_version =(称为后应用)+ self_link =(称为应用后)+ UID=(俗称后申请)} ...

Terraformはdeployment.tfファイルとservices.tfファイル内のコードに基づいてGCPリソースを新规作成します。インフラストラクチャを新规作成してアプリケーションをデプロイする准备が整ったので,ターミナルで以下のコマンドを実行します。

terraform申请

コマンドを确认するメッセージが表示されたら,と入力して输入キーを押します。

你要执行这些操作?Terraform将执行上述动作。只有“是”将被接受批准。输入一个值:是

起程拓殖により,新しいKubernetesアプリケーションデプロイと,関連するloadbalanceが作成されます。

:クラスタの完成には3 ~ 5分かかります。バックエンドシステムがプロビジョニングを行ってからクラスタをオンラインにするため,瞬時には処理されません。

クラスタが完成すると,以下のような内容が出力されます。

应用完成了!资源:增加2个,改变0个,销毁0个。输出:endpoint = 104.196.222.238 gke_cluster = cicd-workshop

これでアプリケーションがデプロイされました。端点値として,クラスタloadbalanceのパブリック入口のIPアドレスが出力されます。アプリケーションにはこのアドレスからアクセスできます名.webブラウザーを开き,输出値を使用してアプリケーションにアクセスすると,网络ページに「欢迎CI / CD 101使用CircleCI!」というメッセージが表示されます。

Terraformのリソースの破弃

Kubernetesデプロイが動作すること,GKEクラスタにアプリケーションが正常にデプロイされたことを確認できたところで,今度は起程拓殖摧毁コマンドを実行して,このチュートリアルで作成したアセットを破弃してみましょう。アセットはそのまま稼働させても构いません。しかし,谷歌云平台上でアセットを実行するにはコストが発生し,そのコストに対する责任も负わなくてはなりません。谷歌から无料トライアルの登录ユーザーに提供されている300ドル分のクレジットは,アセットを実行し続ければあっという间に尽きてしまいます。もちろん,ご事情に合わせて判断していただければと思いますが,起程拓殖摧毁を実行すれば実行中のすべてのアセットを破棄できます。

以下のコマンドを実行してGKEクラスタを破弃しましょう。

起程拓殖摧毁

なお,上記のコマンドで破棄できるのはpart02 / iac_kubeernetes_app /デプロイのみです。このチュートリアルで作成したすべてのリソースを破棄するには,以下のコマンドを実行する必要があります。

cd . ./ iac_gke-cluster /起程拓殖摧毁

上记のコマンドを実行すると,先に作成したGKEクラスタが破弃されます。

まとめ

お疲れさまでした。本シリーズのパート 2 はこれで以上です。今回は新しい Docker イメージを作成して公開する手順と、アプリケーションをプロビジョニングし、コードとしてのインフラストラクチャおよび Terraform を使用して Kubernetes クラスタにデプロイする方法をご説明しました。

次回のパート3では,ここまでに学习した内容をCI / CDパイプラインに取り入れ,CircleCIを使用して自动化する方法について取り上げます。

さらに詳しく知りたい方は以下の資料を参照してください。