LoginSignup
1
1

More than 3 years have passed since last update.

TerraformでHelm Chart(nginx-ingress, cert-manager)をデプロイするコード例

Last updated at Posted at 2020-01-19

はじめに

GKEにHelmでnginx-ingress, cert-managerを導入しアプリのデプロイ環境を構築するコマンド具体例
上記記事でコマンドライン実行による環境構築を行っていたが、今回Terraform化したので差分(主にHelm Chartに関連する部分)を説明する。

前提

  • GCPにて固定IPリソース作成済み
  • GKEクラスタ、ノードプール作成済み
  • コマンドラインでクラスタ認証済み gcloud container clusters get-credentials --zone asia-northeast1-a --project project-xxx clusters_xxx
  • コンソール環境変数 TF_VAR_project にGCPプロジェクト名設定済み
  • terraform-state用のgcsバケット作成済み

Terraformリソース部分の参考ブランチ下記とは少し構成と名称が違う

Helm Chart環境をTerraform化

Helm Chartインストール用のサービスアカウントを作成

gke-commnn/main.tf
variable "project" {}

provider "google" {
  project = var.project
  region  = "asia-northeast1"
  zone    = "asia-northeast1-a"
}

terraform {
  backend "gcs" {
    bucket  = "my-terraform-state"
    prefix = "gke-common"
  }
}

resource "kubernetes_service_account" "tiller" {
  metadata {
    name = "tiller"
    namespace = "kube-system"
  }
}

resource "kubernetes_cluster_role_binding" "tiller" {
  metadata {
    name = "tiller"
  }
  role_ref {
    api_group = "rbac.authorization.k8s.io"
    kind = "ClusterRole"
    name = "cluster-admin"
  }
  subject {
    kind = "ServiceAccount"
    name = "tiller"
    namespace = "kube-system"
  }
  depends_on = [kubernetes_service_account.tiller]
}
% terraform init
% terraform plan
% terraform apply

nginx-ingress

nginx-ingress/main.tf
provider "helm" {
  service_account = "tiller"
}

terraform {
  backend "gcs" {
    bucket  = "my-terraform-state"
    prefix = "helm/nginx-ingress"
  }
}

data "helm_repository" "stable" {
  name = "stable"
  url  = "https://kubernetes-charts.storage.googleapis.com"
}

resource "helm_release" "nginx_ingress" {
  name      = "nginx-ingress"
  repository = data.helm_repository.stable.metadata[0].name
  chart     = "stable/nginx-ingress"
  namespace = "nginx-ingress"

  set {
    name = "rbac.create"
    value = true
  }

  set {
    name = "controller.publishService.enabled"
    value = true
  }
}

・nginx-ingressのリソース作成

% terraform init
% terraform plan
% terraform apply

・上記Terraform実行処理はnginx-ingress-controllerのserviceに固定IPを設定しないと正常完了しない1

# 固定IP指定
% kubectl edit svc nginx-ingress-controller --namespace=nginx-ingress
# type: LoadBalancer の直下に下記を追加する
loadBalancerIP: "取得した固定IP"

作成されたnginx-ingress関連リソースにエラーが表示されていない事を確認する。

cert-manager

・リソース作成前に設定投入しておく必要有り。公式解説

kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.10/deploy/manifests/00-crds.yaml
cert-manager/main.tf
provider "helm" {
  service_account = "tiller"
}

terraform {
  backend "gcs" {
    bucket  = "my-terraform-state"
    prefix = "helm/cert-manager"
  }
}

data "helm_repository" "cert_manager" {
  name = "jetstack"
  url  = "https://charts.jetstack.io"
}

resource "helm_release" "cert_manager" {
  name      = "cert-manager"
  namespace = "cert-manager"
  repository = data.helm_repository.cert_manager.metadata[0].name
  chart = "cert-manager"
  version = "v0.10.1"
}

・cert-managerのリソース作成

% terraform init
% terraform plan
% terraform apply

cert-managerのリソースも正常に作成されていればOK。

以前の記事を参考にDeployment、 Service、 Ingress、 ClusterIssuer、 Certificateのyamlを
kubectl applyしてやればSSL接続のGKE環境が完成する。

参考

Helm Provider
helm_release
GKEなどRBACが有効な環境でHelmを利用するには?


  1. ここも出来ればコード化したいが方法が不明。。 

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1