AWSでKubernetes環境を構築する際のIngressについて
Ingressはアプリケーションレイヤのロードバランサに当たるリソースでSSL化などが可能になります。
Ingressの実装は様々なIngress Controllerに依存します。
例えば、Nginxを利用したNginx Ingress ControllerやGKEに含まれているGKE Ingress Controllerなどがあります。
AWSでKubernetesを構築する際には、EKSにおいてもIngress Controllerは存在しないため、構築者自身がIngress Controllerを設定する必要があります。
今回は、AWSで利用可能な以下のIngress Controllerを紹介します。
AWS ALB Ingress Controller
IngressリソースによってALBが作成されるIngress Controllerです。
メリット
- 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です。
メリット
- 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の欠点を補うことができるようになります。