KubernetesによるコンテナでWordPress作成

  KubernetesによるコンテナでWordPressを作成します。流れは以下の通りになります。

  1. AlibabaCloudでKubernetesクラスターを生成
  2. kube_configを環境変数にて設定
  3. KubernetesクラスターのローカルボリュームにてWordPressとMySQLをインストール


こちらはAlibabaCloud Terraformのサンプル集を通じての紹介になります。

Kubernetesでクラスタ生成

  KubernetesによるコンテナでWordPressを作成します。流れは以下の通りになります。


  TerraformでWebアプリケーションを作ってみます。step1のゴール構成図は以下の通りです。

図 1

それぞれのパラメータは以下の通りです。

ネットワーク構成:

リソース リソース名 パラメータ 必須 設定値 内容
alicloud_vpc vpc name 任意 ${var.project_name}-vpc VPC の名称。この例の場合、Web-App-on-k8s-for-Terraform-vpc として表示されます。
vpc cidr_block 必須 192.168.1.0/24 VPC の CIDR ブロック
vpc description 任意 Enable k8s-Setteing-Sample vpc VPC の説明。
alicloud_vswitch vsw name 任意 ${var.project_name}-vswitch vswitch の名称。この例の場合、Web-App-on-k8s-for-Terraform-vswitch として表示されます。
vsw vpc_id 必須 ${alicloud_vpc.vpc.id} アタッチするVPCのID
vsw cidr_block 必須 192.168.1.0/28 vswitch の CIDR ブロック
vsw availability_zone 必須 ${var.zone} 使用するアベイラビリティゾーン
vsw description 任意 Enable k8s-Sample vswitch vswitch の説明。

kubernetesクラスター構成:

リソース リソース名 パラメータ 必須 設定値 内容
alicloud_cs_kubernetes k8s name 任意 ${var.project_name}-k8s kubernetesクラスター名称
k8s vswitch_ids 必須 ”${alicloud_vswitch.vsw.id}” アタッチするVSwitchのID。
k8s availability_zone 必須 ${var.zone} 使用するアベイラビリティゾーン
k8s new_nat_gateway 任意 true kubernetesクラスタの作成中に新しいNATゲートウェイを作成するかどうか。デフォルトはtrue。
k8s master_instance_types 必須 [“ecs.xn4.small”] マスターノードのインスタンスタイプ。
k8s worker_instance_types 必須 [“ecs.xn4.small”] ワーカーノードのインスタンスタイプ。
k8s worker_numbers 任意 [2] ワーカーノードの台数。
k8s master_disk_size 任意 40 マスターノードのシステムディスクサイズ。
k8s worker_disk_size 任意 100 ワーカーノードのシステムディスクサイズ。
k8s password 任意 ”${var.k8s_password}” クラスタノードのsshログインパスワード。
k8s pod_cidr 任意 “172.20.0.0/16” ポッドネットワークのCIDRブロック。
k8s service_cidr 任意 “172.21.0.0/20” サービスネットワークのCIDRブロック。
k8s enable_ssh 任意 true SSHログインを許可するか。デフォルトはfalse。
k8s install_cloud_monitor 任意 true クラウドモニタをkubernetesノードにインストールするかどうか。


ソースは以下になります。


main.tf

provider "alicloud" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region = "${var.region}"
}

resource "alicloud_vpc" "vpc" {
  name = "${var.project_name}-vpc"
  cidr_block = "192.168.1.0/24"
  description = "Enable Web-App on k8s vpc"  
}

resource "alicloud_vswitch" "vsw" {
  name = "${var.project_name}-vswitch"  
  vpc_id            = "${alicloud_vpc.vpc.id}"
  cidr_block        = "192.168.1.0/28"
  availability_zone = "${var.zone}"
  description = "Enable Web-App on k8s vswitch"  
}

resource "alicloud_cs_kubernetes" "k8s" {
  name                  = "${var.project_name}-k8s"  
  vswitch_ids           = ["${alicloud_vswitch.vsw.id}"]
  availability_zone     = "${var.zone}"
  new_nat_gateway       = true
  master_instance_types  = ["ecs.xn4.small"]
  worker_instance_types  = ["ecs.xn4.small"]
  worker_numbers        = [2]
  master_disk_size      = 40
  worker_disk_size      = 100
  password              = "${var.k8s_password}"
  pod_cidr              = "172.20.0.0/16"
  service_cidr          = "172.21.0.0/20"
  enable_ssh            = true
  install_cloud_monitor = true
}


variables.tf

variable "access_key" {}
variable "secret_key" {}
variable "region" {}
variable "zone" {}
variable "project_name" {}
variable "k8s_password" {}

variable "wordpress_version" {}
variable "mysql_version" {}
variable "mysql_password" {}


output.tf

output "cluster_id" {
  value = ["${alicloud_cs_kubernetes.k8s.*.id}"]
}
output "worker_nodes" {
  value = ["${alicloud_cs_kubernetes.k8s.*.worker_nodes}"]
}
output "master_nodes" {
  value = ["${alicloud_cs_kubernetes.k8s.*.master_nodes}"]
}


confing.tfvars

access_key = "xxxxxxxxxxxxxxxx"
secret_key = "xxxxxxxxxxxxxxxx"
region = "ap-northeast-1"
zone = "ap-northeast-1a"
project_name = "Web-App-on-k8s-for-Terraform"
k8s_password = "!Password2019"

wordpress_version = "5.2.2"
mysql_version = "5.7"
mysql_password = "!Password2019"

  ソースの準備ができたら実行します。

terraform init
terraform play -var-file="confing.tfvars"
terraform apply -var-file="confing.tfvars"


これで問題なく実行できたら、cluster_id、worker_nodes、master_nodesが表示され、こうしてkubernetesクラスター操作、管理ができます。


kube_configを環境変数にて設定

  先ほどはKubernetesクラスタを作成しました。このクラスタを使ってwordpressを作成するため、Kubernetesコマンドラインクライアントである kubectl を使用します。kubectlはk8sクラスタのAPIサーバーと通信するためのコマンドラインツールです。

  1. 最新のkubectlをダウンロードします。
  2. kubectlのインストールおよび設定をします。 kubectlのインストール方法はこちらを参照してください。
  3. クラスターの資格情報を設定します。設定方法はこちらを参照してください。

図 3

KubernetesクラスタにてWordpressインストール

  これでKubernetesクラスタのkube_configを環境変数にて設定しました。今度はTerraform on Kubernetesを使ってubernetesクラスタにてWordPressを入れます。ゴールの構成図は以下の通りです。

図 4


ソースは以下になります。サンプルソースは[こちら]()にあります。


confing.tfvars

project_name = "Web-App-on-k8s-for-Terraform"
wordpress_version = "5.2.2"
mysql_version = "5.7"
mysql_password = "!Password2019"


variables.tf

variable "project_name" {}
variable "wordpress_version" {}
variable "mysql_version" {}
variable "mysql_password" {}


mysql.tf

resource "kubernetes_service" "mysql" {
  metadata {
    name = "wordpress-mysql"

    labels {
      app = "wordpress"
    }
  }

  spec {
    port {
      port = 3306
    }

    selector {
      app  = "wordpress"
      tier = "${kubernetes_replication_controller.mysql.spec.0.selector.tier}"
    }

    cluster_ip = "None"
  }
}

resource "kubernetes_persistent_volume_claim" "mysql" {
  metadata {
    name = "mysql-pv-claim"

    labels {
      app = "wordpress"
    }
  }

  spec {
    access_modes = ["ReadWriteOnce"]

    resources {
      requests {
        storage = "20Gi"
      }
    }

    volume_name = "${kubernetes_persistent_volume.mysql.metadata.0.name}"
  }
}

resource "kubernetes_secret" "mysql" {
  metadata {
    name = "mysql-pass"
  }

  data {
    password = "${var.mysql_password}"
  }
}

resource "kubernetes_replication_controller" "mysql" {
  metadata {
    name = "wordpress-mysql"

    labels {
      app = "wordpress"
    }
  }

  spec {
    selector {
      app  = "wordpress"
      tier = "mysql"
    }

    template {
      container {
        image = "mysql:${var.mysql_version}"
        name  = "mysql"

        env {
          name = "MYSQL_ROOT_PASSWORD"

          value_from {
            secret_key_ref {
              name = "${kubernetes_secret.mysql.metadata.0.name}"
              key  = "password"
            }
          }
        }

        port {
          container_port = 3306
          name           = "mysql"
        }

        volume_mount {
          name       = "mysql-persistent-storage"
          mount_path = "/var/lib/mysql"
        }
      }

      volume {
        name = "mysql-persistent-storage"

        persistent_volume_claim {
          claim_name = "${kubernetes_persistent_volume_claim.mysql.metadata.0.name}"
        }
      }
    }
  }
}


wordpress.tf

resource "kubernetes_service" "wordpress" {
  metadata {
    name = "wordpress"

    labels {
      app = "wordpress"
    }
  }

  spec {
    port {
      port = 80
    }

    selector {
      app  = "wordpress"
      tier = "${kubernetes_replication_controller.wordpress.spec.0.selector.tier}"
    }

    type = "LoadBalancer"
  }
}

resource "kubernetes_persistent_volume_claim" "wordpress" {
  metadata {
    name = "wp-pv-claim"

    labels {
      app = "wordpress"
    }
  }

  spec {
    access_modes = ["ReadWriteOnce"]

    resources {
      requests {
        storage = "20Gi"
      }
    }

    volume_name = "${kubernetes_persistent_volume.wordpress.metadata.0.name}"
  }
}

resource "kubernetes_replication_controller" "wordpress" {
  metadata {
    name = "wordpress"

    labels {
      app = "wordpress"
    }
  }

  spec {
    selector {
      app  = "wordpress"
      tier = "frontend"
    }

    template {
      container {
        image = "wordpress:${var.wordpress_version}-apache"
        name  = "wordpress"

        env {
          name  = "WORDPRESS_DB_HOST"
          value = "wordpress-mysql"
        }

        env {
          name = "WORDPRESS_DB_PASSWORD"

          value_from {
            secret_key_ref {
              name = "${kubernetes_secret.mysql.metadata.0.name}"
              key  = "password"
            }
          }
        }

        port {
          container_port = 80
          name           = "wordpress"
        }

        volume_mount {
          name       = "wordpress-persistent-storage"
          mount_path = "/var/www/html"
        }
      }

      volume {
        name = "wordpress-persistent-storage"

        persistent_volume_claim {
          claim_name = "${kubernetes_persistent_volume_claim.wordpress.metadata.0.name}"
        }
      }
    }
  }
}


localvolumes.tf

provider "kubernetes" {}

resource "kubernetes_persistent_volume" "mysql" {
  metadata {
    name = "local-pv-mysql"

    labels {
      type = "local"
    }
  }

  spec {
    capacity {
      storage = "20Gi"
    }

    access_modes = ["ReadWriteOnce"]

    persistent_volume_source {
      host_path {
        path = "/tmp/data/pv-mysql"
      }
    }
  }
}

resource "kubernetes_persistent_volume" "wordpress" {
  metadata {
    name = "local-pv-wordpress"

    labels {
      type = "local"
    }
  }

  spec {
    capacity {
      storage = "20Gi"
    }

    access_modes = ["ReadWriteOnce"]

    persistent_volume_source {
      host_path {
        path = "/tmp/data/pv-wordpress"
      }
    }
  }
}


output.tf

output "slb_ip" {
  value = "${kubernetes_service.wordpress.load_balancer_ingress.0.ip}"
}


  ソースの準備ができたら実行します。

terraform init
terraform play -var-file="confing.tfvars"
terraform apply -var-file="confing.tfvars"


これで完了です。問題なく実行できたら、SLBのIPが表示されます。