ntgaura.netをGKEに移転した

以下ちょっと追記でメモをがーっと貼っておく

gcloudコマンドで一通りGKE上にコンテナクラスタを作る

コンテナクラスタを構成してkubectlから触る

# コンテナクラスタをとりあえず準備する
# (マシンの準備みたいなもの。kubernetesで管理対象になるノード郡)
# 今回はとりあえず最小で作っておこう
gcloud container clusters create ntgaura-web-cluster --zone asia-northeast1-a --machine-type n1-standard --num-nodes 1

# このときの --zone に与えるゾーン名がわからないなら以下のコマンドで得られる
# gcloud compute zones list
# ...で得られる。

# --machine-types についても
# gcloud compute machine-types list
# ...で得られる。

# 次のコマンドで ~/.kube/config ができるのでkubectlでクラスタを操作できるようになる
gcloud container clusters get-credentials ntgaura-web-cluster --zone=asia-northeast1-a

# GKEの状況をkubectlで見るには以下のようにする(Readyになってればそのノードが現在有効。)
kubectl get nodes

ローカル環境のminikubeで似たような状況を作る

GCPに対して作るものをテストするときなんかはこっちでやる。

# minikubeをスタートしてローカルでk8sを使えるようにする
minikube start

# 上だと最新版が立ち上がってしまう。バージョンを指定しながら起動するにはこう
# minikube start --kubernetes-version v1.5.3

# minikubeの状況をkubectlで見るには以下のようにする(Readyになってればそのノードが現在有効。)
kubectl get nodes

# あとで使うためにContainer Registryを作っておこう
docker run -d -p 5000:5000 --restart=always --name registry registry:2

コンテナイメージの準備とコンテナレジストリへの登録

# この辺でDockerfileをいい具合に作る
vim Dockerfile

# んでもってdockerでビルドしておく
docker build -t ntgaura-web:v1.0 .

# 出来上がったdocker imageを確認
docker images

# GCPのContainer Registryに作ったdocker imageを登録する
# このとき gcr.io/<PROJECT_ID>/名前:タグ という名称にするお作法らしい
# なのでそういうタグをつける。
docker tag ntgaura-web:v1.0 gcr.io/ntgaura-web/ntgaura-web:v1.0

# イメージをGCP上のContainer Registryにアップロードする。
# gcloud dockerを経由してpush操作をすることでGCP上にうまくつながる仕組み。
gcloud docker -- push gcr.io/ntgaura-web/ntgaura-web:v1.0

# 実体はCloud Storage上に上がるようなので注意。
gsutil ls -R gs://artifacts.*

ローカルのコンテナレジストリを使う時

# minikubeを対象にdockerを働かせることにしたい。
# ...のでminikubeのdockerを使うように色々する
eval $(minikube docker-env)

# dockerに立ててあるContainer Registryに作ったdocker imageを登録する
# このとき localhost:5000/<PROJECT_ID>/名前:タグ という名称にするお作法らしい
# なのでそういうタグをつける。
docker tag ntgaura-web:v1.0 localhost:5000/ntgaura-web/ntgaura-web:v1.0

kubectlでkubernetes上にデプロイ・サービス開始する

# kubectlで 1. deployment, 2. service の2つを定義したらアプリを構築できる
# deploymentはdocker imageをいい具合に各ノードに配置するための定義で
# serviceは各deploymentをどのように外ネットに見せるかの定義。
# ...と思えばだいたいあってる
# それぞれYAMLで書く。
kubectl create -f ntgaura-web.deployment.yml
kubectl create -f ntgaura-web.service.yml

# ちなみに知見として(勘違いかもしれないが現状の挙動を軽く見る限り)
# もし過去に"v1.0"タグを切ってデプロイしてpodsにしたことがあったら
# 新しく"v1.0"をタグ切り直してpushしてレジストリに上げても
# それは「前にデプロイした」"v1.0"で動いてしまうので
# 必ずバージョンアップが必要なことに注意。

# External-IPがserviceのところに登場するので、それで動作確認する。
# 場合によっては外部ネットワークに公開するポートを設定しないといけないかも。
# デフォルトだとどうやらエフェメラルなIPアドレスなので
# うまいことymlでservice作るときに設定してIP決め打ちで与えるようにしたい。
kubectl get service

# ...と言いたいのだけれど、minikubeでは、ここは必ずpendingになる
# 実際にアクセスできるようにするには以下の手段しかなさそう。
minikube service ntgaura-web

# いい具合にブラウザが開いて状況が見れる様になると思う。
# kubernetesのmanifestファイル(yml)のテストとしてはちょっと微妙だけど......

秘匿情報をコンテナに伝えるには?

kubernetesにはsecret という仕組みがあって、これを使うとコンテナに環境変数などを経由して情報を渡せる

kubectl create secret generic ntgaura-web \
  --from-literal=APP_BASE_URL=ntgaura.net \
  --from-literal=APP_TITLE=MathematicalGaura \
  --from-literal=DROPBOX_APP_KEY=hogehoge \
  --from-literal=DROPBOX_APP_SECRET=hogehoge \
  --from-literal=DROPBOX_ACCESS_TOKEN=hogehoge

などで secret を作って deploymentmanifest ファイルから

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    name: ntgaura-web
  name: ntgaura-web
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: ntgaura-web
    spec:
      containers:
      - image: gcr.io/ntgaura-web/ntgaura-web:v1.2
        name: ntgaura-web
        ports:
        - containerPort: 4567
        env:
        - name: APP_BASE_URL
          valueFrom:
            secretKeyRef:
              name: ntgaura-web
              key: APP_BASE_URL
        - name: APP_TITLE
          valueFrom:
            secretKeyRef:
              name: ntgaura-web
              key: APP_TITLE
        - name: DROPBOX_APP_KEY
          valueFrom:
            secretKeyRef:
              name: ntgaura-web
              key: DROPBOX_APP_KEY
        - name: DROPBOX_APP_SECRET
          valueFrom:
            secretKeyRef:
              name: ntgaura-web
              key: DROPBOX_APP_SECRET
        - name: DROPBOX_ACCESS_TOKEN
          valueFrom:
            secretKeyRef:
              name: ntgaura-web
              key: DROPBOX_ACCESS_TOKEN

のように参照して使う。