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 にアクセスできるようにすることが目標です。
AWS Certificate Manager ( ACM ) でサーバー証明書を発行
AWS マネジメントコンソールから、完全修飾ドメイン名を指定してパブリック証明書のリクエストを発行します。
Eメールまたは DNSによる検証を行うと証明書が発行されます。
検証は、ドメインの管理者である証明としてEメールを受信、または 対象のDNSに検証用のレコードを追加します。詳細は、次のドキュメントを参照しましょう。
発行された証明書の ARN をメモしておきます。
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
annotations で alb.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://(ALBのDNS名) で 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 を導入したとき Ingress で SSL でリスニングする時の方法について、これまで日本語で説明されたドキュメントを見つけることができなかったので、このブログを自分用のメモにしておきたいと思います。