k8s
Kubernetes Deprecated API Version Check 방법 (클러스터 버전 업그레이드 사전 작업)
개요Kubernetes Version을 업그레이드하기 전에 현재 사용 중인 API Version이 Deprecated 되지 않는지 확인해야 한다.Deprecated 된다면 클러스터를 업그레이드 하기 전에 해당 워크로드를 업그레이드해야 한다. 1. 공식 문서 확인Deprecation Guide 확인https://kubernetes.io/docs/reference/using-api/deprecation-guide/ Deprecated API Migration GuideAs the Kubernetes API evolves, APIs are periodically reorganized or upgraded. When APIs evolve, the old API is deprecated ..
Kubernetes QoS(Qualitu Of Service)와 Pod Eviction의 상관 관계
QoS(Qualitu Of Service) 클래스 타입 Kubernetes는 노드에 리소스가 부족할 때 Pod의 우선순위에 따라서 Pod를 Eviction 한다. 이때 Pod의 우선순위는 QoS 클래스 타입에 따라 정해진다. QoS 클래스 타입에는 아래 3가지가 있다. Guaranteed: Resources 항목에서 Request와 Limit의 값이 완전히 동일한 경우 Burstable: Guaranteed, BestEffort에 속하지 않는 모든 경우 ( e.g. Resources 항목에서 Limit이 Request보다 클 경우) BestEffort: Resources 항목을 아예 사용하지 않을 경우 노드에 리소스가 부족해지면 우선순위가 가장 낮은 Pod나 프로세스가 먼저 종료된다. 우선순위는 Guar..
[EKS] Karpenter + KEDA를 사용해서 특정 시간에 Auto Scaling 하는 방법
개요 Karpenter + KEDA를 사용해서 이벤트 시간 전에 Node Scale Out 하고 일정 시간 지난 후 Scale In 되도록 테스트를 해보겠습니다. Karpenter가 Node를 프로비저닝 할 때 1~2분 정도 시간이 걸립니다. 이벤트 시간 전에 특정 개수의 노드 여유분을 확정적으로 늘려놓고 싶을 때 사용합니다. 아래 영상을 보고 내용을 정리했습니다. https://www.youtube.com/watch?v=FPlCVVrCD64 Karpenter 사용 팁 Karpenter는 CA와 마찬가지로 Pod Request를 기준으로 노드를 증설하기 때문에 사용량 최대치를 Request로 잡거나 Limit과 차이를 적게 하는 것을 추천한다. 노드 타입을 작은 것으로 정의하는 것이 항상 유리한 것은 아..
[EKS] Karpenter - Groupless Node AutoScaling 사용법
K8S Auto Scaling Pod 기반 Kubernetes Event-driven Autoscaling - 이벤트 기반 파드 오토스케일링을 지원합니다. Horizontal Pod Autoscaler - 필요에 따라 배포에 더 많은 파드를 추가하거나 제거합니다. Vertical Pod Autoscaler - 파드의 CPU 및 메모리 요청 크기를 조정하고 부하에 맞게 제한합니다. Node 기반 Karpenter (현재는 AWS EKS만 가능) Cluster Autoscaler Karpenter 개요 Karpenter는 AWS로 구축된 유연한 오픈 소스의 고성능 Kubernetes 클러스터 오토스케일러입니다. 애플리케이션 로드의 변화에 대응하여 적절한 크기의 컴퓨팅 리소스를 신속하게 실행함으로써 애플리케이..
K8S에서 Kong API Gateway 사용하기
개요 Kong Ingress Controller는 k8s 리소스를 kong 리소스로 변환시키는 역할을 합니다. 아래 그림처럼 K8S Ingress는 Kong Route로 매핑이 되는데, 이를 이용하여 Express 어플리케이션을 Kong API Gateway을 사용해서 외부로 노출 시키겠습니다. 참고: https://docs.konghq.com/kubernetes-ingress-controller/latest/concepts/design/#translation pod, service 확인 Express 어플리케이션의 pod, service를 올렸습니다. port-forward 어플리케이션 화면을 확인하기 위해 포트 포워딩을 하겠습니다. $ kubectl port-forward svc/web 3000:30..
K8S에 Kong API Gateway 설치 하는 방법 (Helm Charts)
helm charts (v2.8.2) https://github.com/Kong/charts values.yaml 커스터마이징 - 원본 values로 설치하면 에러가 많이 나서 커스터마이징을 했습니다. - Postgres subcharts 설치 --- deployment: kong: enabled: true serviceAccount: create: true env: nginx_worker_processes: "2" anonymous_reports: "off" database: "postgres" admin: enabled: true type: NodePort annotations: {} http: enabled: true tls: enabled: true parameters: [] proxy: enab..
Secret Manager를 사용해서 K8S Secret 관리하기
개요 kubernetes secrets은 단순 base64 인코딩 된 값이기 때문에 기밀성을 보장하지 않습니다. 그렇기 때문에 보안을 향상하기 위해서 Secret Manager를 사용했습니다. 대표적으로 AWS Secret Manager는 데이터베이스 자격증명, API 키, 토큰 값 등 민감한 정보를 AWS KMS키로 암호화하여 저장하는 관리형 서비스입니다. Secret Manager에 존재하는 데이터를 kubernetes secrets으로 연동할 수 있는 도구는 대표적으로 External Secret operator(ESO), Kubernetes Secrets Store CSI Driver(SSCSID)두 가지가 있습니다. 두 가지의 차이점과 비교한 것들을 정리하겠습니다. Secret Manager 목..
[EKS] Kubernetes Ingress 설치 및 옵션 정리
개요AWS EKS 환경에서 ELB를 사용해야 할 때 aws-load-balancer-controller를 설치해야 한다.추가로 ingress-nginx-controller도 많이 사용한다.각각에 대한 사용 용도, 설치 및 사용 방법, 옵션을 정리한다.두 개의 컨트롤러는 모두 헬름 차트로 설치한다. 사전 구성: 서브넷 자동 검색 (옵션)https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/deploy/subnet_discovery/ aws-load-balancer-controller사용 용도Kubernetes Cluster에서 AWS ELB를 사용/관리하기 위해서 필요하다. ALB를 설치하기 위해서는 Kubernet..
[k8s] Resource + Autoscaler (CA, HPA) 개념 정리
Resource 파드를 지정할 때, 컨테이너에 필요한 각 리소스의 양을 선택적으로 지정한다. 지정할 가장 일반적인 리소스는 CPU와 Memory가 있다. Requests and Limits Requests 스케줄러에서 Pod를 어떤 노드에 위치시킬 판단 근거가 된다. Pod가 Request량을 초과 하여 사용해도 Limit량을 넘지 않으면 문제는 없다. 다만 Node의 자원이 부족할 경우에는 Request량을 초과 한 Pod는 퇴거(Eviction)의 대상이 된다. CA, HPA에서 Pod를 확장 또는 축소시킬 기준 값이 된다. Limits Pod는 limit이상의 자원을 사용할 수 없다. 컨테이너의 프로세스가 허용된 양보다 많은 메모리를 사용하려고 하면, 시스템 커널은 메모리 부족(out of memo..
[k8s] Graceful Shutdown을 위한 preStop, terminationGracePeriodSeconds 설정
Graceful Shutdown (우아한 종료) 이란? 현재 들어온 요청을 모두 수행하고 우아하게 종료된다는 개념이다. 수행 중이던 요청을 미처 처리하지 못하고 종료되면 리소스가 서버에 좀비처럼 남아있거나 데이터 손실을 일으킬 수 있다. kube-proxy나 Ingress controller 등은 엔드포인트 변경에 대해 알림을 받기까지 다소 시간이 걸립니다. 따라서 트래픽은 종료된 것으로 표시가 되어도 여전히 포드(Pod)로 트래픽이 흐를 수 있습니다. 앱은 새로운 요청 수락을 중지되고 모든 연결이 종료되면 종료돼야 합니다. 이를 위해서 앱 spec에서 'lifecycle.preStop'을 설정하는 것을 고려합니다. Pod가 종료 전 데이터베이스와의 연결을 종료하고 트랜잭션을 완료하여 종료해야 하는 상황..