k8sでingress-nginxを設定する

はじめに

オンプレk8sでingress-nginxを設定する記事があんまり見つからないので苦労したのでメモ

環境

Master Clusterともに同じ環境です
説明の都合上
Masterは192.168.1.10
Workerは192.168.1.11
で説明します

 1$ cat /etc/lsb-release
 2DISTRIB_ID=Ubuntu
 3DISTRIB_RELEASE=16.04
 4DISTRIB_CODENAME=xenial
 5DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"
 6$ kubeadm version
 7kubeadm version: &version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.3", GitCommit:"d2835416544f298c919e2ead3be3d0864b52323b", GitTreeState:"clean", BuildDate:"2018-02-07T11:55:20Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
 8kubectl version
 9Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.3", GitCommit:"d2835416544f298c919e2ead3be3d0864b52323b", GitTreeState:"clean", BuildDate:"2018-02-07T12:22:21Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
10Server Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.3", GitCommit:"d2835416544f298c919e2ead3be3d0864b52323b", GitTreeState:"clean", BuildDate:"2018-02-07T11:55:20Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}

インストール

基本的にymlをドキュメント通り入れるだけです

 1$ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/namespace.yaml \ 
 2    | kubectl apply -f  - 
 3$ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/default-backend.yaml \
 4    | kubectl apply -f -
 5$ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/configmap.yaml \
 6    | kubectl apply -f -
 7$ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/tcp-services-configmap.yaml \
 8    | kubectl apply -f -
 9$ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/udp-services-configmap.yaml \
10    | kubectl apply -f -

1.9だとRBACが有効になっているのでRBACの設定も投入します

1$ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/rbac.yaml \
2    | kubectl apply -f -
3$ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml \
4    | kubectl apply -f -

デフォルトのままだと外部からアクセスすることができないため外部からアクセスする手段を提供する必要があります
現在ここから先のベストな解がわかっていなくてちょっと困っていますが外部からアクセスできるところまではいけたのでメモしておきます

1$ kubectl edit deployment nginx-ingress-controller -n ingress-nginx
2~省略~
3      dnsPolicy: ClusterFirst
4+      hostNetwork: true
5      restartPolicy: Always

これでClusterの全てにそれぞれNginxがホストネットワークモードで配備されるので192.168.1.0/24下から

1$ curl 192.168.1.11 -H "Host: Ingressで設定したホスト名"

とすることで閲覧できるようになっているはずです

気になること

hostNetwork: trueとするのが正しいのかちょっと気になる

素直にやるならNodePortで80と443を公開すれば良いはず…(これとか
ですが入れても外部から見せるためにはExternalIPを明示的に指定する必要があってこれじゃない感があります
hosPortで80と443だけ公開するのが綺麗な手段に見えるんですが理解不足もあって上手くいってないです

type: LoadBalancerを使えばExternal IPが自動で付与されるらしいですがクラウドサービス側から提供されるものらしいのでオンプレ環境で使うのは大変そうです
zlabjp/nghttpx-ingress-lbとかもあるのでこちらを使った方が良いのかもしれないですね

参考記事

関係してそうなページ