• 카테고리

    질문 & 답변
  • 세부 분야

    데브옵스 · 인프라

  • 해결 여부

    미해결

안녕하세요

24.02.04 21:57 작성 24.02.04 22:01 수정 조회수 135

0

https://cloudneta.github.io/cnaeblab/2023-05-21-CH5-1/
여기서 EKS Node Viewer 설치 까지 완료한 뒤

https://cloudneta.github.io/cnaeblab/2023-06-02-CH1/

여기에서 파드배포 부분을 실습하여 파드를 배포하였습니다.
kubeopsview에서도 마리오 파드 생성이 확인되었으며

kubectl get pod,svc에서도 마리오 디플로이먼트와 로드밸런서 생성도 확인하였고
콘솔에 들어가서도 nlb 활성상태 확인이 됩니다

curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/mario.yaml


하지만 해당 명령어로 나오는 DNS로 접속이 안됩니다.
웹페이지를 찾을 수 없어요.

1. 왜 접속이 안되는지
2. mario.yaml 에 레플리카를 1로 뒀는데 대상그룹의 등록된 대상 마리오 인스턴스 3개 잡힙니다.
3. yaml에서 8080포트 넣었는데 대상그룹 포트 30836 입니다.

어떤게 잘못된 것일까요?


4. 프로메테우스 타겟 메뉴 들어가보면 모니터링 네임스페이스의 파드들만 타겟으로 잡혀있는데, 원클릭 설치시 노드익스포터가 모니터링 노드만 잡고 있는건지? 그렇다면 추가적으로 파드를 설치할 경우 모니터링 네임스페이스에 apply해야하는건가요?


이러한 작업을 하는 이유는 실습을 따라하면서 그라파나와 프로메테우스를 설치했고, 추가적인 파드를 설치해서 새로운 데이터를 노드익스포터가 잘 받아오는지, 그라파나가 제대로 출력하는지를 보기 위함입니다.

답변 1

답변을 작성해보세요.

0

안녕하세요. CloudNet@ 팀입니다.

 

질문에 내용에 대해 동일한 구성을 한 후 실습을 진행해 보았습니다. 마찬가지로 정상적인 접속이 되지 않는 상황이며 왜 이러한 현상이 나오는지 설명드리겠습니다.

 

먼저 1장 실습에서 mario 파드를 배포하는 환경은 파드를 외부에 노출하는 방법으로 LoadBalancer 서비스를 사용합니다.

기본 EKS 환경에서 Loadbalancer 서비스를 정의하면 AWS에 CLB라는 로드 밸런서가 생성되어 접근되는데요.

이렇게 CLB를 생성하는 경우는 EKS 클러스터를 구성 후 별도의 AWS Load Balancer Controller를 구성하지 않는 경우에 해당합니다.

 

여기서 AWS Load Balancer Controller를 설치했다면 얘기가 조금 달라지는데요.

앞서와 동일하게 Loadbalancer 서비스를 정의하면 AWS에 CLB가 아닌 NLB라는 로드 밸런서가 생성됩니다.

공교롭게 수강생분이 구성한 환경(5장 실습 환경)은 AWS Load Balancer Controller를 생성한 환경인 것이니 CLB가 아닌 NLB가 구성되어 mario 파드가 노출됩니다.

 

— Amazon EKS Docs 참조 —

Kubernetes 유형의 Service LoadBalancer를 생성하면 AWS 클라우드 공급자 로드 밸런서 컨트롤러가 기본적으로 AWS Classic 로드 밸런서를 생성하지만 AWS Network Load Balancer도 생성할 수 있습니다. 이 컨트롤러는 향후 중요한 버그 수정만 수신하고 있습니다. AWS 클라우드 공급자 로드 밸런서 사용에 대한 자세한 내용은 Kubernetes 설명서의 AWS 클라우드 공급자 로드 밸런서 컨트롤러를 참조하세요. 이 주제에서는 이에 대해 다루지 않습니다.

AWS 클라우드 공급자 로드 밸런서 컨트롤러 대신 AWS Load Balancer Controller의 버전 2.5.4 이상을 사용하는 것이 좋습니다. AWS Load Balancer Controller는 AWS Network Load Balancer를 생성하지만 AWS Classic 로드 밸런서는 생성하지 않습니다. 이 주제의 나머지 부분은 AWS 로드 밸런서 컨트롤러 사용에 대한 것입니다.

— end —

 

여기서 AWS Load Balancer Controller를 통해 NLB 로브 밸런서 서비스를 배포할 때 필수적인 요소가 있습니다. metadata 영역에서 annotations 필드에 NLB를 설정을 위한 정보를 정의해야 하는데요.

현재 1장의 mario.yaml 파일은 아래와 같습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mario
  labels:
    app: mario
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mario
  template:
    metadata:
      labels:
        app: mario
    spec:
      containers:
      - name: mario
        image: pengbai/docker-supermario
---
apiVersion: v1
kind: Service
metadata:
   name: mario
spec:
  selector:
    app: mario
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  type: LoadBalancer

Service 영역에서 Loadbalancer 영역을 정의하고 있지만 NLB는 annotations 필드를 정의해야 한다고 했죠? annotations 정보가 정의되지 않아 결국 로드밸런서 동작이 되지 않아 접근이 되지 않는 것입니다.

만약 CLB라면 별도의 annotations 정의가 필요없어 문제가 없지만 AWS Load Balancer Controller 설치에 의해 NLB로 구성하려고 한다면 문제가 발생하는 것이죠.

 

그러면 mario.yaml 파일을 아래와 같이 수정하면 문제 없이 동작할 수 있습니다. (참고로 NLB 생성에 따른 약간의 대기가 필요합니다.)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mario
  labels:
    app: mario
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mario
  template:
    metadata:
      labels:
        app: mario
    spec:
      containers:
      - name: mario
        image: pengbai/docker-supermario
---
apiVersion: v1
kind: Service
metadata:
   name: mario
   annotations:
     service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
     service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
     service.beta.kubernetes.io/aws-load-balancer-healthcheck-port: "8080"
     service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
spec:
  selector:
    app: mario
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  type: LoadBalancer

 

그러면 1항 질문은 설명이 된 것 같고요.
2항과 3항도 생성된 NLB의 대상 그룹에서 다시 확인해 보시면 될 것입니다.

 

마지막으로 4항에서 노드마다 구성되는 노드익스포터는 모니터링 네임스페이스에 배포된 것일 뿐이고 파드가 꼭 모니터링 네임스페이스에만 존재해야 하는 것은 아닙니다.

kube-state-metrics 와 node-exporter 를 설치해서 파드들의 메트릭 정보를 수집할 수 있는 것이죠.

 

감사합니다.

꾸라님의 프로필

꾸라

질문자

2024.02.05

답변 감사드립니다. 말씀대로 해보니 정상적으로 배포되어 실행 가능 했습니다. 아직 원리를 이해한 건 아니지만 말입니다. 4번 답변에 대해서는 아직 못해봤습니다

아무래도 1장 환경과 5장 환경이 섞이다보니 그런 것이니..
특별한 이유가 아니라면? 순차적으로 진행하시면 이해되실거라 생각되네요. 감사합니다.

devops님의 프로필

devops

2024.02.05

우연히 봤는데, 잘 읽었습니다. 되게 도움되는 팁이였네요