GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

TerraformKubernetesプロバイダーの使用方法

この記事では、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.yamlingress.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.yamlingress.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
Terraform構成

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クラスターとして使用しました。

この記事がお役に立てば幸いです。もしそうなら、私たちがそれを世界に広めるのを手伝ってください!ご不明な点がございましたら、下のコメントセクションでお知らせください。


Docker
  1. Ubuntu20.04にMinikubeを使用してKubernetesをインストールする方法

  2. Kubernetes内でPodmanを使用する方法

  3. Kubernetes構成にConfigMapを使用する方法

  1. DockerComposeの使用方法

  2. DockerInspectコマンドの使用方法

  3. プロキシを使用するように docker を構成する方法

  1. Kubernetesシークレット–シークレットを作成、使用、アクセスする方法

  2. Kubernetes DaemonSetとは何ですか?その使用方法は?

  3. Minikube でローカル docker イメージを使用するには?