AWS EKS setup SSL Service
Introduction
This post is about exposing a web application to a public domain from a AWS EKS cluster.
Prerequisite
- AWS EKS cluster is setup
- A web application is running in the cluster with at lease two replicas
kubectl get pods
- A domain name
- Helm setup
SSL Certificate
It is easier to just get the certificate from AWS since everything else is running here anyways. Request a public certificate from AWS ACN for your domain. Remember to note down the arn from the aws console once the certificate is created and DNS validation is done.
LoadBalancer
Example taken from https://aws.amazon.com/premiumsupport/knowledge-center/terminate-https-traffic-eks-acm
apiVersion: v1
kind: Service
metadata:
name: lbsvc_name
annotations:
# Note that the backend talks over HTTP.
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
# TODO: Fill in with the ARN of your certificate.
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: certificate-arn
# Only run SSL on the port named "https" below.
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
spec:
selector:
app: application_name_from_pod_deployment_definition
ports:
- name: http
port: 80
targetPort: 8080
- name: https
port: 443
targetPort: 8080
type: LoadBalancer
Once you deploy this new configuration via helm upgrade you should see the lbsvc_name name in kubectl get svc output.
Setup Domain DNS
Note down the External-IP from kubectl get svc output for lbsvc_name. Create a CNAME record for your domain’s DNS that points to this aws address. With this setup both http and https sites will work. To restrict http delete the port 80 listener from load balancer.
