がじぇ

お金と家電とプログラミングのブログ

k8sのIngress(サービスを外部に公開するための必須コンポーネント)について

こんにちわ

がじぇったー (@hackmylife7) | Twitter


です。


今日はサービスを外部に公開する際に必須のコンポーネントになるIngressについて学んでいきます。



はじめに

サービスをexpose(外部からのトラフィックを受ける)方法はいくつかあるが、Ingressはより高度な機能を提供する

ちなみに外部からのトラフィックを受け付けるコンポーネントは以下の通り

  • NodePort Service
  • LoadBalancer Service
  • Ingress Controller

Ingressとは

外部からサービスを受け付けるために用いられるコンポーネントであり、
アクセス先のURLに応じてどのサービスにトラフィック送るのかルーティングを行うことができる

また、ロードバランシングやSSL通信の機能も備わっている。

イメージはロードバランサ。

構成は外部からのトラフィックIngressがうけ、
そのロードバランス先にNodePortやLoadBalancer等外部とやりとりできるサービスリソースが必要

トラフィックのイメージ

    internet
        |
   [ Ingress ]
   --|-----|--
   [ Services ]

Ingressを構成する要素

Ingressは二つの要素で構成されている。どちらの構成要素もクラスタ内でPodとして立ち上がる。

resource

トラフィックを受けつけ、クラスタ内のどのコンポーネントに流すか、というルールのかたまり

Controller

Resourceに定義されたルールに基づいてトラフィックを流すのがControllerの役割。(Ingressのエンジン部分)
実態はReverse Proxy(リバースプロキシ)
中身はnginxベースのイメージであり、Ingress Controller向けにカスタマイズされ、クラスタ上ではPodで動いている

yamlファイルの例

下記の例だとfoo.bar.comへのトラフィックを受けたらパスが/fooだったらport4200へ、パスが/barだったらport8080に送るよう定義されている.
rules配下がResouce(ルール)のイメージ。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: simple-fanout-example
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: service1
          servicePort: 4200
      - path: /bar
        backend:
          serviceName: service2
          servicePort: 8080

Default Backend

URLやhostが定義されていない宛先に対してデフォルトでどこにトラフィックを送るのか、定義することができる機能

基本的に、デフォルトのバックエンドは2つのURLを公開する。


/healthz that returns 200(死活監視)
/ that returns 404




参考(Kubernetesの最強参考書)

Kubernetes完全ガイド (impress top gear)

Kubernetes完全ガイド (impress top gear)

Kubernetesの他の記事へは下記の一覧から飛べるようにしているので参照ください。

gadgeterkun.hatenablog.com