
AWS EKS 를 통해 클러스터를 구축하면 Data Plane (이하 Node) 를 다양한 방식으로 구축할 수 있습니다. Managed Node Group, Fargate 그리고 이러한 리소스를 유연하게 관리할 수 있게 해주는 AWS Auto Scaling, Karpenter 가 있습니다. 이번 글에서는 Karpenter 를 통해 AWS Auto Scaling 보다 유연하게 Node 를 관리하는 방법을 알아보고자 합니다. 겉핥기 시리즈에 맞게 개념보다는 실행 방법에 대해 알아보겠습니다. (개념이 궁금하다면 여기 참고) 우선 간단하게 알아보도록 하죠. 렛츠두더코드! Karpenter 가 뭐죠? 여기서 말하는 노드 == 인스턴스 == 서버 는 모두 같은 개념입니다. Karpenter 를 알아보기 전에 AW..

파이썬에는 정말 유용한 함수가 많습니다. 그 중 Counter 는 제가 생각하기에 가장 유용한 함수 중에 하나라고 생각합니다. 이번 글에서는 Collections 모듈 중 하나인 Counter 함수에 대해서 알아보고 2019 카카오 겨울 인턴쉽 튜플 에 바로 적용해보겠습니다. 그럼 렛츠두더코드! Collections 의 Counter() Counter 는 리스트나 문자열의 갯수를 dict 타입으로 반환해주는 함수입니다. 말로 백번 설명하는 것보다 한번의 예제가 보는 것이 더 좋겠죠? Counter(["I", "am", "Iron", "man", "!", "!"]) # Counter({'!': 2, 'I': 1, 'am': 1, 'Iron': 1, 'man': 1}) Counter(["I", "am", "..

누구나 한번 쯤은 슈뢰딩거의 고양이에 대해서 들었거나 관련 밈을 보셨을 겁니다. 그래도 혹시 모르시는 분들을 위해 간단히 알려드리죠. 고양이를 보이지 않는 상자에 넣고, 그 속에 50:50 확률로 고양이를 죽이는 독극물을 넣었을 때 고양이는 죽을까요? 살까요? 일반 세계에서는 죽었다, 살았다 라고 표현하지만 양자역학 세계에서는 이를 죽음과 삶이 중첩된 상태라고 표현합니다. 즉, 살아있으면서 죽어있다 라고 합니다. 오늘 글에서 소개할 Fargate (파게이트) 또한 슈뢰딩거의 고양이와 비슷한 개념입니다. (나만 그렇게 생각할수도..) Fargate 는 무엇일까? 우리는 보통 AWS 를 이용해서 애플리케이션을 배포한다고 하면 EC2 를 통해 인스턴스를 생성하고, 그 인스턴스 내부에 컨테이너나 직접 프로세스로..

파이썬에서 문자열을 처리하는 방법은 여러가지가 있죠. 그 중 정규표현식을 이용하면 좀 더 다양하고 쉽게 처리를 할 수 있습니다. 그래서 이번 글에서는 파이썬에서 유용한 모듈 중 정규식을 처리해주는 re 모듈을 이용해서 문자열을 처리하는 방법에 대해 알아보려고 합니다. 그리고 가장 마지막엔 배운걸 토대로 카카오 문제인 [3차] 파일명 정렬에 적용해보려고 합니다. 그럼 렛츠두더코드! re 모듈의 함수들 re 모듈에는 다양한 함수들이 존재합니다. 그 중 알고리즘 풀이에 유용할 것 같은 함수들에 대해 알아보겠습니다. search match fullmatch findall finditer sub subn split search() 문자열에서 패턴이 일치하는 지 확인합니다. print(re.search("A", "..

Action Controller Runner (이하 ARC) 는 파드 단위 Self Hosted Runner 입니다. 즉, 쿠버네티스 환경에서 파드를 Self Hosted Runner 로 지정할 수 있게 해주는 오픈소스죠. ARC 에 대한 정보는 여기를 확인해주세요. 근데 ARC 를 사용하는 경우 하나 고려해야 할 사항이 있습니다. 바로 ARC 에 의해 만들어지는 파드는 Github Action 의 Job 이 종료될 경우 제거되고 다시 생성됩니다. 따라서 HostPath 나 EFS 를 사용하지 않으면 Job 을 실행할 때 생성했던 Java SDK, Node, Build File 등 또한 같이 삭제됩니다. 그 말은 즉슨, caching 을 할 수 없으며, 매번 필드할 때 마다 새롭게 패키지를 설치하기 때문..

퍼블릭 클라우드 환경에서 쿠버네티스를 운영할 때 온프로미스보다 편한 점 중 하나가 바로 볼륨 관리 라고 생각합니다. EBS CSI Driver 를 설치 후 Storage Class, PV 그리고 PVC 를 통해 쉽게 AWS EBS 를 통해 볼륨을 언제 어디서든 가져다 쓸 수 있죠. 한편, 쿠버네티스에선 다양한 방법으로 볼륨을 사용할 수 있는데요. 컨테이너간 공유를 가능케 해주는 EmptyDir, 노드의 볼륨을 통해 파드간 공유를 가능케 해주는 HostPath, NFS 서버를 사용하는 NFS 기능 등이 있습니다. 그라파나를 노드에 배포할 때, 그라파나의 설정 파일은 그라파나가 배포된 노드의 볼륨에 저장이 됩니다. 따라서 만약 그라파나 파드가 다른 노드에 배포가 될 경우 이전에 가지고 있던 그라파나 설정을 ..

그동안 퍼블릭 클라우드를 이용해서 쿠버네티스 클러스터 환경을 구축했습니다. 문제없이 잘 사용하고 있었지만, 역시나 문제는 비용이였습니다. 마스터 노드, 워커 노드 총 2대만 띄어놓아도 족히 달에 5만원 이상은 나왔죠 😢 playground 를 사용한다해도 속도가 느리고 아무래도 휘발성이다 보니 불편함이 많았습니다. 그래서 결국 쿠버네티스 클러스터를 구성할 PC 를 하나 장만해야겠다 생각을 했고, A to Z 까지 구성을 해보고 싶어 PC 또한 부품별로 구매하여 조립하고자 했습니다. 어떤 부품들이 있을까? 부품은 아래와 같습니다. AMD Ryzen 5700G 16core ASRock DeskMini X300 베어본 삼성 PM9A1 M.2 NVMe SSD 1TB 삼성 DDR4 PC-25600 32G 노트북용..

쿠버네티스 환경에선 Action Controller Runner (이하 ARC) 를 이용해서 파드를 Self Hosted Runner 로 사용할 수 있습니다. ARC 구조는 위와 같습니다. Self Hosted Runner 로 사용할 파드를 RunnerDeployment 또는 RunnerSet 으로 배포할 수 있죠. RunnerDeployment 는 쿠버네티스에서 Deployment 와 동일하게 동작하고, RunnerSet 은 StatefulSet 과 동일하게 동작합니다. 또한 배포하게 되면 파드 안에 2가지 컨테이너 동작하게 되는데, 하나는 Github Action Job 을 처리하는 Runner 컨테이너, 또 하나는 Docker 관련 일을 처리하는 Docker 컨테이너입니다. 옵션을 통해 Runner..

Istio 는 흔히 K8S 클러스터 내에서 서비스 메시 역할을 해줍니다. 서비스 메시 뿐만 아니라 Nginx Ingress, ELB Ingress 처럼 Ingress 역할 또한 해줍니다. Istio Ingress Gateway 가 정식 명칭이나 쉽게 Istio Ingress 로 지칭하도록 하죠 🤟 EKS 와 같은 퍼블릭 클라우드를 이용해서 Load Balancer Service 를 생성해주면 자동으로 CLB 가 할당됩니다. 따라서 Istio Ingress 또한 CLB 로 할당이 됩니다. CLB 는 앞으로 AWS 에서 deprecated 되기 때문에 Network Load Balancer(이하 NLB) 나 Application Load Balancer(이하 ALB) 로 대체되어야 합니다. 그래서 이번 글에..

Nginx 기반의 Pod 내에서 S3 와 Mount 하기 위해 goofys 를 사용했던 적이 있습니다. (goofys 말고 EBS 나 EFS 도 위시리스트에 있었지만, goofys 가 가장 적합하다고 판단하여 goofys 를 사용하게 되었습니다) 그림으로 표현하자면 아래와 같죠. Nginx 가 provisioning 될 때 ConfigMap 으로 init.sh 를 주어 goofys 를 마운트 한 후 실행되도록 했습니다. 이런식으로 말이죠. #!/usr/bin/env sh set -eu wget https://github.com/kahing/goofys/releases/latest/download/goofys chmod +x goofys /goofys /var/nginx ... nginx -g 'daemo..

쿠버네티스는 다른 플랫폼처럼 인증(Authentication)/인가(Athorization) 를 제공해줍니다. 따라서 인증받지 못한 사용자라면 401 (UnAuthorized) 를 응답 받고, 인증은 되었지만 권한이 없다면 403(Forbidden) 응답을 받게 되죠. 아주 평범한 인증/인가 프로세스입니다. 그런데 인증/인가가 완료되었다고쿠버네티스 환경에 바로 적용할 순 있는 건 아닙니다. 사용자가 보낸 요청을 적용하기 직전 한 군데를 더 들립니다. 그것이 바로 Adimission Controller 입니다. 이번 글에서는 Adimission Controller 에 대한 개념을 간단하게 설명하고, Adimission Controller 를 구현해볼 생각입니다. 😎 Admission Controller 가..

Iptables 를 알아보기 전에 먼저 Netfilter 에 대해 알아보죠 ! Netfilter 와 Iptables AWS EC2 인스턴스를 생성할 때 Security Group 이라는 것을 설정합니다. 이름 그대로 외부로 들어오는 트래픽을 조절할 수 있게 해주는 방화벽 기능이죠. EC2 인스턴스 앞단에 이를 처리해주는 아마 물리적인 기계가 있어서 어떤 트래픽은 허용하고, 어떤 트래픽은 거부하겠죠. Security Group 이 하드웨어 방화벽 이라면 Netfilter 는 소프트웨어 방화벽이라고 생각하면 이해하기 쉽습니다. Netfilter 는 다음과 같은 특징이 있습니다. 소프트웨어 방화벽 패킷 필터링 리눅스 커널 내부의 프레임워크 포트 주소, 변환, 포트 포워딩 및 패킷 변경 라우팅 전후에 데이터 및..

테라폼은 Code 로 인프라를 구축할 수 있게 도와주는 IaC Tool 입니다. 특히 AWS 인프라를 구축할 때 참 유용하게 사용할 수 있죠. module 을 제공해주기 때문에 어렵지 않게 VPC, EKS, ELB 를 생성하고 코드를 관리 할 수 있습니다. 이번 글에서는 테라폼을 이용해 EKS 를 구축하는 과정에서 겪은 문제점과 이를 해결했던 방법에 대해 이야기 해볼까 합니다. 우선 Apply!! terraform-aws-eks 에 가보면 아주 친절하게 테라폼을 이용해 EKS 를 구축할 수 있는 방법에 대해 알려줍니다. 무작정 eks 모듈을 import 하고 example 과 EKS Best Practices Guides 참고하여 테라폼 코드를 작성했습니다. provider "kubernetes" { h..

왜 Helm 을 사용하나요? Helm 이 무엇인지 알아보기 전에 왜 필요한지 먼저 알아보죠 ! 🧐 Consistency 쿠버네티스에 리소스를 배포하려면 아래 이미지처럼 yaml 로 작성해주어야합니다. yaml 이 1,2 개라면 관리가 어렵지 않겠지만 10개 정도만 되도 관리하기가 매우 힘들고 불편해집니다. 또한 kubectl edit을 통해 쿠버네티스의 리소스를 업데이트 해줄 수 있는데, 여러 개발자가 관리를 하게 된다면 일관성(Consistency) 문제가 발생할 수 있습니다. Revision History 어떠한 애플리케이션이 Deploy, ConfigMap, Service, Ingress yaml 로 배포된다고 가정해보죠. 이때 ConfigMap 과 Service 가 업데이트 되어서 yaml 이 변..

EFS (Elastic File System) 은 AWS 의 파일 시스템 서비스입니다. EBS, S3 처럼 데이터를 저장할 수 있습니다. 하지만 각각 쓰임의 목적이 다르기 때문에 자신의 목적에 맞게 잘 사용하여야 합니다. EFS S3 EBS 사용 케이스 프라이빗 이미지 레지스트리 엔터프라이즈급 데이터 백업 웹 서비스 및 컨텐츠 EC2 의 부팅 볼륨 그리고 AWS DataSync 를 이용하면 저장소의 데이터들을 다른 곳으로 옮길 수 있습니다. 같은 VPC 내 저장소는 물론 다른 VPC, 교차 계정 모두 가능합니다. ✅ 다른 VPC, 교차 계정은 서로의 VPC 가 Peering 되거나 TGW 로 sharing 된 상태여야 합니다 자세한 동작 방식은 확인하려며 여기를 눌러주세요 그럼 간단하게 한번 DataSy..

쿠버네티스를 공부하면서 처음 User Account 와 Service Account 를 접했을 때 단순히 쿠버네티스 API 서버에게 자격 증명하는 리소스인가보다 하고 넘어갔던 적이 있습니다. 이해가 안되서 그냥 넘어갔던.. 그래서 User Account 랑 Service Account 는 비슷한거 !! 같은 거 !! 라는 생각을 가지고 있었죠.. 하지만 이 둘은 분명 다릅니다. 쿠버네티스에는 쿠버네티스 내에 존재하는 자원에 대한 접근을 위한 2가지의 account 타입이 존재합니다. User Account Service Account 쿠버네티스 공식 문서에는 이와 같이 나와있습니다. 사용자 어카운트는 사람을 위한 것이다. 서비스 어카운트는 파드에서 실행되는 프로세스를 위한 것이다. 100% 맞는 말이지만..

🔗 eksctl 깃헙 🔗 eksctl 공식 문서 🔗 eksctl config file example eksctl 설치 curl --silent --location "(uname -s)_arm64.tar.gz" | tar xz -C /tmp sudo mv /tmp/eksctl /usr/local/bin eksctl version EKS 구성 eks 는 아마존의 쿠버네티스 서비스이며, eksctl 은 eks 를 쉽게 구성할 수 있도록 도와주는 커맨드 툴 eksctl 공식 문서는 굉장히 친절한 편이라고 생각 💡 eksctl 은 EKS 를 위한 커맨트 툴이므로 aws configure 가 된 상태여야 함 aws 로그인 aws configure 1. Using Config Files (가장 기본) apiVersi..

S3는 퍼블릭 액세스 차단 기능을 이용하여 버킷 내 객체에 대한 접근을 제한 할 수 있습니다. 퍼블릭 액세스 차단을 활성화 하게 되면 자원을 안전하게 보호할 수 있지만, 외부에서 접근이 불가능해 s3 객체에 접근할 수 없습니다. 따라서 S3는 퍼블릭 액세스 차단을 하면서 외부에서 접근할 수 방법을 제공해주는데, 그 방법에 대해 알아보고자 합니다. Pre-Signed-URL 을 이용하여 S3 객체 업로드(PUT)/다운로드(GET) 하기 Pre-Signed-URL 을 이용하여 S3 객체 업로드(PUT)를 진행하고, 다운로드는 서버를 프록시로 두어 서버에서 S3에 접근하여 다운로드(GET)하기 Pre-Signed-URL 을 이용하여 S3 객체 업로드(PUT)를 진행하고, 다운로드는 goofys를 사용하여 S3..

이 글의 내용은 [이펙티브 코틀린]을 참고합니다. 때로는 데이터를 한꺼번에 전달해야 할 때가 있습니다. 아래 코드처럼 말이죠. data class Player( val id: Int, val name: String, val points: Int ) val player = Player(0, "Gecko", 9999) data 한정자는 아래의 함수들을 자동으로 생성해줍니다. toString equals 와 hashCode copy componentN(component1, component2 등) toString 클래스의 이름과 기본 생성자 형태로 모든 프로퍼티와 값을 출력 해줍니다. 주로 로그 출력이나 디버깅 할때 사용합니다. println(player) // Player(id=0, name=Gecko, p..

이어서 계속 구현해보겠습니다. 구현 자체가 목적이므로 자세한 설명을 생략합니다. JWT 생성하기 JWT에 권한 추가해주기 생성한 JWT에 대해 인증/인가 하기 JWT 재발급 해주기 (진행) 구현 AuthController @RestController @RequestMapping("/auth") class AuthController( private val authService: AuthService ) { /** * token 생성해서 보내주기 */ @GetMapping("/login") fun login(@AuthenticationPrincipal oAuth2User: OAuth2User): ResponseEntity { return ResponseEntity.ok(authService.login(oAu..

이어서 계속 구현해보겠습니다. 구현 자체가 목적이므로 자세한 설명을 생략합니다. JWT 생성하기 JWT에 권한 추가해주기 생성한 JWT에 대해 인증/인가 하기 (진행) JWT 재발급 해주기 구현 JwtFilter class JwtFilter( private val jwtProvider: JwtProvider ) : OncePerRequestFilter() { override fun doFilterInternal( request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain ) { val jwt = jwtProvider.resolveToken(request) if (StringUtils.hasText(jwt) && ..

이어서 계속 구현해보겠습니다. 구현 자체가 목적이므로 자세한 설명을 생략합니다. JWT 생성하기 JWT에 권한 추가해주기 (진행) 생성한 JWT에 대해 인증/인가 하기 JWT 재발급 해주기 구현 @Component class JwtProvider( private val memberRepository: MemberRepository ) { companion object { private const val AUTHORITIES_KEY = "auth" private const val BEARER_TYPE = "bearer" private const val ACCESS_TOKEN_EXPIRE_TIME = (1000 * 60 * 30) private const val REFRESH_TOKEN_EXPIRE_TIME..

이번 글에서는 Spring Security + Google Oauth2 + JWT를 구현해보겠습니다. 구현 자체가 목적이므로 자세한 설명을 생략합니다. 진행하기 앞서 Google Oauth2 Client_ID, Client_Secret는 개인적으로 받으시길 바랍니다 :) 아래와 같은 순서로 진행됩니다. JWT 생성하기 (진행) JWT에 권한 추가해주기 생성한 JWT에 대해 인증/인가 하기 JWT 재발급 해주기 이번 글에서는 JWT 생성하는 부분에 대해 진행합니다. 구현 build.gradle.kts import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("org.springframework.boot") version "2.6.8" id("..

재사용을 위한 과도한 유연성 다양한 타입에 동일한 로직을 적용하기 위해 코드 재사용을 과도하게 하려는 경우가 있습니다. 파라미터를 전부 Any로 받는 것이 대표적인 예시입니다. open class Car class K3 : Car() class Avante : Car() //“차에 대한 설명서” 함수 fun getInstruction(car: Array) { println("car = ${car.size}") } 많이 극단적인 예제이기는 합니다.. open class Fruit class Apple : Fruit() fun main() { val k3 = K3("k3", "기아") val avante = Avante("아반떼", "현대") val fruits: Array = arrayOf(Apple())..

지난 포스팅에서는 OCP와 DIP가 위배 되는 경우에 대해서 알아보았습니다. 이번에는 스프링이 아닌 순수 자바로 해결해보겠습니다. 잠깐 지난 글의 클래스 다이어그램을 살펴보겠습니다. public class DriverImpl implements Driver{ Car car = new K3(); Engine engine = new Electronic(); @Override public void findOwnCarDetail() { car.findCarName(); car.findCarBrand(); engine.WayToMove(); } } DriverImpl 역할에 구현체가 직접 new 키워드로 선언 되어 있습니다. 이럴 경우 얼핏보면 OCP와 DIP를 잘 지킨 것 같지만 사실 아니라고 지난 포스팅에서 ..

바늘과 실처럼 자바하면 바로 떠오르는 것이 있습니다. 바로 "객체 지향 언어" 라는 것입니다. "객체 지향"이란 레고라고 생각할 수 있습니다. 레고 블록들을 조립하여 우리는 무엇이든 만들 수 있습니다. 레고를 이용해서 동물원을 만들었다고 생각해보겠습니다. 동물원에는 레고로 만들어진 사자도 있고, 호랑이도 있고, 코끼리도 있고, 제가 좋아하는 판다도 있습니다. 하지만 슬프게도 더 이상 호랑이가 인기가 없어서 고릴라 레고로 바꾸고 싶습니다. 이럴 경우 우리는 쉽게 동물원에서 호랑이 레고를 빼고 고릴라 레고를 넣어주면 됩니다. 여기서 호랑이, 고릴라가 객체가 되는 것입니다. 호랑이를 뺀 다고 해서 기존에 있던 사자나 판다 레고는 전혀 영향이 없습니다. 만약 라이거 레고를 만들고 싶다고, 호랑이와 사자를 마구잡..

새해 목표 중 하나였던 'CKA Cer 취득'을 달성하면서 순조롭게 새해를 시작하네요 CKA를 어떻게 준비하고 어떻게 취득을 했는지에 대해 간단하게 설명해보려고 합니다! 설명하면서 그때 그때 Tip에 대해서도 설명합니다 목차 CKA란? CKA 접수 방법 CKA 공부 방법 CKA 실제 시험 응시 CKA 취득 후기 Tips CKA란? 요약하자면 CKA(Certified Kubernetes Administrator)는 Kubernetes 관리자로서 K8S를 수행할 수 있는 기술, 지식 및 역량을 갖추고 있음을 보증하는 자격증입니다. 리눅스 파운데이션에서 발급해주며 CKAD, CKA, CKS로 등급이 나뉩니다. 3개는 각각 별도의 시험이며 CKAD(쉬움), CKA(보통), CKS(어려움)으로 보시면 됩니다. 또..

도커 허브에 올라온 공식 MySql 컨테이너를 실행하면 언제 어디서든 아주 쉽게 동일한 MySql 환경을 구축할 수 있습니다. MySql 컨테이너는 8 버전으로 진행했습니다. 공식 도커 허브에 나와있는 설명대로 하면 1분도 안되서 MySql 환경을 누구나 만들 수 있습니다. 하지만 단순히 아래와 같은 명령어로 컨테이너를 만들면 안되고 볼륨도 마운트 해야하고 MySql에서의 시간, 시스템 환경 변수 등도 설정해주어야 합니다. $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 그 중 이번 글에서 sql-mode 라는 MySql에서 사용되는 시스템 변수에 대해 알아보겠습니다. sql-mode란? MySql에 저장될 데..

NFS란 무엇인가요? 공유된 원격 호스트의 파일을 로컬에서 사용할 수 있도록 개발된 파일 시스템을 네트워크 파일 시스템(Network File System, NFS)이라고 합니다. 전통적인 유닉스 환경에서는 오랫동안 네트워크에서 자료를 공유하는 방법으로 NFS를 사용했습니다. NFS 서버가 파일을 공유하면 NFS 클라이언트가 공유한 디렉터리를 마운트해서 원격 호스트(NFS 서버)의 파일을 사용합니다. NFS는 손쉽게 파일을 공유할 수 있다는 장점이 있지만 보안에 취약하다는 단점이 있습니다. NFS로 공유한 파일에는 일반적인 소유권과 접근 권한이 그대로 적용됩니다. 원격 시스템에서 어떤 사용자가 파일 소유자와 같은 UID로 공유 디렉터리에 접근해서 파일을 마음대로 사용할 수 있습니다. 루트 권한이 부여된 ..

설명은 필요없고 결론만 알고 싶은 분들을 위한 $ sed "$(grep -n 'image:' nginx.yaml | grep -Eo '^[^:]+')s/nginx:1.0/nginx:2.0/g" nginx.yaml 본문의 기능이 필요한 상황 예시 위 이미지는 개발자가 코드를 커밋한 후 자동으로 k8s cluster에 배포되기 까지의 과정을 파이프라인으로 도식화한 이미지입니다. 개발자가 운영 중인 서비스에 새로운 기능을 추가하거나 버그를 수정 했다고 가정해봅시다. 그렇게 될 경우 GitOpsRepo의 있는 컨테이너 이미지의 버전 또한 바꿔주어야 합니다. 그렇게 될 경우 젠킨스에서 GitOps Repo에 push를 할 때 새롭게 만든 컨테이너 이미지의 버전으로 수정해줘야 합니다. 그래야 argoCD에서 git..