なになれ

IT系のことを記録していきます。

AWSでKubernetes環境を構築する際のIngressについて

Ingressはアプリケーションレイヤのロードバランサに当たるリソースでSSL化などが可能になります。
Ingressの実装は様々なIngress Controllerに依存します。
例えば、Nginxを利用したNginx Ingress ControllerやGKEに含まれているGKE Ingress Controllerなどがあります。
AWSKubernetesを構築する際には、EKSにおいてもIngress Controllerは存在しないため、構築者自身がIngress Controllerを設定する必要があります。

今回は、AWSで利用可能な以下のIngress Controllerを紹介します。

AWS ALB Ingress Controller

IngressリソースによってALBが作成されるIngress Controllerです。

kubernetes-sigs.github.io

メリット

  • ALBによる高機能なロードバランサ機能を扱うことができる

デメリット

  • Ingressリソース毎にALBリソースが作成される

ALB Ingress ControllerはALBの機能を利用することができるので、可能な限り利用するのが良いと思います。
但し、Ingressリソース毎にALBが作成されてしまいます。
複数のサービスがある場合に、1つのサービスに1つのIngressリソースを作る構成だとリソース過多になってしまいます。
ALBの設定を変えて、1つのURLで複数のサービスを公開する方法も取れますが、場合によってはサービスの内部的なURLと公開されるURLが異なることで404エラーになる可能性があります。

NGINX Ingress Controller

IngressリソースによってNginxが作成されるIngress Controllerです。

kubernetes.github.io

メリット

  • URLのrewrite機能によって複数のサービスに向き先を設定できる

デメリット

  • SSL化にはSecretリソースを用意するといった準備が多い
  • ALBが使用できない

NGINX Ingress ControllerにはURLのrewrite機能によって複数のサービスに向き先を設定することができます。
但し、ALBを利用することができないのが気になります。

オススメ構成

AWS ALB Ingress Controller → NGINX Ingress Controller

Ingress Controllerのデメリットを補える構成です。
AWS ALB Ingress ControllerでALBを利用するのと、複数のサービスを1つのALBで参照するためにNGINX Ingress Controllerを利用し、nginxのrewrite機能を利用します。

設定のポイントは以下の通りです。

  • NGINX Ingress Controllerをインストールする際にNodePortを利用する
  • ALB Ingress ControllerのIngressの向き先をNGINX Ingress ControllerのNodePortに向ける

設定例

NGINX Ingress ControllerをNodePortでインストール

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

ALB Ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-alb
  namespace: ingress-nginx
  annotations:
    kubernetes.io/ingress.class: alb
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: ingress-nginx
              servicePort: 80

NGINX Ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-http-svc
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /http-svc
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-http-svc2
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: http-svc2
          servicePort: 80
        path: /http-svc2

まとめ

NGINX Ingress Controllerを活用することで、AWS ALB Ingress Controllerの欠点を補うことができるようになります。

参考