# 참고로 로드 밸런서 타입에 따라 각각 가능한 프로토콜이 정해져 있다.
# Application Load Balancer(ALB) - HTTP, HTTPS
# CLASSIC(Elastic) LOAD BALANCER (CLB/ELB) - HTTP, HTTPS
# Network Load Balancer(NLB) - TCP, TLS, UDP
# ALB + ALB ingress controller 를 사용한 경우
# ingress annotation 으로 인증서 AWS Certificate Manager(ACM)에 등록된
# 인증서를 arn 으로 사용할 수 있다.
kubectl edit ingress my-test-ingress -n my-test
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-2:11111:certificate/11111
# NLB + ingress-nginx controller 를 사용하는 경우
# ingress tls -> secretName 때문에 인증서를 k8s secret 리소스로 등록해야 된다.
# 발급된 인증서를 사용하는 경우
# aws private CA(인증서) 를 사용하는 경우 ACM 콘솔이나 다음 명령으로 내보낼 수 있다.
# 참고로 public CA 는 내보내기가 안된다.
aws acm export-certificate \
--certificate-arn arn:aws:acm:ap-northeast-2:11111:certificate/11111 \
--passphrase fileb://path-to-passphrase-file \
| jq -r '"\(.Certificate)\(.CertificateChain)\(.PrivateKey)"'
# 테스트로 사용하는 경우
# self-signed certificate 인증서 생성해 사용
# cert 파일 생성
rm -rf tls.crt tls.key
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=*.dev.ysoftman-aws.io/O=*.dev.ysoftman-aws.io"
# 이제 secret 리소스 생성하자
kubectl create secret tls dev-ysoftman-aws --key tls.key --cert tls.crt -n my-test
# ingress -> tls -> secretName 명시
kubectl edit ingress my-test-ingress -n my-test
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
... 생략 ...
spec:
tls:
- hosts:
- my-test-api.dev.ysoftman-aws.io
secretName: dev-ysoftman-aws
... 생략 ...
# ELB + ingress-nginx controller 를 설치하면 alb 처럼 annotation 으로 public CA 를 사용할 수 있다.
# 참고 https://kubernetes.github.io/ingress-nginx/deploy/#aws -> deploy-tls-termination.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.46.0/deploy/static/provider/aws/deploy-tls-termination.yaml
# 다운로드된 파일에서 XXX 부분을 변경 한다.
proxy-real-ip-cidr: XXX.XXX.XXX/XX -> VPC CIDR 명시
# ingress-nginx-controller service 에서 public CA arn 을 사용할 수 있다.
arn:aws:acm:us-west-2:XXXXXXXX:certificate/XXXXXX-XXXXXXX-XXXXXXX-XXXXXXXX -> 발급받은 인증서 명시
# 적용
kubectl apply -f deploy-tls-termination.yaml
# external-ip 가 새로 만들어지기 때문에 route53 에서 기존 레코드 바인딩을 수정하자.
kubectl get svc --namespace ingress-nginx
# 이제 NLB 처럼 ingress tls,secret 설정 없이, https 를 사용할 수 있다.