Kubernetes Learning 第15章:ServiceとIngressを使った公開

Kubernetesクラスターの中で動いているアプリケーションを、外部のユーザーがアクセスできるように公開する方法を学びましょう。ここでは、以下の2つの仕組みを使います。

  • Service(サービス):Podへのアクセスを抽象化
  • Ingress(イングレス):HTTP/HTTPSルーティングの入り口

🌐 なぜ必要?

KubernetesではPodが自動的に再起動・再作成されるため、Podに直接アクセスするのは不安定です。また、Podはクラスター内部でしかアクセスできません。そこで、

  • Serviceを使って安定した「名前付きアクセス口」を用意し、
  • Ingressを使って外部からのHTTPリクエストをルールに従ってルーティングします。

🧭 全体イメージ図

[ インターネット ]
       ↓(HTTP)
   [ Ingress Controller ]
       ↓(ルールに従って振り分け)
   [ Service ]
       ↓(Podの前段)
   [ Pod(アプリケーション) ]

🧱 Serviceとは?

Serviceは、Podの前に立つ”窓口”のようなものです。PodはIPが変わる可能性がありますが、Serviceは固定名(DNS名)でアクセスできます。

たとえば次のようなServiceを作ると、springboot-serviceという名前でPodにアクセスできるようになります:

apiVersion: v1
kind: Service
metadata:
  name: springboot-service
spec:
  selector:
    app: springboot
  ports:
    - port: 80
      targetPort: 8080
  type: ClusterIP
  • selector:対象となるPodのラベル
  • port:Serviceが受け取るポート番号
  • targetPort:Podの中でアプリが待ち受けているポート

type: ClusterIPはクラスター内部専用。外部公開には NodePortLoadBalancer もあるが、今回はIngressで制御するため ClusterIP のままでOKです。


🌀 Ingressとは?

Ingressは、**「HTTPリクエストをどのServiceに渡すか」**を定義するルール集です。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: springboot-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: myapp.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: springboot-service
                port:
                  number: 80

ポイント:

  • host: ドメイン名(たとえば myapp.local
  • path: URLパス(/api なども可)
  • backend: 対応するService名とポート

この設定をすると、http://myapp.local/ へのリクエストが springboot-service 経由でPodに届きます。


⚙️ Ingress Controllerが必要

Ingressは「ルール」だけなので、実際の処理は Ingress Controller が行います。よく使われるのは:

  • NGINX Ingress Controller
  • Traefik
  • Cloud Load Balancer (クラウド特化型)

Minikubeを使っている場合は、以下で NGINX Ingress Controller を有効化できます:

minikube addons enable ingress

🔁 ServiceとIngressの役割まとめ

役割対象用途
Service内部Pod間通信・内部ロードバランス
Ingress外部ドメイン+パスベースの外部公開

💡 Tips

  • 複数アプリの公開も可能です(/app1, /app2などで振り分け)
  • HTTPSもIngressで対応可能(Let’s Encrypt連携など)
  • IngressとServiceを連携することで、PodのIP変化に強い構成が作れます

🧪 動作確認の例

kubectl get ingress
curl -H "Host: myapp.local" http://<minikube-ip>/

/etc/hostsmyapp.local の設定を追加すればブラウザからアクセスも可能です。


📦 まとめ

  • ServiceはPodの前に立つ内部のゲート
  • Ingressは外部からのHTTPアクセスをServiceに振り分けるルール
  • MinikubeやクラウドではIngress Controllerのインストールが必要

これを押さえれば、Kubernetes上のWebアプリを「ユーザーが使える状態」で運用できるようになります!

mh

Related Posts

Kubernetes Learning 第14章:Webアプリケーションの例 〜Spring Boot + MySQLをKubernetesに載せてみる〜

Kubernetesの基本を学んできた今、実際に現場でよくあ…

Kubernetes Learning 第13章:kubectl apply / diff / deleteの運用

Kubernetes の設定を管理・反映していく上で、kub…

You Missed

Kubernetes Learning 第15章:ServiceとIngressを使った公開

  • 投稿者 mh
  • 5月 19, 2025
  • 10 views

Android application development 第19章:JSONパース(Gson)

  • 投稿者 mh
  • 5月 19, 2025
  • 10 views

Kubernetes Learning 第14章:Webアプリケーションの例 〜Spring Boot + MySQLをKubernetesに載せてみる〜

  • 投稿者 mh
  • 5月 18, 2025
  • 21 views

Android application development 第18章:Retrofitを使ったAPI通信

  • 投稿者 mh
  • 5月 18, 2025
  • 15 views

Kubernetes Learning 第13章:kubectl apply / diff / deleteの運用

  • 投稿者 mh
  • 5月 17, 2025
  • 29 views

Android application development 第17章:SQLiteとRoomの比較と実装

  • 投稿者 mh
  • 5月 17, 2025
  • 28 views