概要
Ingressとは、Serviceの一つ上にロードバランサとして設置するものである。
L7の情報を使ってLoadBalancingができる。
VirtualHostの設定をすることができる。また、SSLの設定もできる。
Ingressを利用しなくても、Serviceの機能でアプリケーションを公開することはできるが、SSLの設定や、その他メリットも多いので、基本的には利用したほうがよいと思う。
参考: Kubernetes NodePort と LoadBalancer と Ingress のどれを使うべきか
目次
事前準備
minikubeを利用している場合は、以下のコマンドでingressを有効にする。
$ sudo minikube addons enable ingress
✅ ingress was successfully enabled
nginx-ingress-controller
namespace: kube-system
に、nginx-ingress-controller-xxxx
というPodが起動している。
これは、minikubeを起動しIngressのaddonを有効にしていれば、Ingressを作成せずとも起動している。
このnginxのPodがIngressのロードバランサの役割をする。
$ sudo kubectl get pods -n kube-system | grep ingress
kube-system nginx-ingress-controller-xxxxxxxxxxxxxxxx 1/1 Running 0 24h
Kubernetes NodePort と LoadBalancer と Ingress のどれを使うべきか
Ingressコントローラーの種類は、GCLB、Nginx、Contour、istioなどあがります
らしい。
ハンズオン
nginxを使ったwebアプリでページを表示してみる。
以下の2つのページが表示されるようにする。
Deployment
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: sample-http-app
spec:
replicas: 2
template:
metadata:
labels:
app: sample-http-app
spec:
containers:
- name: nginx-container
image: nginx:alpine
ports:
- name: http-port
containerPort: 80
volumeMounts:
- name: documentroot
mountPath: /usr/share/nginx/html/
volumes:
- name: documentroot
hostPath:
path: /home/username/containers/web/html
Service
---
apiVersion: v1
kind: Service
metadata:
name: http-service
labels:
app: sample-http-app
spec:
type: NodePort
ports:
- port: 80
targetPort: http-port
selector:
app: sample-http-app
Ingress
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: sample-ingress
spec:
rules:
# VirtualHostのホスト名
- host: example.com
http:
paths:
# {DocumentRoot}/app1がトップディレクトリになる
- path: /app1
backend:
# bindするService名
# service.yamlのmetadata.nameと合わせる
serviceName: http-service
# Serviceが公開しているPort
servicePort: 80
# 複数設定可能
- host: example.com
http:
paths:
# {DocumentRoot}/app2がトップディレクトリになる
- path: /app2
backend:
# service.yamlのmetadata.nameと合わせる
serviceName: http-service
# Serviceが公開しているPort
servicePort: 80
WEB用テストファイルを作成
ブラウザで表示するテストページ用のファイルを作成する。
/home/username/containers/web/htmlをDocumentRootとしてマウントするので、その下にファイルを置く。
/app1, /app2の2つのディレクトリを作成する。
$ mkdir /home/username/containers/web/html/{app1,app2}
This is a app 1.
This is a app 2.
作成
$ sudo kubectl apply -f deployment.yaml -f service.yaml -f ingress.yaml
deployment.extensions/sample-http-app created
service/http-service created
ingress.extensions/sample-ingress created
確認
ingressが作成されていることを確認。
$ sudo kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
sample-ingress example.com 80 20s
ブラウザでページが表示されることを確認。
-
http://example.com/app1/
This is a app 1.
-
http://example.com/app2/
This is a app 2.
Ingressのログを確認する方法
Ingressのログを確認する場合は、nginx-ingress-controllerのPodを確認すればよい。
$ sudo kubectl logs nginx-ingress-controller-xxxxxxxxxxxxxxxx -n kube-system
-------------------------------------------------------------------------------
NGINX Ingress controller
Release: 0.23.0
Build: git-be1329b22
Repository: https://github.com/kubernetes/ingress-nginx
-------------------------------------------------------------------------------
# **omitted**