전체 글
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..
MAC M1에서 EKS 배포 에러 (CPU ARM/AMD 문제)
개요 MAC M1에서 docker build한 image를 eks에 배포하려고 했을 때, pod내부의 container가 실행되지 못하고 CrashLoopBackOff 가 발생했습니다. local에서 docker run을 했을 때는 정상적으로 작동하던 container가 eks에 올릴 때는 에러가 뜨는게 이상했습니다. 위의 사진과 같이 pod log를 찍어보면 exec /bin/sh: exec format error 가 찍혔습니다. MAC M1는 arm기반 cpu이고, 일반적으로 amazonelinux OS를 사용하는 aws ec2는 amd이기 때문에 m1에서 빌드한 이미지를 ec2에서 사용하려면 --platform linux/amd64 옵션을 사용해야한다고 합니다. docker build -t jwt ..
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가 종료 전 데이터베이스와의 연결을 종료하고 트랜잭션을 완료하여 종료해야 하는 상황..
Kubernetes Component
Kubernetes Component 쿠버네티스 클러스터는 컨테이너화된 애플리케이션을 실행하는 노드라고 하는 워커 머신의 집합입니다. 이런 클러스터는 최소 한 개의 worker node 가 존재하고, 그 worker node는 애플리케이션의 구성요소인 pod를 호스트 합니다. control plan은 worker node 와 클러스터 내부의 pod를 관리합니다. 흔히 control plan을 master node라고 부릅니다. master node는 단일 또는 멀티 노드로 구동이 가능하지만 프로덕션 환경에서는 한대가 고장 나도 시스템의 중단 없이 계속 작동할 수 있도록 여러 대의 master node를 두고 운영합니다. 이때, master node의 개수는 정족수를 성립하기 위해서 홀수로 구성해야 합니다..
[EKS] ingress-nginx helm chart 에 AWS ACM 등록
개요 https://kubernetes.github.io/ingress-nginx/deploy/#aws 공식문서에서 deploy.yaml 을 다운받아서 acm 설정한 다음 kubectl apply -f deploy.yaml을 했을 때는 https 접속이 정상적으로 됐음 https://github.com/kubernetes/ingress-nginx 그런데 helm chart 로 설치를 했더니 "The plain HTTP request was sent to HTTPS port" 에러가 뜨면서 https 접속이 안됨 해결 방법 helm chart info repo: ingress-nginx repo url: https://kubernetes.github.io/ingress-nginx chart: ingress..
Argocd를 사용하여 helm chart 배포 및 주의사항
1. helm repo 사용 Application CRD # applications.yaml apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: tomcat namespace: argocd finalizers: - resources-finalizer.argocd.argoproj.io spec: project: apps source: repoURL: https://charts.bitnami.com/bitnami chart: tomcat targetRevision: "10.1.21" destination: namespace: tomcat server: "https://kubernetes.default.svc" syncPolicy: autom..
[EKS] eksctl create cluster yaml file 생성
사전 환경 VPC 1개 Private Subnet 2개 Public Subnet 에 IGW, NAT 생성 keypair 생성 클러스터 적용 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: eks-demo region: ap-northeast-2 version: "1.21" iam: withOIDC: true vpc: subnets: private: ap-northeast-2a: { id: subnet-xxxxxxxxxxxxxxxxx } ap-northeast-2c: { id: subnet-xxxxxxxxxxxxxxxxx } cs metadata 에 cluster 의..