SlackのBotをGKEを使ってデプロイする

先日、Rubotyをk8sで動かす所までやりました。次のステップとしてGoogle Kubernetes Engine(GKE)を使ってクラスタを構築し、ボットをデプロイします。 Google Cloud SDKの使用は初めてでしたのでセットアップから始めました。

ダッシュボートからk8sクラスタGUIで作成します。クラスタ作成には設定値がたくさんありましたが、今回は特にいじらず作成しました。 f:id:keisuke_t:20181209190851p:plain

クラスタをshellからいじるために、接続します。

$ gcloud container clusters get-credentials bot --zone asia-northeast1-a --project your-cluster-name

試しに、podsを表示させようとしますが、まだ何もしてないので表示されません。

$ kubectl get pods
No resources found.

今回、デプロイするのは前回記事で構築したRubotyボットです。前回はDocker hubにimageを置きましたが、今回はGoogle Container Registryへimageをpushし直しました。

KubernetesでRubotyを動かして自動復旧を味わう - keisuke-tの日記

$ gcloud docker -- push asia.gcr.io/your-cluster-name/ruboty:latest

同時に、k8sマニフェストファイルも書き換えています。今回は、Deploymentを定義しています。 Deploymentはアプリケーションデプロイの基本単位となるリソースで、ResplicaSetは同じ仕様のPodのレプリカ数を管理、制御するリソースでしたがDeployementはReplicaSetを管理、制御するリソースです。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ruboty
  labels:
    app: ruboty
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ruboty
  template:
    metadata:
      labels:
        app: ruboty
    spec:
      containers:
        - name: ruboty
          image: asia.gcr.io/kube-test-224908/ruboty:latest
          imagePullPolicy: IfNotPresent

準備はできたので、podsを立ち上げます。

$ kubectl apply -f bot_deploy.yaml
kubectl get deployments
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
ruboty    1         1         1            1           7h
kubectl get pods --watch
NAME                      READY     STATUS    RESTARTS   AGE
ruboty-586bd8888-lg7fg   1/1       Running   0          7h

大成功です。 botも生きてますね。 f:id:keisuke_t:20181209213957p:plain

podsを削除しようとしても、自動復旧で再起動するので落とす時はDeployementごと落としましょう。

$ kubectl delete -f bot_deploy.yml

最後に

デプロイまでのフローがこんなにシンプルだとは思いませんでした。GCPダッシュボードから確認できるノードやポッドの状態もとても分かりやすいですし、この記事では書いてませんが、ポッドのスケーリングやデプロイ時のローリングアップデートも魅力的なので次回は、ウェブサービスのデプロイ、運用に使ってみたいと思いました。

github.com