のべラボ.blog

Tech Blog | AWS や サーバーレスやコンテナ などなど

Amazon EKS にて Ingress で SSL を有効化してみる

Amazon EKS クラスターでは、AWS Load Balancer Controller を導入すると Ingress オブジェクトを作成時に、ELB のロードバランサーを作成できます。

今回は、IngressからSSL を有効化したELB ( Application Load Balancer ) を作成する手順をまとめてみます。

これは、2022年 10 月 1 日時点で試した内容です。


前提

Amazon EKS クラスターは構成済で、AWS Load Balancer Controller も導入済です。

このクラスターに接続できる クライアントも用意できています。

また、サーバー証明書を発行するのに必要なドメインの管理者であり、Amazon Route 53 でドメインレコードを設定できる前提です。


目標

次のような構成で、https://ingress.nobelabo.net で Pod にアクセスできるようにすることが目標です。

https://cdn-ak.f.st-hatena.com/images/fotolife/n/neob/20221001/20221001192515.png


AWS Certificate Manager ( ACM ) でサーバー証明書を発行

AWS マネジメントコンソールから、完全修飾ドメイン名を指定してパブリック証明書のリクエストを発行します。

Eメールまたは DNSによる検証を行うと証明書が発行されます。

検証は、ドメインの管理者である証明としてEメールを受信、または 対象のDNSに検証用のレコードを追加します。詳細は、次のドキュメントを参照しましょう。

docs.aws.amazon.com

発行された証明書の ARN をメモしておきます。

https://cdn-ak.f.st-hatena.com/images/fotolife/n/neob/20221001/20221001192554.png


Deployment の作成

ingress からアクセスする Pod 用の Deployment を作成します。

次はあくまで例であり個人的に作ったコンテナイメージを指定してますが、もっとシンプルに nginx などを使っても良いと思います。

ここでは、deployment.yaml に保存した前提とします。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: python-web-ec2-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: python-web-ec2
  template:
    metadata:
      labels:
        app: python-web-ec2
    spec:
      containers:
      - name: python-web-ec2
        image: tnobe/python-web-ec2
        ports:
        - containerPort: 8000

マニフェストが用意出来たら、作成して Pod が起動したことを確認します。

kubectl apply -f  deployment.yaml
kubectl get pods

Ingress と Service の作成

ではいよいよ Ingress と Service を作成します。

次のようなマニフェストを用意します。

ここでは、ingress.yaml に保存した前提とします。

apiVersion: v1
kind: Service
metadata:
  name: my-service-ingress-ssl
spec:
  ports:
    - port: 80
      targetPort: 8000
      protocol: TCP
  type: ClusterIP
  selector:
    app: python-web-ec2
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress-alb-ip-ssl
  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: '[{"HTTPS":443}, {"HTTP":80}]'
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-1:000000000000:certificate/6654fefe-7976-4ce7-8cad-44455fc79291
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-service-ingress-ssl
                port:
                  number: 80

annotationsalb.ingress.kubernetes.io/listen-ports を指定し、HTTPS: 443 も使用するように指定します。

また、alb.ingress.kubernetes.io/certificate-arn で発行した ACM の証明書の ARN を指定します。

マニフェストが用意出来たら、作成して ingress が起動したことを確認します。

kubectl apply -f  ingress.yaml
kubectl get ingress

次は、出力から抜粋した例です。

NAME                    CLASS    HOSTS   ADDRESS                                                                     
my-ingress-alb-ip-ssl   <none>   *       xxxxx.ap-northeast-1.elb.amazonaws.com   

ADDRESS 列に表示されているのが、Application Load Balancer (ALB) のDNS名になります。

この段階で、ブラウザから http://(ALBDNS名) で Pod にアクセスできることを確認しておきます。


DNS に 別名レコードを追加

今回は 個人的に管理している 別の AWS アカウントのRoute 53 のホストゾーンで DNS レコードを管理しているので、 AWS マネジメントコンソールから CNAME レコードを追加します。

レコード名: ingress.nobelabo.net

レコードタイプ: CNAME

値: ALBのDNS

ルーティングポリシー:シンプル

これで、https://ingress.nobelabo.net で Pod にアクセスできるようになりました!

(現在は、https://ingress.nobelabo.net はアクセスできないようにしています。)


最後に

Amazon EKS に AWS Load Balancer Controller を導入したとき IngressSSL でリスニングする時の方法について、これまで日本語で説明されたドキュメントを見つけることができなかったので、このブログを自分用のメモにしておきたいと思います。

/* -----codeの行番号----- */