この記事では、Linux、Kubernetes、Terraformのトピックを継続し、Terraformを使用してアプリケーションをKubernetesクラスターにデプロイする方法を学習するのに役立ちます。これを行うための2つの異なるアプローチ、KubernetesプロバイダーとHelmTerraformプロバイダーについて説明しました。この目的のために、ラップトップにインストールできるMinikubeを使用するため、Kubernetesクラスタは必要ありません。
また、Terraformを使用してKubernetesで機能的なn層アプリケーションを10分でデプロイする方法についても学習します。
Kubernetesとその概念を学ぶための最良の方法は、Minikubeを使用することです。 Minikubeを使用すると、仮想マシンを管理したり、完全に機能するKubernetesクラスターをデプロイしたりする手間を省くことができます。
このオープンソースツールは、Windows、macOS、およびLinuxをサポートしており、ローカルマシンでシングルノードのKubernetesクラスターを起動できます。この仮想マシンは、Virtualbox、KVM、Hyper-V、またはDocker上で実行できます。
Minikubeのインストールは簡単なプロセスです。ただし、事前にインストールする必要がある依存関係は1つだけです。それは、kubectl
と呼ばれるコマンドラインツールです。 。
kubectl
Kubernetesクラスターを管理できます。 kubectl
を使用できます アプリケーションのデプロイ、ログの表示、クラスターリソースの管理を行います。
kubectlのインストール
以下は、kubectl
のインストールプロセスの例です。 LinuxおよびmacOSの場合:
$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
kubectl
をインストールするには Windowsでは、Chocolateyパッケージマネージャーを使用できます:
choco install kubernetes-cli
または、kubectl
をインストールすることもできます Windowsの場合は、ここをクリックしてください。
kubectlをインストールしたので、次のステップはMinikubeをインストールすることです。
Minikubeをインストールする
MinikubeをUbuntu、CentOS、macOSにインストールするために必要な標準コマンドは次のとおりです。
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube
brew
に依存している場合 macOSを管理するには、次のコマンドを使用することをお勧めします:
$ brew install minikube
minikube
をインストールする場合 Windowsでは、Chocolateyを使用することをお勧めします:
choco install minikube
minikube
の場合 インストール中に起動しなかった場合は、次のコマンドを使用して起動できます:
$ minikube start
Kubernetesデプロイ用のTerraformプロバイダー
現在、Terraformを使用してKubernetesアプリケーションを管理するために利用できるプロバイダーは2つあります。
- Kubernetes。
- ヘルム。
KubernetesTerraformプロバイダー
例として、このセクションでは、KubernetesTerraformプロバイダーを使用したWordPressのデプロイについて説明します。
Kubernetesプロバイダーを使用してWordPressのデプロイを定義する
プロジェクトの最終的な構造は次のとおりです。
wordpress
を使用します フロントエンド層とmysql
のDockerイメージ デプロイのDB層のDockerイメージ。
kubernetes
を定義しましょう provider.tf
のプロバイダー ファイル:
provider "kubernetes" {
config_context = "minikube"
}
次に、kubernetes_deployment
にラベルを付けるためのローカル変数をいくつか作成しましょう。 およびkubernetes_service
:
locals {
wordpress_labels = {
App = "wordpress"
Tier = "frontend"
}
mysql_labels = {
App = "wordpress"
Tier = "mysql"
}
}
もちろん、必要に応じて追加のラベルを作成することもできます。 Kubernetesのラベルの目的は、ポッド、サービス、デプロイ、その他のKubernetesエンティティを選択できるようにすることです。
Terraform構成でパスワードをハードコーディングしないようにする方法はたくさんあります。 Terraformパラメータの使用はその1つです。デモを少し簡単にするために、ハードコードされたパスワードを引き続き使用します。
MYSQL_ROOT_PASSWORD
の秘密を宣言しましょう kubernetes_deployment
で使用する環境変数 。
resource "kubernetes_secret" "mysql-pass" {
metadata {
name = "mysql-pass"
}
data = {
password = "root"
}
}
これで、kubernetes_deployment
を定義する準備が整いました。 WordPress展開のリソース:
resource "kubernetes_deployment" "wordpress" {
metadata {
name = "wordpress"
labels = local.wordpress_labels
}
spec {
replicas = 1
selector {
match_labels = local.wordpress_labels
}
template {
metadata {
labels = local.wordpress_labels
}
spec {
container {
image = "wordpress:4.8-apache"
name = "wordpress"
port {
container_port = 80
}
env {
name = "WORDPRESS_DB_HOST"
value = "mysql-service"
}
env {
name = "WORDPRESS_DB_PASSWORD"
value_from {
secret_key_ref {
name = "mysql-pass"
key = "password"
}
}
}
}
}
}
}
}
Terraform構成全体は、KubernetesDeployment仕様を反映しています。宣言したらすぐに、KubernetesServiceを使用してWordPressDeploymentを外部クラスターネットワークに公開する必要があります。
kubernetes_service
を定義しましょう その目的のためのTerraformリソース:
resource "kubernetes_service" "wordpress-service" {
metadata {
name = "wordpress-service"
}
spec {
selector = local.wordpress_labels
port {
port = 80
target_port = 80
node_port = 32000
}
type = "NodePort"
}
}
ここでは、KubernetesにWordPressポッドをサービスを使用した通信に使用できるようにするように指示しています。
Minikube開発環境では、ポート32000
でWordPressを公開します 。
それでは、MySQLのデプロイについても同じことをしましょう:
resource "kubernetes_deployment" "mysql" {
metadata {
name = "mysql"
labels = local.mysql_labels
}
spec {
replicas = 1
selector {
match_labels = local.mysql_labels
}
template {
metadata {
labels = local.mysql_labels
}
spec {
container {
image = "mysql:5.6"
name = "mysql"
port {
container_port = 3306
}
env {
name = "MYSQL_ROOT_PASSWORD"
value_from {
secret_key_ref {
name = "mysql-pass"
key = "password"
}
}
}
}
}
}
}
}
前の例と同様に、kubernetes_service
を介して構成されたKubernetesサービスを使用して、WordPressデプロイメントでMySQLDBデプロイメントにアクセスできるようにします。 リソース:
resource "kubernetes_service" "mysql-service" {
metadata {
name = "mysql-service"
}
spec {
selector = local.mysql_labels
port {
port = 3306
target_port = 3306
}
type = "NodePort"
}
}
WordPressKubernetesTerraform構成をデプロイする
Terraform構成を作成したらすぐに、デモ例を展開できます。
Terraformプロジェクトを初期化し、構成を適用します:
$ terraform init
$ terraform apply
構成を適用すると、リソースの計画と、計画されたアクティビティを実行するための許可が表示されます。
yes
と答えて、計画を承認します 。
リソースの展開後、アプリケーションにアクセスできるようになります。
kubectl
を使用して、クラスターへのデプロイを検証しましょう 。
$ kubectl get all
Terraformリソースによって作成されたものがすべて利用可能であることを確認したいと思います。
WordPressとMySQLリソースのデプロイを確認した後、アプリへのアクセスをテストできます。
デプロイされたアプリケーションにアクセスするには、次のMinikubeコマンドを実行する必要があります。
$ minikube service wordpress-service --url
このコマンドは、Minikubeによって公開されたWordPressサービスのURLを表示します。
おめでとう! WordPressアプリケーションは正常にデプロイされました。
記事のこの部分では、Terraformヘルムプロバイダーを使用して、同じWordPressアプリケーションをKubernetesクラスターにデプロイしますが、ヘルムチャートを使用します。
Terraformスクリプトが実行されるHelmプロバイダーを介して展開するには、マシンにHelmをインストールする必要があります。
HelmとHelmチャートの作成プロセスの詳細については、記事「[Kubernetes][Helm]チャートを10分ですばやく簡単に紹介する」をお勧めします。
このモジュールでは、MySQLおよびWordPressの展開用のHelmチャートを作成します。
Helmは、ニーズに合わせて調整できる基本的なテンプレートを生成できます。ヘルムチャートの作成の詳細については、「10分でKubernetesヘルムチャートをすばやく簡単に紹介する」の記事をご覧ください。
最終的なプロジェクト構造は次のとおりです。
グラフのディレクトリを作成しましょう:
$ mkdir charts
$ cd charts
MySQLヘルムチャート
まず、MySQLのヘルムチャートを作成します。
$ helm create mysql-chart
上記のコマンドは、デフォルト構成でチャートを作成します。
mysql-chartの内容を表示する :
NOTES.txt
を削除します 、hpa.yaml
、ingress.yaml,
およびserviceaccount.yaml
テンプレートディレクトリからのファイル。
MySQLのdeployment.yaml
のコンテンツをオーバーライドします 次のファイル:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.deployment.name }}
labels:
{{- include "mysql-chart.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "mysql-chart.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "mysql-chart.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.service.port }}
protocol: TCP
env:
- name: MYSQL_ROOT_PASSWORD
value: 'admin'
service.yaml
のコンテンツは次のとおりです MySQLの場合。
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.service.name }}
labels:
{{- include "mysql-chart.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: {{ .Values.service.port }}
protocol: TCP
name: http
selector:
{{- include "mysql-chart.selectorLabels" . | nindent 4 }}
values.yaml
のコンテンツを置き換えます MySQL構成の場合。
replicaCount: 1
image:
repository: mysql:5.6
pullPolicy: IfNotPresent
deployment:
name: mysql-deployment
service:
name: mysql-service
type: ClusterIP
port: 3306
WordPressヘルムチャート
WordPressのヘルムチャートを作成します。
$ helm create wordpress-chart
NOTES.txt
を削除します 、hpa.yaml
、ingress.yaml,
およびserviceaccount.yaml
テンプレートディレクトリからのファイル。
deployment.yaml
のコンテンツ WordPressの場合は次のとおりです:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.deployment.name }}
labels:
{{- include "wordpress-chart.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "wordpress-chart.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "wordpress-chart.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: {{ .Values.image.repository }}
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.service.port }}
protocol: TCP
env:
- name: WORDPRESS_DB_HOST
value: 'mysql-service'
- name: WORDPRESS_DB_PASSWORD
value: 'admin'
service.yaml
のコンテンツ WordPressチャートの概要は次のとおりです。
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.service.name }}
labels:
{{- include "wordpress-chart.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: {{ .Values.service.port }}
protocol: TCP
name: http
nodePort: {{ .Values.service.nodePort }}
selector:
{{- include "wordpress-chart.selectorLabels" . | nindent 4 }}
values.yaml
のコンテンツ WordPressの場合は次のとおりです:
replicaCount: 1
image:
repository: wordpress:4.8-apache
pullPolicy: IfNotPresent
deployment:
name: wordpress-deployment
service:
name: wordpress-service
type: NodePort
port: 80
nodePort: 32000
Helmチャートができたらすぐに、アプリケーションをKubernetesにデプロイするためのTerraform構成ファイルを作成する必要があります。
ベースディレクトリに戻って、helm.tf
を定義しましょう。 次の内容のTerraform構成ファイル:
provider "helm" {
kubernetes {
config_context = "minikube"
}
}
resource "helm_release" "mysql" {
name = "mysql"
chart = "${abspath(path.root)}/charts/mysql-chart"
}
resource "helm_release" "wordpress" {
name = "wordpress"
chart = "${abspath(path.root)}/charts/wordpress-chart"
}
Terraform構成の適用
最後のステップは、既知のコマンドを使用してアプリケーションをKubernetesクラスターにデプロイすることです。
$ terraform init
$ terraform apply
構成を展開する計画を承認します。
helm
を使用してデプロイを確認できます コマンド。
$ helm ls
または、kubectl
を使用して確認することもできます コマンド。
$ kubectl get all
デプロイされたアプリケーションにアクセスするには、次のMinikubeコマンドを実行する必要があります。
$ minikube service wordpress-service --url
このコマンドは、Minikubeによって公開されたWordPressサービスのURLを表示します。
おめでとう! WordPressアプリケーションは、HelmチャートとTerraformを使用して正常にデプロイされました。
Terraformのデプロイをクリーンアップするには、helm-provider
で通常のTerraformdestroyコマンドを使用します またはkubernetes-provider
フォルダ:
$ terraform destroy
この記事では、Terraformを使用してアプリケーションをKubernetesクラスターにデプロイする方法を示しました。これを行うための2つの異なるアプローチ、KubernetesプロバイダーとHelmTerraformプロバイダーについて説明しました。このデモでは、MinikubeをローカルのKubernetesクラスターとして使用しました。
この記事がお役に立てば幸いです。もしそうなら、私たちがそれを世界に広めるのを手伝ってください!ご不明な点がございましたら、下のコメントセクションでお知らせください。