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 第32章:Helmの基本操作(install, upgrade, rollback)~マニフェスト管理をもっと効率よく、自動化するために~

Kubernetes Learning 第31章:コンテナのセキュリティ対策(PodSecurityなど)~Kubernetes環境を守るために最低限知っておきたいこと~

You Missed

現場で使えるChrome DevTools実践ガイド 第12章:ワークスペース連携とファイルのライブ編集

  • 投稿者 mh
  • 6月 7, 2025
  • 6 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第6章:Cloud Shellの活用:GCPを「どこからでも手軽に操作できる秘密基地」

  • 投稿者 mh
  • 6月 6, 2025
  • 18 views

Kubernetes Learning 第32章:Helmの基本操作(install, upgrade, rollback)~マニフェスト管理をもっと効率よく、自動化するために~

  • 投稿者 mh
  • 6月 5, 2025
  • 24 views

現場で使えるChrome DevTools実践ガイド 第11章:アクセシビリティの確認

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

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第5章:Cloud SDKとgcloudコマンド:GCPを「キーボードから操る」魔法のツール

  • 投稿者 mh
  • 6月 4, 2025
  • 36 views

Kubernetes Learning 第31章:コンテナのセキュリティ対策(PodSecurityなど)~Kubernetes環境を守るために最低限知っておきたいこと~

  • 投稿者 mh
  • 6月 4, 2025
  • 38 views