GCP ロードバランサと GKE クラスタを Terraform を使って構築する

こんにちは。@jedipunkz です。 少し前まで Google Cloud Platform (GCP) を使っていたのですが、今回はその時に得たノウハウを記事にしようと思います。 Google Container Engine (GKE) とロードバランサを組み合わせてサービスを立ち上げていました。手動でブラウザ上からポチポチして構築すると人的ミスや情報共有という観点でマズイと思ったので Terraform を使って GCP の各リソースを構築するよう仕掛けたのですが、まだまだ Terraform を使って GCP インフラを構築されている方が少ないため情報が無く情報収集や検証に時間が掛かりました。よって今回はまだネット上に情報が少ない GKE とロードバランサの構築を Terraform を使って行う方法を共有します。 構築のシナリオ 構築するにあたって2パターンの構築の流れがあると思います。 GKE クラスタとロードバランサを同時に構築する GKE クラスタを予め構築しそのクラスタ向けにロードバランサを構築する 両方の方法を記していきます。 GKE クラスタとロードバランサを同時に構築する GKE クラスタとロードバランサを同時に作る方法です。 早速ですが下記に terraform ファイルを記しました。それぞれのシンタックスの意味については Terraform の公式ドキュメントをご覧になってください。 公式ドキュメント : https://www.terraform.io/docs/providers/google/ ここで特筆すべき点としては下記が挙げられます。 ロードバランサに紐付けるバックエンドの ID 取得のため “${replace(element…” 的なことをしている ロードバランサのバックエンドサービスに対して GKE クラスタを作成した際に自動で作成されるインスタンスグループの URI を紐付ける必要があります。ユーザとしては URI ではなく “インスタンスグループ名” であると扱いやすいのですが、URI が必要になります。この情報は下記のサイトを参考にさせていただきました。 参考サイト : GKEでkubernetesのnodesをロードバランサーのバックエンドとして使いたいとき with terraform URL : http://qiita.com/techeten/items/b2ec5f11f4a70dd21d70 ロードバランサ一つ作るために 6 個ものインフラリソースを作っている 一つのロードバランサを作るために6つのインフラリソースが必要になるというのも驚きですが公式ドキュメントを読むとなかなかその感覚がつかめませんでした。それぞれの簡単な意味を下記に記しておきます。...

Serverless on Kubernetes : Fission を使ってみた

こんにちは。 @jedipunkz です。 今日は Kubernetes を使って Serverless を実現するソフトウェア Fission を紹介します。 AWS の Lambda とよく似た動きをします。Lambda も内部では各言語に特化したコンテナが起動してユーザが開発した Lambda Function を実行してくれるのですが、Fission も各言語がインストールされた Docker コンテナを起動しユーザが開発したコードを実行し応答を返してくれます。 それでは早速なのですが、Fission を動かしてみましょう。 動作させるための環境 macOS か Linux を前提として下記の環境を用意する必要があります。また Kubernetes 環境は minikube が手っ取り早いので用いますが、もちろん minikube 以外の kubernetes 環境でも動作します。 macOS or Linux minikube or kubernetes kubectl fission ソフトウェアのインストール方法 簡単にですが、ソフトウェアのインストール方法を書きます。 OS 私は Linux で動作させましたが筆者の方は macOS を使っている方が多数だと思いますので、この手順では macOS を使った利用方法を書いていきます。 minikube ここでは簡単な手順で kubernetes 環境を構築できる minikube をインストールします。 curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.16.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/fission kubectl 直接必要ではありませんが、kubectl があると minikube で構築した kubernetes 環境を操作できますのでインストールしておきます。...

Kubernetes Deployments を使ってみた!

こんにちは。 @jedipunkz です。 いま僕らは職場では GKE 上に Replication Controller と Services を使って Pod を起動しているのですが最近の Kubernetes 関連のドキュメントを拝見すると Deployments を使っている記事をよく見掛けます。Kubernetes 1.2 から実装されたようです。今回は Kubernetes の Replication Controller の次世代版と言われている Deployments について調べてみましたので理解したことを書いていこうかと思います。 参考資料 今回は Kubernetes 公式の下記のドキュメントに記されているコマンドを一通り実行していきます。追加の情報もあります。 https://kubernetes.io/docs/user-guide/deployments/ Deployments を使って nginx Pod を起動 nginx をデプロイするための Yaml ファイルを用意します。 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 作成した yaml ファイルを指定して Pod を作ります。 下記の通りここで “–record” と記しているのは、後に Deployments の履歴を表示する際に “何を行ったか” を出力するためです。このオプションを指定しないと “何を行ったか” の出力が “NONE” となります。...

Google Cloud CDN を使ってみた

こんにちは。@jedipunkz です。 今回は Google Cloud Platform の Google CloudCDN について調べてみたので記したいと思います。 CloudCDN は GCP のロードバランサのバックエンドサービスに紐付けられるサービスです。このバックエンドサービスで CloudCDN を有効にしていると CDN サービスを機能させることが出来ます。先に書いておくとこの CloudCDN はとてもシンプルで扱いやすいサービスだと判りました。高機能な他の CDN サービスと比べると機能が足らない感ありますが、必要最低限なところを抑えているのと、価格がとても安いです。(価格は下記の URL 参照) 価格表 : https://cloud.google.com/cdn/pricing 構成 構成と構成の特徴です。 +----------+ +---------+ | instance |--+ +-| EndUser | +----------+ | +------------+ +----------+ | +---------+ +--|LoadBalancer|--| CloudCDN |-+-| EndUser | +----------+ | +------------+ +----------+ | +---------+ | instance |--+ +-| EndUser | +----------+ +---------+ コンテンツが初めてリクエストされた場合キャッシュミスする キャッシュミスした際に近くにあるキャッシュからコンテンツを取得しようと試みる 近くのキャッシュがコンテンツがある場合、最初のキャッシュにコンテンツが送信される 近くのキャッシュにコンテンツがない場合、HTTP ロードバランサにリクエストが転送される その後のリクエストはキャッシュが応答する(キャッシュヒット) キャッシュ間のフィルは EndUser のリクエストに応じて実行される キャッシュを事前に読み込むことできない キャッシュは世界各地に配置されている CloudCDN を導入する方法 導入する方法は簡単で下記のとおりです。...

coreos の etcd operator を触ってみた

こんにちは @jedipunkz です。 今日は某アドベントカレンダーに参加していて記事を書いています。 記事だけ先出ししちゃいます..。 今日は最近 coreos がリリースした ’etcd-operator’ を触ってみようかと思います。ほぼ、README に書かれている手順通りに実施するのですが、所感を交えながら作業して記事にしてみたいと思います。 coreos が提供している etcd についてご存知ない方もいらっしゃると思いますが etcd は KVS ストレージでありながら Configuration Management Store として利用できる分散型ストレージです。Docker 等の環境を提供する coreos という軽量 OS 内でも etcd が起動していてクラスタで管理された情報をクラスタ内の各 OS が読み書きできる、といった機能を etcd が提供しています。 詳細については公式サイトを御覧ください。 etcd 公式サイト : https://coreos.com/etcd/docs/latest/ etcd-operator はこの etcd クラスタを kubernetes 上でクラスタ管理するための簡単に運用管理するためのソフトウェアになります。 etcd-operator 公式アナウンス : https://coreos.com/blog/introducing-the-etcd-operator.html 後に実際に触れていきますが下記のような管理が可能になります。 etcd クラスタの構築 etcd クラスタのスケールアップ・ダウン etcd Pod の障害時自動復旧 etcd イメージをオンラインで最新のモノにアップグレード では早速利用してみたいと思います。 必要な環境 下記の環境が事前に用意されている必要があります。 Docker Kubernetes or minikube+kubernetes (https://github.com/kubernetes/minikube) etcdctl : https://github.com/coreos/etcd/tree/master/etcdctl 作業準備 下記のレポジトリをクローンします。...

Helm を使って Kubernetes を管理する

こんにちは。@jedipunkz です。 今回は Helm という kubernetes のパッケージマネージャ的なソフトウェアを使ってみたので記事にしたいと思います。 公式サイト : https://helm.sh/ Kubernetes を仕事で使っているのですが “レプリケーションコントローラ” や “サービス” といった単位を使って Pod, Service を管理しています。Helm を使うことでこれらの管理方法が変わるのか調べたいと思います。 依存するソフトウェア 今回は MacOS を使って環境を整えます。 virtualbox minikube kubectl これらのソフトウェアをインストールしていきます。 $ brew cask install virtualbo $ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.12.2/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/ $ brew install kubectl minikube を使って簡易的な kubernetes 環境を起動します。 $ minikube start $ eval $(minikube docker-env) Helm を使ってみる Helm は Charts という単位で Kubernetes をパッケージングします。Charts の一覧を見てみましょう。...

Minikube で簡易 kubernetes 環境構築

こんにちは。@jedipunkz です。 kubernetes の環境を簡易的に作れる Minikube (https://github.com/kubernetes/minikube) が2ヶ月前ほどにリリースになっていました。簡単ですが少し触ってみたのでその際のメモを記したいと思います。VirtualBox もしくは VMware Fusion がインストールされていればすぐにでも稼働可能です。私は Kubernetes 初心者ですが何も考えずに kubernetes を動かすことが出来ました。 前提 前提として下記の環境が必要になります。 Mac OSX がインストールされていること VirtualBox もしくは VMware Fusion がインストールされていること minikube をインストール minikube をインストールします。 $ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.6.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/ kubetl をインストール 次に kubectl をインストールします。 $ curl -k -o kubectl https://kuar.io/darwin/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/ Minikube で Kurbernates を稼働 Minikube を使って Kubernetes を稼働してみます。下記のコマンドを実行すると Virtualbox 上で仮想マシンが稼働し Kubernetes 一式も立ち上がります。...

Go言語とInfluxDBで監視のコード化

こんにちは。@jedipunkz です。 今日は Go 言語でサーバのメトリクスデータを InfluxDB に入れてリソース監視を行う方法について書きます。 Ansible, Terraform, Chef などのソフトウェアを使ってインフラを定義するのが当たり前になった現在ですが、本当の意味でのソフトウェアによるインフラの定義ってなんだろと最近考えています。aws-sdk や fog などを使ったネイティブな言語でインフラを定義することの意味もあるように感じているからです。某サービスプロバイダのエンジニアはこうした言語によるインフラの定義の一番大きなメリットとして “再利用性” をあげていました。こうしたソフトウェアによるインフラの定義や構成を行う上で監視についてもコード化できるのでは?と考えて今回の記事に至りました。 使うモノ https://github.com/influxdata/influxdb/tree/master/client 公式の InfluxDB Go Client です。InfluxDB 自体が Go 言語で書かれていますがクライアントも Go 言語で記述することができます。ここにあるサンプルコードをすこしいじって、今回の記事を書こうと思います。 https://github.com/shirou/gopsutil @shirou さんが作られた psutil の Go 言語版です。CPU, Mem などリソースをモニタするのに便利なので利用します。 環境構築 環境を作っていきます。InfluxDB と Chronograf を構築するのですが Docker で構築するのが簡単なのでこれを利用します。Chronograf は InfluxDB 内のデータを可視化するためのソフトウェアです。 InfluxDB の起動 InfluxDB のコンテナを起動します。 docker run -p 8083:8083 -p 8086:8086 \ -v $PWD:/var/lib/influxdb \ influxdb Chronograf の起動 Chronograf のコンテナを起動します。 docker run -p 10000:10000 chronograf この時点で http://${DOCKER_HOST}:10000/ にアクセスすると Chronograf の UI を確認できます。...