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とかもあるのでこちらを使った方が良いのかもしれないですね
参考記事
- kubernetes / ingress-nginx
- Qiita 快適な kubernetes オンプレミス環境を構築する(5. nginx-ingress-controllerを使ったIngress環境のセットアップ)