前回の記事では、MetalLBを使ったロードバランサーのインストールしてみました。今回は、ingress-nginxを使ったIngressコントローラーのインストールを試してみました。
構成
- vCenter 7.0 U3
- ESXi 7.0 Update 3
- Ubuntu 22.04 (テンプレートVM)
- open-vm-tools 11.3.5
- cloud-init 22.2
- Kubespray
- kubernetes v1.25.5
- MetalLB v0.12.1
- ingress-nginx v1.5.1
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構成を以下のように削除することで対処しました。
$ 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