본문 바로가기

EKS/LoadBalancer & EXT DNS

EKS LoadBalancer - 1. Classic LoadBalancer, External DNS

파드를 노출시키는 부분은 Service이기 때문에 service.yaml을 수정하도록 하겠습니다.

 

service.yaml을 다음과 같이 수정 배포하도록 하겠습니다.

apiVersion: v1
kind: Service
metadata:
  name: cb-test-api
  namespace: prd-api
spec:
  ports:
    - port: 80
      targetPort: 9000
      protocol: TCP
  type: LoadBalancer
  selector:
    app: cb-test-api

 

은 아래와 같은 명령어를 주셔서 바꿀 수도 있습니다.

kubectl patch svc cb-test-api -n prd-api -p '{"spec": {"type": "LoadBalancer"}}'

 

수정한 후 아래와 같이 CLB가 하나 생성되며, 이를 통해 서비스를 확인할 수 있습니다.

 

 

 

 

 

 

 

 

자, 이제 그럼 기존에 가지고 있는 ACM 및 Route53을 활용하여서 443 port 및 DNS 매핑을 해보도록 하겠습니다.

 

먼저 Route53에 매핑시켜줄 수 있는 External DNS에 대한 배포를 해보겠습니다.

 

apiVersion: v1
kind: ServiceAccount
metadata:
  name: external-dns
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: external-dns
rules:
- apiGroups: [""]
  resources: ["services"]
  verbs: ["get","watch","list"]
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get","watch","list"]
- apiGroups: ["extensions"]
  resources: ["ingresses"]
  verbs: ["get","watch","list"]
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["list"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: external-dns-viewer
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: external-dns
subjects:
- kind: ServiceAccount
  name: external-dns
  namespace: default
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: external-dns
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: external-dns
    spec:
      serviceAccountName: external-dns
      containers:
      - name: external-dns
        image: registry.opensource.zalan.do/teapot/external-dns:v0.5.9
        args:
        - --source=service
        - --source=ingress
        - --domain-filter=hyeonho.shop # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
        - --provider=aws
        - --policy=upsert-only # would prevent ExternalDNS from deleting any records, omit to enable full synchronization
        - --aws-zone-type=public # only look at public hosted zones (valid values are public, private or no value for both)
        - --registry=txt
        - --txt-owner-id=ZOV2K8TSX4LYX

 

수행 후 하나의 터미널에서 계속해서 모니터링을 해주도록 하겠습니다.

kubectl logs -f deployments.app/external-dns

 

이제 Service.yaml을 아래와 같이 수정해주시기 바랍니다.

apiVersion: v1
kind: Service
metadata:
  name: cb-test-api
  namespace: prd-api
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:ap-northeast-2:{account-number}:certificate/{id}
    external-dns.alpha.kubernetes.io/hostname: {domain}
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: https
spec:
  ports:
    - name: http
      port: 80
      targetPort: 9000
      protocol: TCP
    - name: https
      port: 443
      targetPort: 9000
      protocol: TCP
  type: LoadBalancer
  selector:
    app: cb-test-api

 

혹은 아래와 같은 명령어를 수행하셔도 됩니다.

kubectl annotate -n prd-api svc cb-test-api service.beta.kubernetes.io/aws-load-balancer-ssl-cert={acm-arn}
kubectl annotate -n prd-api svc cb-test-api external-dns.alpha.kubernetes.io/hostname={domain}
kubectl annotate -n prd-api svc cb-test-api service.beta.kubernetes.io/aws-load-balancer-backend-protocol=http
kubectl annotate -n prd-api svc cb-test-api service.beta.kubernetes.io/aws-load-balancer-ssl-ports=https

 

서비스를 다시 배포 후 아래와 같은 로그가 뜨면 성공적으로 Route53을 업데이트한 것입니다.

 

Route53 Record에 아래와 같이 등록된 것을 볼 수 있습니다.

 

CLB에서도 정상적으로 세팅된 것을 보실 수 있습니다.

 

HTTPS로의 접근도 정상적으로 수행되는 것을 볼 수 있습니다.

 

 

EKS에서 CLB를 이용하여 서비스를 구성해봤습니다.

 

다음 포스트에서는 ALB를 사용해보도록 하겠습니다.