본문 바로가기

728x90

Work/개발 노트

[IDE] Goland 컴파일 시 already exists and is not an object file 에러 Goland 2020.3 (2020.11.25) 버전으로 업데이트 이 후 최초 컴파일에는 성공하지만 이 후부터는 이미 존재한다는 오류와 함께 컴파일에 실패하는 경우가 반복되었다. 해결하기 위해 아래와 같이 Ctrl + Shift + A를 클릭 후 표시되는 Actions 입력창에 Registry라고 입력한다. 아래 그림과 같이 "go.build.output.path.cache.enabled" 항목을 찾아 체크 표시를 해제 한다. 이 후 빌드 수행 시 실행 파일을 캐시하지 않기 때문에 해당 오류는 발생하지 않는다. 다만 캐시를 하지 않으면 빌드 실행 속도 개선의 이점을 잃게 되므로 다음 버전 업데이트 시에 다시 체크하고 실행을 해서 테스트해봐야할 듯 하다. 더보기
[Go언어] API 서버간 내부 통신 시 too many open files 문제 다수의 API 서버를 실행 중이고, 각 서버간에는 주기적으로 상호 통신을 실행하고 있다. 이 때 일정 시간이 경과하면 아래와 같은 오류가 발생하면서 먹통이 되는 현상이 발생하였다. dial tcp: lookup 127.0.0.1: too many open files 먼저 메시지 내용 처럼 현재 얼마만큼의 파일이 Open 되었는지 확인해보기 위해 아래와 같이 lsof 명령을 사용하였다. lsof | wc -l 문제가 발생한 대상 API 서버에서 too many open files 발생 시 file open 수는 17141개 였는데 재시작 후 6994로 감소하였다. 이로 인해 프로세스 실행 후 문제가 발생한 시점까지 대략 10147개의 file open이 추가된 것으로 추정되는 상황이다. (다른 프로세스로 .. 더보기
[k8s] kube-prometheus #1 - 설치 Amazon EKS를 사용하면서 초기에 Kubernetes 모니터링을 위해 Container Insights를 사용하였으나 500개 이상의 Custom Metric이 CloudWatch에 추가되면서 많은 비용이 발생하게 되었다. 비용 절감을 위해 Container Insights에서 현재는 Prometheus로 변경을 진행하였고, Prometheus를 간단하게 설치 할 수 있는 CoreOS의 kube-prometheus를 사용하였다. CoreOS에서 제공하는 kube-prometheus를 사용하면 Prometheus를 간단하게 설치할 수 있고, 설치 절차는 다음과 같다. 1. Git clone git clone https://github.com/coreos/kube-prometheus.git 2. 의존성.. 더보기
[k8s] DaemonSet 실행 시 Pending 문제 DaemonSet으로 Pod를 실행하면 각 워커노드에 Pod가 하나씩 실행이 되는데 특정 노드에서만 Pending이 발생하는 현상이 있었다. example-9sz7d 1/1 Running 0 3d16h 10.0.62.16 ip-10-0-38-38.ap-northeast-2.compute.internal example-d7jf6 1/1 Running 0 3d16h 10.0.110.150 ip-10-0-96-136.ap-northeast-2.compute.internal example-gdkpk 1/1 Running 0 3d16h 10.0.113.194 ip-10-0-126-203.ap-northeast-2.compute.internal example-jt2lv 1/1 Running 0 3d16h 10.. 더보기
[Go언어] for 루프에서 포인터 사용 시 동일 객체 참조 문제 문제 아래와 같이 for 루프를 사용했다. for _, data := range sampleDataSlice { GetStore().storeOne(&data) } 위 코드를 실행하면 저장된 모든 데이터가 동일한 값을 가지게 된다. 원인 위 코드에서 sampleDataSlice는 slice 이기 때문에 for 루프의 변수로 인덱스와 현 루프의 객체를 변수에 할당한다. 이 때, 인덱스를 사용하지 않고 그 뒤의 변수를 사용하게 될 경우 변수에는 슬라이스에 포함된 현재 요소가 지역 변수에 할당된다. 그러므로 변수에 할당되는 값은 계속 변경되지만 storeOne 함수로 전달되는 변수의 주소는 동일하기 때문에 storeOne 함수 안에서 사용한 변수는 결과적으로 제일 마지막에 지역변수에 할당했던 객체를 동일하게 .. 더보기
[k8s] ALB Ingress 사용 시 다수의 리스너 등록하기 목표 Amazon EKS ALB Ingress controller를 사용하여 ALB를 생성하였고, 하고자하는 목표는 아래와 같았다. Ingress 설정으로 Listen Port를 HTTPS(443) 포트로 지정하였고, Ingress의 rules에 정의되어 있는 대로 URL Path 에 따라 각각 정해진 서비스로 traffic routing 한다. (URL 기반 Routing) → 이 경우에는 정상동작 함을 확인하였다. ... alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}, {"HTTP": 9090}]' ... spec: rules: - http: paths: - path: /grafana* backend: serviceNam.. 더보기
[Docker] Secret 사용 해보기 Docker Secret을 사용하면 아래와 같은 민감한 데이터를 안전하게 관리할 수 있다. 사용자 패스워드 TLS 인증서 및 키 SSH 키 데이터베이스 접속 정보 일반 문자열 및 바이너리 (최대 500kb 크기) Docker Secret 사용 시 컨테이너 내에서는 평문으로 유지되고, 컨테이너가 중지되면 Secret도 함께 제거된다. Docker Secret은 create 명령을 사용하여 문자열 또는 파일로 생성할 수 있다. 먼저 문자열로 생성하는 경우 아래와 같이 Docker Secret을 생성한다. printf | docker secret create - printf 명령으로 문자열을 출력하고 파이프를 사용하여 오른편의 docker secret create 명령으로 해당 문자열을 전달하게 되면 문자열이.. 더보기
[nginx] 정규표현식으로 패턴 매치 후 proxy pass 시 쿼리 파라미터 포함하기 Nginx를 사용하면서 패턴에 매치하는 Request를 Proxy pass로 전달 할 때 쿼리 파라미터가 포함되지 않아 어플리케이션 레벨의 문제인 것으로 생각하고 한참을 고생했다. 여기서 쿼리 파라미터는 아래 예로 든 주소에서 물음표(?) 뒤에 오는 키-값들을 의미한다. https://yongho1037.tistory.com/manage/newpost/?type=post&returnURL=%2Fmanage%2Fposts%2F 문제가 되었던 nginx 설정은 다음과 같다. location ~ /(api|login|auth)/(.*)$ { proxy_pass http://backend/$1/$2; proxy_set_header Host $host; proxy_set_header X-Forwarded-For .. 더보기

728x90