전송 계층 보안(TLS) 인증서를 사용하여 Amazon Elastic Kubernetes Service(Amazon EKS) 애플리케이션의 HTTPS 연결을 활성화하고 싶습니다.
간략한 설명
Amazon EKS 애플리케이션에 대해 HTTPS 연결을 활성화하려면 다음을 수행해야 합니다.
-
사용자 지정 도메인에 대한 유효한 TLS 인증서를 받습니다.
-
로드 밸런서 서비스 유형을 사용하여 Kubernetes 서비스를 노출하거나 AWS 로드 밸런서 컨트롤러를 사용해 Kubernetes 수신 개체를 노출합니다(GitHub을 통해).
-
사용자 지정 도메인을 로드 밸런서 DNS에 연결합니다.
해결 방법
사용자 지정 도메인에 대한 유효한 TLS 인증서를 받습니다.
-
사용자 지정 도메인에 대한 공개 AWS Certificate Manager(ACM) 인증서를 요청하거나 자체 TLS 인증서를 ACM에 업로드합니다.
-
로드 밸런서의 HTTPS 리스너에 사용할 인증서의 Amazon 리소스 이름(ARN)을 확인합니다.
-
샘플 NGINX 배포를 생성하려면 다음 명령을 실행합니다.
$ kubectl create deploy web --image=nginx --port 80 --replicas=3
- Amazon EKS 클러스터에 Kubernetes 포드가 배포되었는지 확인하려면 다음 명령을 실행합니다.
$ kubectl get pods -l app=web
참고: 포드 레이블은 app=web입니다. 이 레이블을 서비스 개체 선택기로 사용하여 포드 집합을 확인합니다.
로드 밸런서 서비스 유형을 사용해 Kubernetes 서비스 노출
참고: 애플리케이션 노출에 수신 개체를 이용하려면 수신 개체를 이용해 Kubernetes 노출 섹션으로 건너뛰세요.
- service.yaml 매니페스트 파일을 생성하려면, 서비스 유형 **LoadBalancer:**를 사용합니다.
cat <<EOF > loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: lb-service
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-tls-cert: arn:aws:acm:{region}:{user id}:certificate/{id}
# Only run TLS on the port named "https" below.
service.beta.kubernetes.io/aws-load-balancer-tls-ports: "https"
# By default In-tree controller will create a Classic LoadBalancer if you require a NLB uncomment below annotation.
# service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
selector:
app: web
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 80
type: LoadBalancer
EOF
-
주석 service.beta.kubernetes.io/aws-load-balancer-tls-cert를 편집하여 ACM의 ARN을 포함하도록 합니다.
-
loadbalancer.yaml 파일을 적용하려면 다음 명령을 실행하세요.
$ kubectl create -f loadbalancer.yaml
- 사용자 지정 도메인을 로드 밸런서의 DNS에 연결 섹션으로 건너뜁니다.
수집 개체를 사용해 Kubernetes 서비스 노출
참고: 다음 해결 방법은 Amazon EKS 클러스터에 AWS 로드 밸런서 컨트롤러를 설치했다고 가정합니다.
- 다음 예제에 따라 NodePort 유형의 Kubernetes 서비스를 생성합니다.
cat <<EOF > ingressservice.yaml
apiVersion: v1
kind: Service
metadata:
name: web-nginx
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: NodePort
selector:
app: web
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: "web-nginx-ingress"
annotations:
# Below annotation is to specify if the loadbalancer is "internal" or "internet-facing"
alb.ingress.kubernetes.io/scheme: internet-facing
# TODO: Fill in with the ARN of your certificate.
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:xxxx:certificate/xxxxxx
# TODO: Fill in the listening ports.
alb.ingress.kubernetes.io/listen-ports: '\[{"HTTP": 80}, {"HTTPS":443}\]'
# Set HTTP to HTTPS redirects. Every HTTP listener configured will be redirected to below mentioned port over HTTPS.
alb.ingress.kubernetes.io/ssl-redirect: '443'
labels:
app: web
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: "web-nginx"
port:
number: 80
EOF
참고: 위 수집 매니페스트는 HTTP와 HTTPS에서 수신 대기한 다음 ALB에서 TLS를 종료하고 HTTP를 HTTPS로 리디렉션합니다.
- ingressservice.yaml 파일을 적용하려면 다음 명령을 실행합니다.
$ kubectl create -f ingressservice.yaml
사용자 지정 도메인을 로드밸런서의 DNS에 연결
- LoadBalancer 유형 서비스의 DNS URL을 반환하려면 다음 명령을 실행합니다.
$ kubectl get service
- Ingress 유형 서비스의 DNS URL을 반환하려면 다음 명령을 실행합니다.
$ kubectl get ingress/web-nginx-ingress
-
사용자 지정 도메인 이름을 로드 밸런서 이름과 연결합니다.
-
웹 브라우저에서 다음 HTTPS 프로토콜로 사용자 지정 도메인을 테스트합니다.
https://yourdomain.com