Terraformを用いたGKE構築

More than 1 year has passed since last update.


目的


  • Kubernetes(以下、k8s)環境をサクッと体験してみたい :beginner:

  • k8sもコードで 管理 したい :computer:


  • etc...


使用するアプリケーション



  • GCP


    • Google社が提供しているクラウドプラットフォーム

    • このサービスの中のKubernetes Engineを使います




  • Terraform


    • HashiCorp社製のコード管理ツール

    • k8sのスペック管理や構築に使います




  • Docker


    • 言わずとしれた仮想化コンテナ技術


      • 詳しくは他の記事を参考にして下さい:bow:



    • 今回はDocker for Macを用いて、Terraformの実行環境をコード化します




  • git


    • コードの管理・受け渡しに使います




準備


GCPの準備・開設


  • 他に詳しく書いてる方が沢山いますので割愛します。


GCP上のサービスアカウントキー取得

[https://console.cloud.google.com/home/]



  • APIとサービス > [認証情報]をクリック


    • [認証情報を作成]をクリック


      • [サービス アカウント キー]をクリック






  • 下記のように新しくサービスアカウントを作成する



    • :warning: 役割は適宜変更して下さい



2018-03-17-01.png


  • json形式のサービスアカウントをダウンロード


ソースのclone


  • お手元の環境にソースをcloneします

cd ${作業ディレクトリ}

git clone https://github.com/iganari/try-gke.git
cd try-gke


認証情報の設置


  • 先程ダウンロードした認証情報のjsonを service-account.json という名前に変更します

## 例

mv hogehoge.json service-account.json


  • リネームしたjsonを先程cloneしたディレクトリにコピーします

$ ls -1 try-gke/

Dockerfile
docker-build-run.sh
etc/
main.tf
operation-tf-build.sh
operation-tf-remove.sh
readme.md
service-account.json <--------- これ
service-account.json.sample
terraform/
variables.tf


起動設定の変更



  • variables.tf の中にGCP上のプロジェクト名やk8sクラスターの名前やノードの数、バージョンを記入するとこがあるので適宜編集しましょう

vim variables.tf


  • 最低限変更が必要な項目


    • project

    • master_auth_password

    • min_master_version(※ 古いバージョンになった場合)

    • node_version(※ 同上)




dockerの起動

:warning: dockerコマンドがsudo無しで起動出来る環境を想定していますので適宜環境にあわせて sudo 等をつけて下さい

sh docker-build-run.sh


  • 起動すると コンテナの中にログインしています :whale:


    • 以下の作業で :whale: があるものは上記のコンテナ内での作業(コマンド)です




Terraformの初期作業

Terraformを使用するための初期作業が必要になるのでコマンドで実施します。



  • :whale: terraformの初期設置

./terraform/terraform init


  • 結果

Terraform has been successfully initialized!


Terraformを使って、GKE上にk8sクラスターを起動



  • :whale: terraformの実施

sh operation-tf-build.sh


  • しばらくすると、GKE上に任意のK8sが作成出来きてます :ok_woman:

2018-03-17-02.png


k8sにアクセスしてみる

このままだと外からk8sを見ているだけなので、k8sの内部にアクセスしてみる



  • :whale: 環境変数を抜き出す

export client_email=`cat service-account.json | grep client_email | awk -F\" '{print $4}'`

export project_id=`cat service-account.json | grep project_id | awk -F\" '{print $4}'`

export myid=`cat terraform.tfstate | jq -r '.modules[].resources[].primary.attributes.id''`

export myzone=`cat terraform.tfstate | jq -r '.modules[].resources[].primary.attributes.zone'`



  • :whale: GCPに対してgoogle authを通す

gcloud auth activate-service-account \

${client_email} \
--key-file ./service-account.json \
--project ${project_id}



  • :whale: 今回作成したk8sに対して、kubectl コマンドのアクセスを作成する

gcloud container clusters get-credentials \

${myid} \
--zone ${myzone} \
--project ${project_id}



  • :whale: Kubernetes コントロール プレーンへのプロキシを開始する

kubectl proxy --address='0.0.0.0' &

2018-03-17-02.png


これで手元の :whale: とGKE上のk8sを繋ぐことが出来ました :ok_woman:


破棄

作業が終わったら、各リソースを削除しておきましょう



  • :whale: terraformによるk8sの削除

sh operation-tf-remove.sh



  • :whale: コンテナの破棄

exit


:warning: 注意点

clusterの数を変更する場合、一度全てのnodeが破棄されるためサービス維持に難有り。