Day 18: ServiceとIngress:外部からアプリケーションにアクセスできるようにする 🌐
皆さん、こんにちは!30日集中講座、Day 18へようこそ。
昨日は、Kubernetesの基本的なリソースであるPod、ReplicaSet、Deploymentを学びました。しかし、Podはクラスター内のプライベートIPアドレスを持っており、外部から直接アクセスすることはできません。また、PodのIPアドレスは再起動するたびに変わってしまいます。
今日の講座では、この問題を解決するKubernetesのネットワーク機能であるServiceとIngressについて学びます。これらを活用することで、外部のユーザーがアプリケーションにアクセスできるようになります。
今日の学習目標 🎯
- ServiceでPodへの安定したアクセスを実現する。
- LoadBalancerでの外部公開を体験する。
- IngressとServiceの違いを理解する。
1. 内部からアクセスするためのService 🤝
Serviceは、複数のPodにまたがる安定したネットワークアクセスを提供します。PodのIPアドレスが変動しても、ServiceはPodを追跡し、一定のIPアドレスとDNS名でアクセスできるようにします。
KubernetesのServiceには、主に3種類があります。
- ClusterIP: デフォルトのタイプで、クラスター内部からのみアクセス可能なプライベートIPを割り当てます。Pod同士が通信する際に使います。
- NodePort: 各ノードの固定ポートを使い、Podへのアクセスを可能にします。
- LoadBalancer: クラウドプロバイダーのロードバランサーを自動でプロビジョニングし、外部からのトラフィックをPodに分散します。
今回は、実際に外部公開できるLoadBalancerを体験してみましょう。
事前確認:Deploymentの状態チェック
実習を開始する前に、昨日作成したDeploymentが稼働しているか確認しましょう。
# 昨日作成したDeploymentが稼働しているか確認
kubectl get deployments
kubectl get pods -l app=nginx
# Deploymentがない場合は再作成
cat > deployment.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:1.21-alpine
ports:
- containerPort: 80
EOF
kubectl apply -f deployment.yaml
Serviceの作成と動作確認
service.yamlを同じ作業ディレクトリに保存します。
# service.yamlファイルを作成
cat > service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: my-nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
EOF
# Serviceを作成
kubectl apply -f service.yaml
Service YAMLの構造解説
apiVersion: v1 # Service APIのバージョン
kind: Service # リソースの種類
metadata:
name: my-nginx-service # Service名(DNS名としても使用)
spec:
selector: # 対象Podの選択条件
app: nginx # app=nginxラベルを持つPodを選択
ports:
- protocol: TCP # プロトコル(通常はTCP)
port: 80 # Service側のポート(外部からアクセスするポート)
targetPort: 80 # Pod側のポート(コンテナが待機しているポート)
type: LoadBalancer # AWS ALB/NLBを自動作成
外部アクセスの確認
kubectl get servicesコマンドを実行し、EXTERNAL-IPが割り当てられるまで待ちます。
# External-IPが割り当てられるまで待機
kubectl get services my-nginx-service -w
# IPアドレスが表示されたら(Ctrl+Cで監視終了)
EXTERNAL_IP=$(kubectl get service my-nginx-service -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "アクセス先: http://$EXTERNAL_IP"
# curlでもテスト可能
curl http://$EXTERNAL_IP
ブラウザでhttp://[EXTERNAL-IP]にアクセスし、Nginxのデフォルトページが表示されることを確認してください。
ServiceとPodの関係性実習
ServiceがどのようにPodを追跡するか体験してみましょう。
# Serviceのエンドポイント確認
kubectl get endpoints my-nginx-service
# Podを1つ削除してServiceの追跡機能を確認
kubectl get pods -l app=nginx -o wide # 現在のPod IPを確認
kubectl delete pod [表示されたPod名の1つ]
# 新しいPodが作成され、Serviceが自動で新しいPodを追跡することを確認
sleep 10
kubectl get endpoints my-nginx-service
kubectl get pods -l app=nginx -o wide
ClusterIP Serviceの動作確認
内部通信の理解を深めるために、ClusterIP Serviceの動作も確認してみましょう。
# ClusterIP Service作成
cat > clusterip-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: nginx-clusterip
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: ClusterIP # デフォルト値(省略可能)
EOF
kubectl apply -f clusterip-service.yaml
# 内部からのアクセステスト用のPodを起動
kubectl run test-pod --image=curlimages/curl -it --rm -- sh
# test-pod内で実行(Serviceの内部DNS名でアクセス)
curl http://nginx-clusterip
# 終了するにはexitと入力
2. 外部からアクセスするためのIngress 🚪
Serviceが外部にロードバランサーを公開するのに対し、IngressはHTTP/HTTPSトラフィックをより柔軟にルーティングするためのリソースです。Ingressは単独でPodに繋がるわけではなく、必ずServiceを経由してトラフィックを振り分けます。
⚠️ Ingress使用前の重要な準備
IngressをEKSで使用するには、AWS Load Balancer Controllerのインストールが必要です。これは高度な設定のため、今回はServiceの動作確認に集中し、Ingressの詳細は後日の応用編で扱います。
3. まとめと次回の予告
| 機能 | Service (ClusterIP) | Service (LoadBalancer) | Ingress |
|---|---|---|---|
| アクセス範囲 | クラスター内のみ | 外部からも可能 | 外部からも可能 |
| 作成されるAWSリソース | なし | ALB/NLB | ALB(Controllerが必要) |
| 料金 | 無料 | ALB/NLB料金 | ALB料金 |
| 適用例 | Pod間通信、内部API | シンプルな外部公開 | 複数Service、SSL、パスルーティング |
💰 費用を抑えるコツ
LoadBalancerタイプのServiceは、AWSのALBまたはNLBを作成するため、作成直後から時間単位の課金が発生します。学習中でない時間はLoadBalancer Serviceを削除し、必要に応じてClusterIP Serviceに変更することで費用を抑えられます。
# LoadBalancer Serviceを削除
kubectl delete service my-nginx-service
🔒 セキュリティに関する注意
作成されたLoadBalancerは、インターネット全体からアクセス可能です。本番環境では、セキュリティグループやNACLで適切にアクセス制限を行ってください。
明日の準備
今日学んだServiceを使って、明日は実際にローカルで作成したアプリケーションをEKSにデプロイします。
次回の予告
Day 19: 実践!ローカルアプリをEKSにデプロイする
それでは、また明日お会いしましょう!