blog.tawa.me

東京から福岡移住したWebエンジニアと時たま福岡出身の建築士が発信していくブログです

【Kubernetes】GKE上に配置したアプリケーションにHTTPSでアクセスできるようにする

f:id:tawachan39:20190616153810j:plain

今回自分のただのサイトをFirebaseからGKEに移してみました。(移す前はこの状態)

blog.tawa.me

blog.tawa.me

最近Dockerを使っていたのでプライベートでも使いたかったのと、毎回デプロイ先を考えるのが面倒だったので、GKEに上げてしまえばすべて解決なのではと思ったわけです。

昨日1日かけてなんとかアクセスできるようになったのは良いのですが、1日経たずすでに200円くらいかかっている感を感じているのです。遊びで運用するにはかなり高くついているので、敢え無く閉じようかと思っています。

一番ハマったのが、GKEで動いているアプリケーションを外部に公開するところでした。特に独自ドメインを当ててHTTPS化するところだったのでその話をメインに書いておきます。

Deploymentを設定

クラスター作ったりはいい感じにしてください。あと、デプロイしたいアプリケーションを適当にDockerイメージにまとめてCotainer Registryに上げておきます。

そして、そのイメージを使ってdeploymentを作りましょう。今回は、tawa-appという名前のアプリを置きました。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tawa-app-deployment
  labels:
    app: tawa-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tawa-app
  template:
    metadata:
      labels:
        app: tawa-app
    spec:
      containers:
        - name: tawa-app
          image: gcr.io/tawa-me/tawa-app
          ports:
            - containerPort: 3000

ServiceとIngressを設定

起動しているPodを外部に公開するための設定です。今回はIngressを使ってHTTPSでアクセスできるようにするのでtypeNodePortにします。

cloud.google.com

HTTPS化のためにマネージド証明書発行

gcloud beta compute ssl-certificates create tawa-cert --domains tawa.meで発行できるのでしておきます。

その証明書の名前(tawa-cert)はIngressの設定でingress.gcp.kubernetes.io/pre-shared-certに入れておくとよいらしいです(たぶん)。

ServiceとIngress

まとめて同じyamlに書いてます。

apiVersion: v1
kind: Service
metadata:
  name: tawa-app-service
spec:
  type: NodePort
  selector:
    app: tawa-app
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tawa-ingress
  annotations:
    kubernetes.io/ingress.allow-http: "true"
    # certificateを以下で作成しておく
    # gcloud beta compute ssl-certificates create tawa-cert --domains tawa.me 
    ingress.gcp.kubernetes.io/pre-shared-cert: tawa-cert
  labels:
    app: ingress
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: tawa-app-service
              servicePort: 3000

GUI上でIngressのロードバランサの設定(の確認)

Ingressをapplyするとロードバランサが自動で作られます。

f:id:tawachan39:20190616145548p:plain
ロードバランサが作られています

フロントエンド

HTTPとHTTPSの設定をする

フロントエンドはこのロードバランサにリスクエストを受けるときの設定(だと思っています)。

f:id:tawachan39:20190616150004p:plain
ロードバランスのフロントとバックを設定

HTTPS化等をするならここで設定します。編集を押して、HTTPSの設定をしましょう。先程生成したcertificateも選択肢にあるはずです。

このときSSLポリシーは独自でTLS1.2以上になるようにしておきました。

techblog.gmo-ap.jp

この設定をしないとアクセスが通らなかったので、制限がかかっているのでしょうか。

バックエンド

yaml上のIngressの設定で書いてあるので確認で良いはずです。 今回はすべてtawa-app-serviceに流していますが、パスを見て違うサービスに流すということもできるっぽいのでとても楽しそうです。

IPアドレスを固定しておく

公式とか見ると事前に固定IPを取得してそれをyamlとかで設定すれば良さそうな感じもありますが、GUI上で変えてもいけそうです。

f:id:tawachan39:20190616150543p:plain
リストの「タイプ」カラムを変えればよい

タイプがエフェメラルになっていたら静的にしておくと固定されるはず(たぶん)。

kubernetes.io/ingress.global-static-ip-name: k8s-fw-default-tawa-ingress--630497c773ccd137 という感じで、yamlにもこの固定IPの名前を設定しておくといいんですかね(あまりわかってない)。

Google DomainsからCloud DNSに流す

Google Domainsを使っているという前提で書きますが、他でドメインを取っていても同じなのではないでしょうか。この辺のドメイン周りもほぼ何もわかってなかったのですが、今回でちょっとイメージつかめた感があります。

イメージとしては、デフォルトだとGoogle Domainsで取ったDomainはGoogle Domains上で解決されるけれども、一部または全部をCloud DNS上の設定を参照させることができるという感じでしょうか。

このあたりは素人なので言葉の使い方とかきっと間違っているとは思いますが、許して下さい。

Cloud DNSでゾーンを作る

作業としては、Cloud DNSの画面でゾーンなるものを作ります。

f:id:tawachan39:20190616151831p:plain
ゾーンを作成しましょう

名前は何でも良いらしいですが、tawa.meの割当を担当してもらうというイメージでtawa-meにしました。

NSレコードをGoogle Domainsに設定

ゾーンの中を見るといろいろ値があります。

f:id:tawachan39:20190616152024p:plain
既に設定済みの状態なので少し違うはず。

その中のNSレコードをGoogle Domainsやドメインを取得したサービス上で設定する必要があります。

Google Domainsであればこんな感じです。

f:id:tawachan39:20190616152136p:plain
サブドメインだけで良ければこの画面の下でサブドメインに対して設定すればよい

Use custom name serversに入れることで、Google DomainsがCloud DNSを参照するようになり、Cloud DNSの設定が使われるようになるはずです。

Cloud DNSでtawa.meのAレコードにてIPを指定

上記設定が終わればもうGCP上で完結します。

Ingressで外部に公開しているIPをここで指定すると、tawa.meへのアクセスをこのIPに流してくれるようになるはずです(長かった)。

tawa.me -> Google Domains -> Cloud DNS -> 外部公開IP -> GKE上のService という流れでしょうか。HerokuとかFirebaseだとほぼ何も考えずにデプロイしたものに独自ドメイン当てたり自動でHTTPS化してくれたりしてましたけれど、相当ありがたいことだったんですね...。

しばし待機

DNSの設定やHTTPS化するcertificateがアクティブになるまでそれなりに時間がかかるので、辛抱強く待ちましょう。

設定が間違っていると思いきや、単に待てばよかったという場合もあったので、むやみにいじらず少し待ってから変更していったほうがドツボにはまらず良さそうな気がしました。

まとめ

1日かけてようやく動いて、Kubernetesでいつでも遊べる!と思ったのですが、値段が高すぎたわけです。

ちょっと残念ではありますが、この記事を見ればいつでもまたできると信じて落とそうかと思います。。