EKS 클러스터에 HTTPS 통신 구성(Ingress, Cert-Manager)

2023. 9. 4. 20:28DevOps/Kubernetes

 

사전에 EKS가 구성되어 있어야 합니다.

subnet: public private 모두 필요합니다.
클러스터(마스터와 워커노드 모두 private subnet에 위치)
Public Subnet에서 Private Subnet으로 연결이 가능한 NAT Gateway가 필요합니다.
 

1. nginx-ingress for aws 다운로드

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/aws/deploy.yaml
 

2. manifest 코드 수정 후 nginx-ingress 컨트롤러 생성

해당 deploy.yaml 파일을 바로 적용하게 되면 기본적으로 private subnet에 NLB가 위치하기 되어 외부에서 접속할 수 없기 때문에 아래 3줄을 annotation에 추가해주고 apply

참고 | https://repost.aws/knowledge-center/eks-access-kubernetes-services

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
    service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    <아래 3줄을 추가>
    service.beta.kubernetes.io/aws-load-balancer-type: "external"
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "instance"
    service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
 

service 부분에 자동으로 NLB의 도메인이 등록된 것을 확인

 


3. NLB 도메인을 입력하여 NginX 페이지 확인

kubectl get svc -n ingreess-nginx

Output:
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP                                                                          PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   172.20.238.111   k8s-ingressn-ingressn-242a3145de-340c6f18e41a71ea.elb.ap-northeast-2.amazonaws.com   80:30365/TCP,443:32293/TCP   17m
ingress-nginx-controller-admission   ClusterIP      172.20.84.112    <none>                                                                               443/TCP                      17m
 

위 명령어로 나온 ingres-nginx의 EXTERNAL-IP가 <pending>에서 NLB의 DNS 주소로 바뀌게 되면

해당 주소로 접속해서 NginX 페이지가 정상적으로 뜨는지 확인할 수 있습니다.

 

 

 

4. Route53에서 발급받은 도메인을 이용하여 NLB를 연결


5. Service / Deployment(Pod) 배포

애플리케이션 이미지를 통해 Pod를 실행시키고 Service를 묶습니다.

이부분은 생략하겠습니다.


 

6. Cert-Manager 설치

https://cert-manager.io/docs/installation/

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.0/cert-manager.yaml
 

Let’s Encrypt에서는 Staging 버전과 Production 환경이 있습니다.

Staging 버전은 Selfsigned 인증서와 마찬가지로 브라우저에서 신뢰할 수 없다고 표시가 됩니다.

반대로, Prod 버전은 브라우저에서 신뢰가 가능하도록 발급할 수 있습니다.

spec.acme.server의 주소만 바꿔주면 쉽게 변경이 가능합니다.

추가적으로, 안내받을 이메일도 본인의 이메일로 바꿔주면 됩니다.

아래 manifest 코드에 본인 이메일을 추가작성하여 kubectl apply 해주시면 됩니다.

 

vim clusterissuer.yaml

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    # The ACME server URL
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: [자신의 이메일 주소를 기재]
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-staging
    # Enable the HTTP-01 challenge provider
    solvers:
    # An empty 'selector' means that this solver matches all domains
    - selector: {}
      http01:
        ingress:
          class: nginx

---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    # The ACME server URL
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: [자신의 이메일 주소를 기재]
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-prod
    # Enable the HTTP-01 challenge provider
    solvers:
    - http01:
        ingress:
          class: nginx
 

Manifest Code 적용


8. Ingress 생성 - Certificate(Secret) 확인

아래는 sample Ingress Manifest Code입니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    ingress.kubernetes.io/ssl-redirect: "true"
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    cert-manager.io/cluster-issuer: letsencrypt-prod # prod 버전으로 생성
spec:
  tls:
  - hosts:
    - www.도메인.com # 인증서를 적용할 도메인으로 변경
    secretName: app-certificate # 인증서 key가 저장되는 secret
  rules:
  - host: www.devycha.com # 인증서를 적용할 도메인으로 변경
    http:
      paths:
      - path: /users
        pathType: Prefix
        backend:
          service:
            name: user-service
            port:
              number: 8080
 

위에서 설정한 secretName인 app-certificate에 대한 secret 정보가 생성된 것을 확인

Ingress와 연결된 로드밸런서 주소와 서비스와 연결된 path로 접속하여 Certification 확인