LoginSignup
34
25

More than 3 years have passed since last update.

Kubernetes - Ingressを使ってサービスを公開する

Posted at

概要

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

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

service.yaml
---
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

ingress.yaml
---
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}
/home/username/containers/web/html/app1/index.html
This is a app 1.
/home/username/containers/web/html/app2/index.html
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

ブラウザでページが表示されることを確認。

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**

参考

34
25
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
25