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 第40章:Kubernetesのアップグレードとバージョン管理 ~安全にバージョンを上げるための基本知識~

Kubernetes Learning 第39章:CRD(Custom Resource Definition)とは?~Kubernetesに“自分専用のリソース”を追加する仕組み~

You Missed

Kubernetes Learning 第40章:Kubernetesのアップグレードとバージョン管理 ~安全にバージョンを上げるための基本知識~

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

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第13章:ストレージとデータベースの基礎 : オブジェクトストレージ: Cloud Storage(バケット、オブジェクト、ストレージクラス)- あなたの「データ置き場」

  • 投稿者 mh
  • 6月 23, 2025
  • 101 views

Kubernetes Learning 第39章:CRD(Custom Resource Definition)とは?~Kubernetesに“自分専用のリソース”を追加する仕組み~

  • 投稿者 mh
  • 6月 21, 2025
  • 102 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第12章:Cloud CDN(Content Delivery Network):あなたのWebサイトを「世界中のユーザーに超高速で届ける宅配便ネットワーク」

  • 投稿者 mh
  • 6月 20, 2025
  • 119 views

Kubernetes Learning 第38章:Operatorとは? ~Kubernetesに「運用の自動化ロボット」を組み込む仕組み~

  • 投稿者 mh
  • 6月 19, 2025
  • 111 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第11章:Cloud Load Balancing:あなたのGCPリソースを「賢く振り分ける交通整理の達人」

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