Kubernetes・GKEでの公開

続きます。

kubectl で設定を行うためのyamlファイル作成

上記でGoogle Container Registryに登録したDockerイメージをGKE(GCP の Kubernetes Engine)で公開します。

今回は、APIだけを公開するということで、API用のファイルだけ作成します。

内容は、基本的には、githubの方を参照しています。

https://github.com/pco2699/NullSuck-AI/tree/master/k8s

また、イングレス用ファイルは下記のような感じで作りました。
k8s/api/api-ingress.yml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: api-ingress
spec:
  rules:
      - http:
        paths:
          - path: /*
            backend:
              serviceName: api-svc
              servicePort: 5432

GKE周りの設定

これを適用するにあたり、まずは準備ということで、

gcloud container clusters create nullsuck --num-nodes 2
--zone asia-northeast1-a

を実行するとなっていますが、エラー。

ERROR: (gcloud.container.clusters.create) ResponseError: code=403, message=Kubernetes Engine API is not enabled for this project. Please ensure it is enabled in Google Cloud Console and try again: visit https://console.cloud.google.com/apis/api/container.googleapis.com/overview?project=nullsuck-247713 to do so.

先に、Kubernetes Engine APIを有効にしましょう。メッセージに記載されているURLからボタン押すだけです。
で、続けますが、

gcloud container clusters get-credentials nullsuck
ERROR: (gcloud.container.clusters.get-credentials) One of [--zone, --region] must be supplied: Please specify location.

gcloud config list で現在の状況を確認すると、確かにゾーン・リージョンの設定がないので、
https://cloud.google.com/compute/docs/regions-zones/changing-default-zone-region?hl=ja
デフォルトのゾーンまたはリージョンの変更
にしたがって設定しましたが、これでは読み込んでくれませんでした。

ですので、コマンドで設定します。

gcloud config set compute/region asia-northeast1
gcloud config set compute/zone asia-northeast1-a

で、本にはありませんが、

gcloud components install kubectl

で、kubectlをインストールして、これも、本のコマンドはyamlファイルの拡張子が違うので要注意ですが、

kubectl apply -f k8s/api/api-deployment.yml
kubectl apply -f k8s/api/api-service.yml
kubectl apply -f k8s/api/api-ingress.yml

ただ、これだと、

error: error validating "k8s/api/api-ingress.yml": error validating data: [ValidationError(Ingress.spec.rules[0].http): unknown field "backend" in io.k8s.api.extensions.v1beta1.HTTPIngressRuleValue, ValidationError(Ingress.spec.rules[0].http): missing required field "paths" in io.k8s.api.extensions.v1beta1.HTTPIngressRuleValue]; if you choose to ignore these errors, turn validation off with --validate=false

と言われてしまったので、

kubectl apply -f k8s/api/api-ingress.yml --validate=false

とすることで、とりあえず一式できました。

ただ、これによりできている、二つのコンテナ api と cloudsql-proxy は、どちらも、ContainerCreating となってしまっています。
詳細を見ると、secrets “cloudsql-instance-credentials” not found となってしまっているので、それが原因ではないかと思いますが、「GKE の Secret はのちほど設定します」とのことなので、もう少し進めてみます。

Cloud SQL の設定・Credientials の設定

SQLサービスは、いきなり

gcloud beta sql instances create nullsuck-db --tier=db-f1-micro --activation-policy=ALWAYS

で、作成を開始してくれますが、しばらくすると、

ERROR: (gcloud.beta.sql.instances.create) Operation https://www.googleapis.com/sql/v1beta4/projects/nullsuck-・・・ is taking longer than expected. You can continue waiting for the operation by running `gcloud beta sql operations wait --project ・・・`

というエラーメッセージが表示されます。しかし、これはエラーというよりは、このコマンドとしてのセッションは切ったというだけなので、メッセージの最後に書いてあるコマンドを叩くと、その後の処理状況も確認できます。
そして、無事作成されていました。

次にrootへのパスワード設定を行いますが、これは

gcloud sql instances set-root-password nullsuck-db --password = xxx

など、マニュアル見ながらいくつかのオプションの書き方等を試してみましたがダメ。最終的には、

gcloud sql users set-password root --host=% --instance=nullsuck-db --prompt-for-password

で成功しました。

その後のsecretの作成は書いてあるままで進みましたので、これで先ほど問題となっていた、cloudsql-instance-credentials も作成されたと思われます。

この辺、ひたすらコマンドで進められるのは良いですね。