- 산업기능요원으로 근무하고 있는 2년차 백엔드 개발자 조민준입니다.
Kubernetes: 애플리케이션 설정을 체계적으로 관리하기
쿠버네티스 개발전략을 읽고 작성한 내용입니다. https://product.kyobobook.co.kr/detail/S000200103262 쿠버네티스를 통해서 설정을 외부화하여 관리하는 방법을 알아보겠습니다. 여기서 설정은 데이터베이스 url, username, password, 얼마전에 작업한 뉴렐릭 라이센스 키 같은 값들을 말합니다. 이러한 설정값들은 변경되거나 추가 삭제되는 경우가 많기 때문에 애플리케이션 외부에서 관리하는 것이 유리합니다. 외부화된 설정: Externalized configuration 환경 변수와 실행 인자 실행 인자 우선 실행 인자와 환경 변수에 대해 알아보겠습니다 prod 프로필을 사용하려면 아래와 같이 실행 인자로 환경 정보를 넘겨줍니다. $ java -Dspring....
Spring Security 기본 구성
*Spring Security in Action을 읽고 작성했습니다. https://product.kyobobook.co.kr/detail/S000061695014 Spring Security와 구성 요소 Spring Security는 스프링 프로젝트의 사실상 표준(defacto)입니다. 보안에 관련된 사전 구성 요소가 제공되며, 필요에 따라 일부 구성 요소만 재정의하여 사용할 수 있습니다. Spring Security 의존성을 프로젝트에 추가하고 애플리케이션을 시작하면 아래와 같은 메시지를 확인할 수 있습니다. Using generated security password: 41632cba-2835-43e3-85c8-3aeac7ce686a This generated password is for development use only. Your security configuration must be updated before running your application in production....
Java ExecutorService에 대하여
ExecutorService ExecutorService를 사용하면 간단하게 스레드풀을 생성해서 병렬처리를 할 수 있습니다. Executors의 스태틱 메서드를 통해 간단하게 ExecutorService를 사용할 수 있습니다. 생성자를 이용해 커스텀하게 생성할 수도 있습니다. 이상적인 풀 사이즈 Task Type Ideal pool size Considerations CPU bound CPU Core count 얼마나 많은 작업이 같은 CPU에서 동작하는지 (Context switching 비용) I/O bound High 각 작업의 평균 대기 시간, 너무 큰 스레드 풀은 메모리 사용량을 고려해야함. int coreCount = Runtime.getRuntime().availableProcessors(); // int coreCount = taskExecutionProperties....
사소한 Thread-safe Tips
가능하다면 로컬 변수를 사용합니다. 프레임워크에 위임합니다. e.g. RequestContextHolder ConcurrentHashMap 같은 요소를 ThreadLocal 변수로 변경할 수 있는지 검토합니다. public class UserContextHolder { public static ThreadLocal<User> holder = new ThreadLocal(); } class HoldingService { public void holdUser() { // Set user for this thread User user = getUser(); UserContextHolder.holder.set(user); } } class SomeService { public void getUser() { // Get user for this thread User user = UserContextHolder.holder.get(); // Remove user; user no longer required UserContextHolder....
12 factor app (15 factor app)
Introduction 12 factor app은 서비스형 소프트웨어를 구성하기 위한 방법론입니다. 개발 언어/프레임워크에 상관없는 이식성과 플랫폼 호환성 향상을 위한 디자인 원칙입니다. 애플리케이션의 수평적 확장이 용이하도록 합니다. 애플리케이션 확장 가능성 CI/CD에 용이성 플랫폼간 이식성 기본적인 기대치, 정책 설정 1. Codebase 형상관리 시스템에서 하나의 코드베이스를 관리하면서, 다수에 배포한다. 하나의 코드베이스에 여러개의 애플리케이션 코드가 있다면 12 factor app 위반입니다. 코드베이스는 모든 배포에 사용되지만 각 배포는 다른 버전이 사용될 수 있습니다. 2. Dependencies 의존성을 명시적으로 선언하고 분리한다....
Kubernetes: pod와 service
Pod container Pod에는 container가 여러개 있을 수 있으며, localhost로 접근할 수 있다. Pod가 생성될 때는 IP가 할당되며, 이 IP를 통해 Pod에 접근할 수 있다. 쿠버네티스 클러스터 내에서만 IP로 접근 가능하다. Pod가 재생성되면 IP 주소가 바뀐다. apiVersion: v1 # 하나의 Pod kind: Pod metadata: name: pod-1 spec: # 여러 개의 container containers: - name: container1 image: image1 ports: - containerPort: 8000 - name: container2 image: image2 ports: - containerPort: 8080 label Pod 뿐만 아니라 다른 오브젝트에도 사용할 수 있지만, Pod에서 가장 많이 사용된다....
Introduce Kubernetes
What, Why Kubernetes? What 쿠버네티스는 컨테이너들을 운영, 관리하는 컨테이너 오케스트레이터이다. 컨테이너 오케스트레이터는 개별 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화해준다. Why 물리 서버에서 동작하는 서비스는 리소스 관리를 효율적으로 할 수 없다. 3개의 서비스에 트래픽이 몰리는 시간대가 다르다. 각 서비스는 최소 트래픽 때 0.5대, 최대 트래픽 때 3개의 서버가 사용된다. 이 경우 총 9대의 서버가 사용된다. 배포시에도 비효율적이다. 중단이 가능한 경우 모든 서비스를 내린 후, 업데이트하여 다시 올린다. 중단이 불가능하면 서비스를 하나씩 내리고 하나씩 업데이트하여 다시 올린다....
kubectl command
kubectl command 쿠버네티스 API를 사용하는 CLI 도구이다. kubectl [command] [TYPE] [NAME] [flags] [command] 하나 이상의 리소스에서 수행하는 동작을 지정한다. ex) create get describe delete [TYPE] 리소스 타입을 지정한다. 대소문자를 구분하지 않으며 단수형, 복수형, 약어를 지정할 수 있다. ex) pod pods po [NAME] 하나 이상의 리소스의 이름을 지정한다. 대소문자를 구분하며 리소스 이름을 지정하지 않으면 모든 리소스가 대상이 된다. 리소스가 모두 동일한 TYPE인 경우 ex) kubectl get pod name1 name2 리소스 타입을 개별로 지정하는 경우 ex) kubectl get pod/name1 replicaset/name2 [flags] 플래그를 지정한다....
Shell Script
Shell Script 쉘 스크립트로 만든 UP-DOWN 게임 Shell이란 운영체제에서 커널과 사용자 사이를 이어주는 역할을 하는 명령어 해석기이다. Shell은 bash sh csh zsh등이 있다. Shell Script란 운영체제의 Shell을 이용해서 Shell 명령어들을 순차적으로 실행시켜주는 스크립트이다. Shell Script를 사용하기 위해서는 다음과 같이 시작해야 한다. #!/bin/bash #!/usr/bin/env bash #!/usr/bin/env python3 위와 같이 #!으로 시작하여 Shell의 경로를 선언해준다. 이를 쉬뱅이라 한다. 쉬뱅은 어느 인터프리터가 스크립트의 명령어를 해석할 지 가리킨다. 변수 변수 number=1 string="string" echo "$number" echo "$string" echo "${number}" echo "${string}" 변수는 위와 같이 공백을 사용하지 않고 선언한다....
Linux 주요 커맨드와 옵션들
Linux 주요 커맨드와 옵션 커맨드 라인 단축키 ctrl + a: 커서를 라인 가장 앞으로 옮긴다. ctrl + e: 커서를 라인 가장 뒤로 옮긴다. ctrl + k: 커서를 기준으로 뒤쪽을 모두 지운다. 유틸리티 piping, redirect <COMMAND> | <COMMAND> |를 기준으로 앞 커맨드의 표준 출력을 뒷 커맨드의 표준 입력으로 사용한다. curl -s https://apigateway.dev1.meshdev.io/neogeo/management/info | jq <COMMAND> < <FILE> <COMMAND> > <FILE> <COMMAND> 1> <FILE> # 위 명령어와 같다. <COMMAND> 2> <FILE> # 커맨드의 에러 내용을 파일에 덮어 쓴다....