自宅k8sにIngressをインストールする

はじめに

今回は、自宅 k8sIngress 環境を用意していきます。

前回、MetalLB のインストールを行ったため、サービスの外部公開自体はできていますが、HTTPなどのサービスをデプロイするたびにIPアドレスが変わるのは手間がかかりそうなので、Ingress でそのあたりを単一のエンドポイントに固定して行きたいと思います。

Ingress とは

Ingressクラスター外からのHTTP/HTTPSの通信をServiceのLoadBalancerで受け付け、通信を制御します。

Ingress を使うには Ingress コントローラのデプロイが別途必要なため、今回はその実装であるingress-nginxを使って実現していきます。

手順

流れとしては ingress-nginx の Install Guideをもとに進めていきます。

まずは kubectl applyでインストールするため、以下のコマンドで ingress-nginx をデプロイします。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml

実行後、下記コマンドで igress-nginx 関連の Pod が正常に動作完了しているか確認します。 もし正常に完了すれば、下記のような結果になるはずです。

$ kubectl wait --namespace ingress-nginx \
     --for=condition=ready pod \
     --selector=app.kubernetes.io/component=controller \
     --timeout=120s
pod/ingress-nginx-controller-54d587fbc6-lk6zm condition met

テストのため、デモ用の Pod と Ingress を用意します。

今回、自宅 k8s には MetalLB を入れて、Service の LoadBalancer をサポートしているため、「Online testing」の手順で動作確認します。

$ kubectl create deployment demo --image=httpd --port=80
$ kubectl expose deployment demo
$ kubectl create ingress demo-localhost --class=nginx \
  --rule="demo.example.com/*=demo:80"

--ruleオプションでホストを指定する場合、DNS形式での指定が条件となるので、demo.example.comを指定しました。

IPアドレスは、下記コマンドで出力されるEXTERNAL-IPの項目で表示されているIPアドレスです。

$ kubectl get service ingress-nginx-controller --namespace=ingress-nginx

demo.example.comは適当に指定した名前なので、こちらのDNSを先ほどのIPアドレスで解決できるように、適宜 /etc/hosts を編集するなりで名前解決できるようにします。

この状態でブラウザからhttp://demo.example.com/にアクセスすると「It Works!」と表示されれば正常に Ingress のセットアップは完了です。

まとめ

参考資料