Dockerコンテナ、GKEを使用したGCPコストのBigQuery格納方法

Docker,GKEを利用してGCPのコストをBigQueryに格納しているので、その方法について記載する。

実施手順の流れは以下のとおり。なお1及び2に関しては以下のページを参照して実施。
http://qiita.com/noralife/items/dbeea7084b927319d0f6

# 1. 日毎のBilling情報をGCSにExport
Billingのページから「課金データのエクスポート」を選択し、どのバケットにBilling情報をExportするか設定する。

# 2. GCSにExportされたBilling情報を取得し、BigQueryにLoadするスクリプトの作成
以下の3つのファイルを用意
- schema.json
- formatter.py
- bq-load.sh

Schemaファイルとformatter.pyは下記GitHubから取得。Schemaは現時点（20160815)のものと違っていたため一部修正。
https://github.com/noralife/gcp-export-billing-bq

# 3. Docker Container化
GitHubのアカウント、TokenはARGでdocker build時に渡し、gcloudの認証はサービスアカウントの鍵を使用して認証をとおす。鍵はbuild時にホストからコピーすることにした。
※ここではCloud PubSubからメッセージを取得するとGCSからコストのファイルを取得し、BigQueryにロードする処理をスクリプト化したものをコンテナで実行するようにする。

#### Dockerfileの作成

```Dockerfile
FROM ubuntu:14.04
ARG GITHUB_ACCOUNT
ARG GITHUB_CREDENTIAL
ARG SERVICE_ACCOUNT

RUN apt-get update && apt-get install -y \
    curl \
    git \
    python \
    python-pip \
    unzip \
    wget \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

# Deploy application
RUN git clone -b develop https://$GITHUB_ACCOUNT:$GITHUB_CREDENTIAL@github.com/XXX/YYY.git

RUN pip install -r XXX/gcp-cost/requirements.txt

# Install the Google Cloud SDK.
ENV HOME /
ENV CLOUDSDK_PYTHON_SITEPACKAGES 1
RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/google-cloud-sdk.zip && unzip google-cloud-sdk.zip && rm google-cloud-sdk.zip
RUN google-cloud-sdk/install.sh --usage-reporting=true --path-update=true --bash-completion=true --rc-path=/.bashrc --additional-components alpha beta 
ENV PATH /google-cloud-sdk/bin:$PATH
RUN google-cloud-sdk/bin/gcloud config set --installation component_manager/disable_update_check true

COPY ./cert/sa-key.json /root/
RUN gcloud auth activate-service-account $SERVICE_ACCOUNT --key-file /root/sa-key.json --project {Project Name}

ENV PATH /gcp-cost/:$PATH
WORKDIR /gcp-cost
CMD ["/bin/bash","chk_pubsub_msg.sh"]
```

#### コンテナのビルド
以下のコマンドを実行。

```
sudo docker build --no-cache=true --build-arg GITHUB_ACCOUNT={GitHubアカウント} --build-arg GITHUB_CREDENTIAL=｛トークン｝ --build-arg SERVICE_ACCOUNT=｛サービスアカウント名｝ -t gcr.io/｛プロジェクト｝/gcp-cost:0.1 gcp-cost
```

# 4. GKE(k8s)へのデプロイ
#### コンテナクラスタの作成
GUIで作成。
以下のコマンドを実行しセットアップする。

```
$ sudo gcloud components update kubectl
$ gcloud config set compute/zone ZONE
$ gcloud config set container/cluster CLUSTER_NAME
$ gcloud container clusters get-credentials ｛クラスタ名｝
```

#### Container Registryへの登録
以下のコマンドを実行しContainer Registryへコンテナイメージをプッシュする。

```
sudo gcloud docker push gcr.io/{プロジェクト名}/gcp-cost:0.1
```

#### deployment.yamlの作成
Podをデプロイするための定義ファイルを作成する。

```deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: gcp-cost
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: gcp-cost-pods
    spec:
      containers:
      - name: gcp-cost-container
        image: gcr.io/{プロジェクト名}/gcp-cost:0.1
```

#### Podの適用
以下のコマンドを実行し、クラスタへPodをクラスタへ適用する。

```
$ export PATH=/usr/lib/google-cloud-sdk/bin/:$PATH
$ kubectl apply -f gcp-cost/deployment.yaml 
deployment "gcp-cost" created
```

```
$ kubectl get deployments
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
gcp-cost   1         1         1            0           1m
```

```
$ kubectl get pods
NAME                                READY     STATUS    RESTARTS   AGE
gcp-cost-XXXXXXXXXXXXXXXX           1/1       Running   0          1m
```

うまくRunningにならないときは、"kube describe pod"や"kubectl logs"などでデバッグをする。