쿠버네티스 서비스 리소스(ELB)에 HTTPS 적용하기

2021-09-11

.

Data_Engineering_TIL(20210911)

[학습자료]

“클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트” 책을 읽고 정리한 내용입니다.

** 동양북스, 아이자와 고지&사토 가즈히코 지음, 박상욱 옮김

참고자료 URL : https://github.com/dybooksIT/k8s-aws-book

“컨테이너를 외부로 공개하기 위한 쿠버네티스 리소스” 에 이어서 공부한 내용을 정리한 내용임

** URL : https://minman2115.github.io/DE_TIL276

“EKS 클러스터에 API 어플리케이션 배포하기” 까지 완료하여야 실습을 진행할 수 있음

** URL : https://minman2115.github.io/DE_TIL253

[학습내용]

  • 지난 실습에서 구현했던 쿠버네티스에서 클러스터 리소스 관점에서의 아키텍처

1

쿠버네티스에서 동작하는 컨테이너를 클러스터 외부에서 접속할때 HTTPS로 접속하도록 설정을 해보자

[실습내용]

STEP 1) AWS에서 도메인을 생성한다.

route 53 콘솔에 접속해서 아래와 같이 도메인을 등록한다.

domain_register

등록한후 이메일로 인증을 해주면 30분 이내로 도메인 등록이 완료된다.

domain_register2

STEP 2) STEP 1)에서 등록한 도메인에 인증서를 생성한다.

Certificate Manager 콘솔에서 아래와 같이 인증서를 생성한다.

333

위와 같이 Route 53에 우리가 생성한 도메인이 등록되어 있기 때문에 ‘Route 53에서 레코드 생성’이라는 버튼을 클릭해서 생성하면 5분 이내로 인증서 발급이 완료된다.

아래 그림과 같이 route 53에 레코드가 생성했는지 체크하고 certificate manager 콘솔로 와서 확인해보면 인증서가 등록된 것을 확인할 수 있다.

444

그런 다음에 아래와 같이 발급받은 인증서의 AWS ARN 아이디를 별도로 복사해둔다.

555

STEP 3) 발급받은 인증서를 로드벨런서에 적용하기

우리가 지난실습에서 API 어플리케이션을 제공하는 쿠버네티스 클러스터까지 띄웠다고 했을때 쿠버네티스 클러스터 현황은 아래와 같다.

쿠버네티스 서비스 리소스에서 로드벨런서를 사용하고 있고, TCP 8080 통신을 하고 있다.

23_service_backend-app_https_k8s.yaml.template를 이용해서 이 매니페스트를 EKS 클러스터에 적용해보자.

[ec2-user@ip-10-10-1-236 eks-env]$ kubectl get all
NAME                              READY   STATUS    RESTARTS   AGE
pod/backend-app-xxxxxxxx-mm5dw   1/1     Running   0          38h
pod/backend-app-xxxxxxxx-txg5x   1/1     Running   0          38h

NAME                          TYPE           CLUSTER-IP       EXTERNAL-IP                                              PORT(S)          AGE
service/backend-app-service   LoadBalancer   10.100.230.161   xxxxxxxxxx-1111111111.ap-northeast-2.elb.amazonaws.com   8080:30844/TCP   90m

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/backend-app   2/2     2            2           38h

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/backend-app-xxxxxxxx   2         2         2       38h

[ec2-user@ip-10-10-1-236 eks-env]$ cat 23_service_backend-app_k8s.yaml
apiVersion: v1
kind: Service
metadata:
  name: backend-app-service
spec:
  type: LoadBalancer
  selector:
    app: backend-app
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
        
[ec2-user@ip-10-10-1-236 column-loadbalancer-https]$ cd /home/ec2-user/k8s-aws-book/column-loadbalancer-https

[ec2-user@ip-10-10-1-236 column-loadbalancer-https]$ cat 23_service_backend-app_https_k8s.yaml.template
apiVersion: v1
kind: Service
metadata:
  name: backend-app-service
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: ${CERT_ARN}
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
spec:
  type: LoadBalancer
  selector:
    app: backend-app
  ports:
  - protocol: TCP
    port: 443
    targetPort: 8080
    name: https
        
[ec2-user@ip-10-10-1-236 column-loadbalancer-https]$ CERT_ARN=arn:aws:acm:ap-northeast-2:xxxxxxx:certificate/xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxx > 23_service_backend-app_https_k8s.yaml.template | kubectl apply -f -
 
# 만약에 error: no objects passed to apply 이런 에러가 나면 아래와 같이 다시 시도하면 된다.
[ec2-user@ip-10-10-1-236 column-loadbalancer-https]$ vim 23_service_backend-app_https_k8s.yaml.template
apiVersion: v1
kind: Service
metadata:
  name: backend-app-service
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:ap-northeast-2:xxxxxxx:certificate/xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxx
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
spec:
  type: LoadBalancer
  selector:
    app: backend-app
  ports:
  - protocol: TCP
    port: 443
    targetPort: 8080
    name: https
    
[ec2-user@ip-10-10-1-236 column-loadbalancer-https]$ kubectl apply -f 23_service_backend-app_https_k8s.yaml.template
service/backend-app-service configured

[ec2-user@ip-10-10-1-236 column-loadbalancer-https]$ cd ~

[ec2-user@ip-10-10-1-236 ~]$ kubectl describe service backend-app-service
Name:                     backend-app-service
Namespace:                eks-work
Labels:                   <none>
Annotations:              service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
                          service.beta.kubernetes.io/aws-load-balancer-ssl-cert:
                            arn:aws:acm:ap-northeast-2:xxxxxxxxxxxx:certificate/xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxx
                          service.beta.kubernetes.io/aws-load-balancer-ssl-ports: https
Selector:                 app=backend-app
Type:                     LoadBalancer
IP Families:              <none>
IP:                       xx.xxx.xxx.xxx
IPs:                      <none>
LoadBalancer Ingress:     xxxxxxxxxxxx-xxxxxxxxxxxx.ap-northeast-2.elb.amazonaws.com
Port:                     https  443/TCP
TargetPort:               8080/TCP
NodePort:                 https  31892/TCP
Endpoints:                xxxxxxxxxxxx:8080,xxxxxxxxxxxx:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age                 From                Message
  ----    ------                ----                ----                -------
  Normal  EnsuringLoadBalancer  60s (x2 over 108m)  service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   58s (x2 over 108m)  service-controller  Ensured load balancer

위와 같이 쿠버네티스 서비스 리소스 설정값을 바꿔주면 아래 그림과 같이 ELB 콘솔에서 https 통신으로 변경된 것을 확인할 수 있다.

888

그리고 웹브라우저에서 https://[ELB도메인주소]/health 로 접속하면 아래와 같이 정상구동하는 것을 확인할 수 있다.

666

STEP 4) STEP 1)에서 등록한 도메인에 EKS 서비스 리소스인 ELB를 연결

아래 그림과 같이 route 53에서 우리가 생성한 도메인 호스트를 클릭한 다음에 새로운 레코드를 추가해주면 된다.

이때 타입은 CNAME이고, value 값은 ELB의 DNS 주소를 넣어주면 된다.

추가를 완료한 다음에 웹브라우저에서 등록한 레코드 주소로 접속해서 health 체크를 해보자.

ex) https://eks.minsupark.link/health

777