2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

初心者でも分かる!EKS道場【Day5】EKSのサービス公開!ロードバランサーで世界へ解き放て!

Posted at

🗣️ 【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などありましたよね。

それらの関係性ってどういうことなの?ということを、これから整理して行きます!

よければフォロー&いいねお願いします🙏

続きが気になる方は、フォロー&いいね👍

コメントで「詰まったところ」「もっと知りたいこと」もお待ちしています!

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?