3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「Dockerはわかるけど…」から卒業!AWSでコンテナを動かすための30日集中講座 - Day 18: ServiceとIngress:外部からアプリケーションにアクセスできるようにする

Posted at

Day 18: ServiceとIngress:外部からアプリケーションにアクセスできるようにする 🌐

皆さん、こんにちは!30日集中講座、Day 18へようこそ。

昨日は、Kubernetesの基本的なリソースであるPodReplicaSetDeploymentを学びました。しかし、Podはクラスター内のプライベートIPアドレスを持っており、外部から直接アクセスすることはできません。また、PodのIPアドレスは再起動するたびに変わってしまいます。

今日の講座では、この問題を解決するKubernetesのネットワーク機能であるServiceIngressについて学びます。これらを活用することで、外部のユーザーがアプリケーションにアクセスできるようになります。

今日の学習目標 🎯

  • 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が外部にロードバランサーを公開するのに対し、IngressHTTP/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にデプロイする

それでは、また明日お会いしましょう!

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?