Ingress
概要
Ingress はクラスタ外に対して内部の Service を HTTP(S) エンドポイントとして公開するリソースである. HTTP(S) のトラフィックを受け取りクラスタ内の各 Service へルーティングする L7 のロードバランサと見ることができる. ルーティング
Ingress では以下の L7 ルーティングができる:
パスに基づいたルーティング: /v1/users 以下を users Service に流す
ドメインに基づいたルーティング: v1.example.com/ 以下へのリクエストを v1 Service に流す
上記2つの組み合わせ: v1.example.com/users 以下へのリクエストを users-v1 Service に流す
Ingress Controller
Ingress Controller によっては Ingress リソースでは表現しきれない細かい設定を annotation を使用してリバースプロキシ固有の設定を記述することがある.詳細は各 Ingress Controller のドキュメントを参照されたい.
Ingress Controller 自体はクラスタ管理者が提供するものでありクラスタ上でアプリケーションを実行する人は管理しなくて良いが, 上記 annotation を含め Ingress Controller 毎に固有の事柄は存在するのでどの Ingress Controller が使われているかは把握したほうが良い.
例
以下は,あるドメインへのHTTPS リクエストをバックエンドのサービスにルーティングする Ingress の例である.TLS終端は Ingress で行っており Ingress -> Service の通信は暗号化されていない.
code:yaml
apiVersion: networking.k8s.io/v1beta1 # Kubernetes のバージョンが古いと extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: nginx # ingress controller を指定
spec:
tls:
- hosts:
- v1.example.com
- v2.example.com
secretName: examplecom-tls # v1.exmaple.com と v2.example.com の TLS 証明書を両方含む Secret
rules:
- hosts: v1.example.com
http:
paths:
- path: /books # /books 以下へのリクエストは books-v1 Service に流す
backend:
serviceName: books-v1
servicePort: 80
- path: /users # /users 以下へのリクエストは users Service に流す
serviceName: users
servicePort: 80
- hosts: v2.example.com
http:
paths:
- path: /books # /books 以下へのリクエストは books-v2 Service に流す
backend:
serviceName: books-v2
servicePort: 80
この例では v1.example.com と v2.exampe.com の2つのドメインへのリクエストを受け付ける Ingress を記述している. v1.example.com では更にパス毎に異なる Service にルーティングしている.
注: Ingress とトラフィックが流される Service は同一 Namespace 内に存在しなければならない.
参考