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
はクラスター内部専用。外部公開にはNodePort
やLoadBalancer
もあるが、今回は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/hosts
に myapp.local
の設定を追加すればブラウザからアクセスも可能です。
📦 まとめ
- ServiceはPodの前に立つ内部のゲート
- Ingressは外部からのHTTPアクセスをServiceに振り分けるルール
- MinikubeやクラウドではIngress Controllerのインストールが必要
これを押さえれば、Kubernetes上のWebアプリを「ユーザーが使える状態」で運用できるようになります!