Ingress

Kubernetes クラスタ外部からの HTTP/HTTPS トラフィックをサービスにルーティングするリソース

Kubernetesネットワーク

Ingress とは

Ingress は、Kubernetes クラスタ外部からの HTTP/HTTPS トラフィックを、ホスト名やパスに基づいて内部の Service にルーティングするリソースである。レイヤー 7 (HTTP) のロードバランシングを提供し、TLS 終端、パスベースルーティング、ホストベースルーティングを実現する。

Service との違い

リソース レイヤー 機能
Service (LoadBalancer) L4 (TCP/UDP) IP + ポートでルーティング
Ingress L7 (HTTP/HTTPS) ホスト名 + パスでルーティング

Service の LoadBalancer タイプはサービスごとに LB を作成するため、サービス数が増えるとコストが膨らむ。Ingress は 1 つの LB で複数サービスにルーティングできる。

基本的な設定

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
spec:
  tls:
    - hosts: [example.com]
      secretName: tls-secret
  rules:
    - host: example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port: { number: 80 }
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-service
                port: { number: 80 }

/api/* は api-service に、それ以外は web-service にルーティングされる。

Ingress Controller

Ingress リソースだけでは何も起きない。Ingress Controller が実際のルーティングを処理する。

Controller 特徴
AWS ALB Ingress Controller ALB を自動作成、EKS で推奨
Nginx Ingress Controller 最も広く使われている
Traefik 自動設定、Let's Encrypt 統合
Istio Gateway サービスメッシュと統合

EKS での ALB Ingress

EKS では AWS Load Balancer Controller を使い、Ingress リソースから ALB を自動作成する。

metadata:
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:...
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
    alb.ingress.kubernetes.io/ssl-redirect: "443"

Gateway API (Ingress の後継)

Kubernetes 1.27 で Gateway API が GA になった。Ingress の後継として、より表現力の高いルーティングを提供する。

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: api-route
spec:
  parentRefs:
    - name: my-gateway
  rules:
    - matches:
        - path: { type: PathPrefix, value: /api }
      backendRefs:
        - name: api-service
          port: 80

Ingress を扱う関連書籍も多い。

関連用語