hidemium's blog

日々学んだことをアウトプットする。

MetalLBとingress-nginxを使ったIngressコントローラーのインストール

前回の記事では、MetalLBを使ったロードバランサーのインストールしてみました。今回は、ingress-nginxを使ったIngressコントローラーのインストールを試してみました。

hidemium.hatenablog.com

構成

ingress-nginxのインストール

ingress-nginxは、NGINXをreverse proxyとロードバランサ―として利用するKubernetes用のIngressコントローラーになります。MetalLBと組み合わせることで、NGINX Ingress ControllerにExternal-IPを割り当てて、サービスをIngress経由で公開することができます。

以下のコマンドを実行し、ingress-nginxをインストールします。

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

ingress-nginx-controllerにEXTERNAL-IPが割り当てられたことを確認します。

$ kubectl get service ingress-nginx-controller --namespace=ingress-nginx
NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller   LoadBalancer   10.233.28.229   10.0.50.201   80:30885/TCP,443:30481/TCP   4s

ingress-nginxの動作確認

nginxサーバーをデプロイし、 nginx.kube.home.lab というホスト名でIngressを作成し、ホスト名でアクセスできることを確認します。

$ kubectl create deployment nginx --image=nginx --port=80
$ kubectl expose deployment nginx
$ kubectl create ingress nginx --class=nginx --rule nginx.kube.home.lab/=nginx:80

Ingressを作成すると、以下のエラーメッセージがでました。

error: failed to create ingress: Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": context deadline exceeded

ワークアラウンドとしてはingress-nginxのissueにあるようにWebhook構成を以下のように削除することで対処しました。

Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io" · Issue #5401 · kubernetes/ingress-nginx · GitHub

$ kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission

ingress-nginx-controllerがLoadBalancerで公開され、EXTERNAL-IPにMetalLBで設定したIPアドレスが付与されていることが分かります。ingressを確認すると、ホスト名とMetalLBで設定したIPアドレスが付与されていることが分かります。

$ kubectl get svc --namespace=ingress-nginx ingress-nginx-controller
NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller   LoadBalancer   10.233.28.229   10.0.50.201   80:30885/TCP,443:30481/TCP   9h

$ kubectl get pod,svc,ingress
NAME                        READY   STATUS    RESTARTS   AGE
pod/nginx-ff6774dc6-zfhk8   1/1     Running   0          9h

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.233.0.1      <none>        443/TCP   13d
service/nginx        ClusterIP   10.233.51.128   <none>        80/TCP    9h

NAME                              CLASS   HOSTS            ADDRESS       PORTS   AGE
ingress.networking.k8s.io/nginx   nginx   nginx.kube.home.lab   10.0.50.201   80      9h

nginxサーバーに対してホスト名でアクセスできるか確認します。

$ INGRESS_EXTERNAL_IP=`kubectl get svc --namespace=ingress-nginx ingress-nginx-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}'`
$ echo $INGRESS_EXTERNAL_IP
10.0.50.201
$ curl $INGRESS_EXTERNAL_IP -H "Host: nginx.kube.home.lab"
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

上記の方法で通常は利用しないので、利用端末で/etc/hostsに以下のように追記をすれば利用はできますが、都度hostsファイルを編集するのは大変なため、external-dnsやCoreDNSを利用すると外部DNSと連携することが可能となるようです。

$ vi /etc/hosts
$INGRESS_EXTERNAL_IP  nginx.kube.home.lab

リソースの削除

動作確認ができたので、リソースを削除しておきます。

$ kubectl delete deployment nginx
$ kubectl delete svc nginx
$ kubectl delete ingress nginx

参考