🗣️ 【Day5】EKSのサービス公開!ロードバランサーで世界へ解き放て!
EKS道場もついに中盤戦。Day4では、ついにPodをデプロイし「魂を宿す」工程まで到達しました。
ですが今の状態では、その魂を外の世界に見せることはできません。
今回は、KubernetesのIngressリソースと、AWSのALB Ingress Controller(AWS Load Balancer Controller)を組み合わせ、EKS上に立てたアプリケーションをインターネットへ公開する修行に挑みます!
🚪 そもそも「Ingress」って何者?
Kubernetesにおける「Ingress」は、外部からのアクセスを内部のServiceへつなぐ道を作るリソースです。
NodePort や LoadBalancer といったServiceタイプでも公開は可能
しかし複数サービスが増えると管理が煩雑に
Ingressを使えば、1つのALBで複数サービスをホスト名やパスで振り分け可能
User ⇨ ALB ⇨ Ingress ⇨ Service ⇨ Pod
🧰 ALB Ingress Controller の導入手順
① IAMポリシーを作成
まず、ALB ControllerがAWSリソースにアクセスできるようにするIAMポリシーを作成します。
curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.6.1/docs/install/iam_policy.json
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam-policy.json
② IAM ServiceAccount を作成(IRSA)
次に、IAMとKubernetesのServiceAccountを連携させます。
eksctl create iamserviceaccount \
--cluster eks-dojo \
--namespace kube-system \
--name aws-load-balancer-controller \
--attach-policy-arn arn:aws:iam::<AWSアカウントID>:policy/AWSLoadBalancerControllerIAMPolicy \
--approve
※ <AWSアカウントID> はご自身のものに置き換えてください。
③ ALB Controller をHelmでインストール
Helmを使ってALB Ingress Controllerをインストールします。
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=eks-dojo \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region=ap-northeast-1 \
--set vpcId=<VPC-ID> \
--set image.tag="v2.6.1"
※ vpcId は aws ec2 describe-vpcs で取得できます。
🗺️ Ingressリソースで道を開け!Grafana公開編
では、Day4でデプロイしたGrafanaを公開してみましょう。
① GrafanaのServiceをClusterIPに変更(※未設定なら)
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: default
spec:
type: ClusterIP # ここを修正!
selector:
app: grafana
ports:
- port: 3000
targetPort: 3000
② Ingressマニフェストの作成
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
alb.ingress.kubernetes.io/backend-protocol: HTTP
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: grafana-service
port:
number: 3000
YAMLを grafana-ingress.yaml として保存し、適用します。
kubectl apply -f grafana-ingress.yaml
③ ALBのDNSを確認!
kubectl get ingress grafana-ingress
出力に表示される ADDRESS がALBのDNS名です。
ブラウザでアクセスすれば、EKS上のGrafanaが世界に公開された姿を確認できます!
💥 トラブル道場:よくあるつまづきと回避法
ALBが作られない!
IAMロールまたはIRSAの設定ミスを確認
TargetGroupにターゲットが登録されない
alb.ingress.kubernetes.io/target-type: ip を忘れてないか?
アクセスできない
SecurityGroupが閉じている可能性(ALBに設定されたSGを確認)
🧠 補足修行:ALBとNLBの違い
| 特性 | ALB | NLB |
|---|---|---|
| レイヤー | L7(アプリケーション) | L4(ネットワーク) |
| Pathルーティング | ✅ | ❌ |
| TLS終端 | ✅ | ❌ |
| Kubernetes連携 | Ingressで利用 | LoadBalancer型Service向け |
IngressにはALBが最適。複数サービスの公開やパス制御も可能です。
🏁 まとめ:EKSの真の力を感じた瞬間
KubernetesのIngressと、AWSのALBが連携してサービスを自動公開!
マニフェストを適用するだけで、ALBが自動作成・ルーティングも設定済み
まさに「クラウド × Kubernetes」の真骨頂!
次回予告 📢:【Day6】PodとDeploymentの関係を解き明かす!
次回はちょっと寄り道。
今まで作ってきたリソース、PodやDeployment、ServiceやIngressなどありましたよね。
それらの関係性ってどういうことなの?ということを、これから整理して行きます!
よければフォロー&いいねお願いします🙏
続きが気になる方は、フォロー&いいね👍
コメントで「詰まったところ」「もっと知りたいこと」もお待ちしています!