月10ドルのKubernetesクラスタに無料で取得したドメインでアクセスできるようにする

概要

前回は$10/月のKubernetesクラスタを作成しました。

inajob.hatenablog.jp

ここに自分用のWebサービスなどをデプロイすれば個人サーバとして活用できるわけですが、いつまでもIPアドレスでアクセスするというのはダサいですね。 今回は無料でドメインを取得しKubernetes上のサービスをその名前でアクセスできるようにしてみます。

f:id:inajob:20180228185422p:plain

ドメインをとるのはちょっと・・・という人はcurlのオプションでヘッダをつけてアクセスすることでその挙動を確認することができます。(が今回の記事では触れません)

TKドメインの取得

トラケウのドメインである.tkは無料で取得できます。

.tk - Wikipedia

もちろんすでにドメインを持っている人はこのような怪しいドメインを取得する必要はありません

https://my.freenom.com

とれるかな、、 f:id:inajob:20180228175551p:plain いけそう! f:id:inajob:20180228175618p:plain kubernetesのmasterのIPアドレスを入れる(あとで変えるので何でもよいのですが、、) f:id:inajob:20180228175858p:plain いい感じに入力する f:id:inajob:20180228175946p:plain 下記からアクセスすると所有しているドメインの一覧が確認できる。 https://my.freenom.com/clientarea.php?action=domains

CloudFlareでワイルドカードDNSの登録

FreenomでもDNSサービスは提供しているのですが、CloudFlareのほうが操作性がよくワイルドカードDNSが利用できるのでこちらを使うことにします。

www.cloudflare.com 右上のAdd Siteからドメインを追加画面に遷移 f:id:inajob:20180228180457p:plain

一番左の無料のやつを選択 f:id:inajob:20180228180524p:plain

いったんそのままContinue f:id:inajob:20180228180615p:plain

nameserverを変えろと言われる。 f:id:inajob:20180228180653p:plain

freenomに行って指示通りにNameserverを変更する f:id:inajob:20180228180847p:plain

Cloudflareにて反映されるのを待つ f:id:inajob:20180228180930p:plain

ページを行ったり来たりしていると数分で反映された f:id:inajob:20180228181223p:plain

いまこのドメインにアクセスすると下記のようになる。 これは名前からサーバまではいけるがそのサーバの80番が開いていないということのようだ。 登録したIPが間違っていたかな? f:id:inajob:20180228181250p:plain

nghttpx-ingress-controllerがデプロイされているホストをを調べる f:id:inajob:20180228181410p:plain

worker01にデプロイされているので、そのIPに設定する(masterのIPを指定していました;) (通常のPodは10.x.xのようなクラスタ内IPが付与されますがnghttpx-ingress-controllerは.spec.hostNetwork=trueとなっているためホストのIPとなっています my-vps-kubernetes/rc-default.yaml at master · inajob/my-vps-kubernetes · GitHubf:id:inajob:20180228181657p:plain

アクセスできた! この"default backend -404" というのはKubernetes上のサービスから返却しているものです。

f:id:inajob:20180228181819p:plain

図にするとこんな感じ f:id:inajob:20180228182434p:plain

$ kubectl get pods -n kube-system
NAME                                         READY     STATUS    RESTARTS   AGE
default-http-backend-55c6c69b88-vlqcx        1/1       Running   0          1h <--- これです
etcd-kubernetes                              1/1       Running   0          1h
kube-apiserver-kubernetes                    1/1       Running   0          1h
kube-controller-manager-kubernetes           1/1       Running   0          1h
kube-dns-6f4fd4bdf-c2995                     3/3       Running   0          1h
kube-proxy-622sq                             1/1       Running   0          1h
kube-proxy-j5754                             1/1       Running   0          1h
kube-scheduler-kubernetes                    1/1       Running   0          1h
monitoring-grafana-8dd9cb57f-4ms82           1/1       Running   0          1h
nghttpx-ingress-controller-78749dc54-8wlxr   1/1       Running   0          29m
node-exporter-5294m                          1/1       Running   0          1h
prometheus-8694d8cdd8-vmw7h                  1/1       Running   0          1h
weave-net-r5jft                              2/2       Running   0          1h
weave-net-wm7sn                              2/2       Running   0          1h

Ingressを試す

ドメインの取得、DNSサーバへの登録が終わり、無事取得したドメインでKubernetesクラスタまで到達できることが確認できました。 次はIngressを試します。

Ingressを利用するとVirtualHostのようにHostヘッダの値で違うServiceにアクセスさせることができます。

nginxをデプロイして、Serviceも作成します。

$ kubectl run nginx --image=nginx
deployment "nginx" created
$ kubectl expose deployment nginx --port=80
service "nginx" exposed

Ingressはコマンドでは作れないので下記のようなテキストファイルを用意します

nginx-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  - host: nginx.inajob-test.tk
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 80

上記をKubernetesにデプロイします。

$ kubectl apply -f nginx-ingress.yaml
ingress "nginx-ingress" created

cloudflareにAレコードを追加します f:id:inajob:20180228183320p:plain

やった!アクセスできました。 f:id:inajob:20180228183400p:plain

新しいサブドメインIngressを用意するたびにcloudflareにAレコードを追加するのが面倒なのでワイルドカードドメインを追加してみます。

丸で囲ったところに注意です。CloudFlareではCloudFlareを経由しキャッシュを返したり、SSL化したりするような機能がありますが、ワイルドカードドメインの場合はそれが使えないので明示的にOFFにしています。

f:id:inajob:20180228183707p:plain

f:id:inajob:20180228183635p:plain

これであとはIngressを用意するだけでサブドメインが増えていくようになります。

まとめ

ここまでできると月$10のクラスタでもそこそこつかえるKubernetesが構築できたのではないかと思います。

ということで、vultrでサーバを作りましょう! (この記事が役立った!という人はぜひこちらのリンクからお願いします。)

www.vultr.com