쿠버네티스 일반/Network 9

EKS 네트워크 아키텍처 현황

쿠버네티스 공식 문서 기반으로 네트워킹 및 로드 밸런싱을 스터디하고 있습니다. 관련해서 현재 사용 현황을 정리해 보았습니다. Amazon EKS 네트워크 아키텍처를 고민하는 분들께 도움이 되었으면 합니다.EKS VPC CNIEKS 사용하면 당연히(?) VPC CNI를 사용합니다.장점파드와 노드의 IP 대역이 동일하여 다른 노드의 파드와 통신 시 NAT 등의 추가 과정없이 바로 통신 가능합니다.주의사항파드 네트워크 대역을 /24가 아닌 /20 등으로 넓게 할당합니다. EKS 업그레이드 등 작업 시 IP가 부족한 경우가 발생할 수 있습니다.당연히 Private Subnet 대역에 파드 배포합니다.EKS ALB와 LB Controller장점target-type: ip 옵션을 사용하여 네트워크 홉 수를 줄일 수..

Karpenter CoreDNS on Spot Instance 장애

이번 포스트에서는 최근에 발생한 CoreDNS 장애 관련 내용을 공유합니다. 당연한 것들인데 새롭게 배운 것들이 많습니다. Karpenter, CoreDNS 사용하는 분들에게 참고가 되었으면 합니다. 장애 현상일부 파드에서 DNS 조회 실패(dns resolve fail) 현상이 발생하였습니다.장애 원인Karpenter 설정에서 노드 그룹을 On-Demand와 Spot 두 가지로 운영하고 있었지만, interruptionQueue 설정이 누락되어 있었습니다. interruptionQueue 설정이 없으면 Spot 노드 종료 시 실행하고 있는 파드가 Graceful Shutdown하게 기존 세션을 종료하고 정상 종료되지 않아 해당 노드에 실행 중인 CoreDNS 파드 등에 문제가 발생합니다. 장애 조치1...

EKS External DNS - Terraform IRSA + Helm

TL; DR; . IRSA(by 테라폼) + 헬름으로 External DNS 설치 경험을 공유합니다. . eksctl도 가능하지만 테라폼을 이용하여 IRSA를 설치하면 코드(IaC)로 남아서 좀 더 관리가 용이합니다. 1. External DNS IRSA 테라폼으로 EKS 관련 모듈(ebs-csi-controller, aws load balancer controller)을 IRSA + 헬름까지 설치할 수 있습니다. 하지만 테라폼으로 헬름까지 설치하는 것은 테라폼 State가 맞지 않는 경우 디버깅을 해야 하는 위험 + 번거로움이 있어 개인적으로는 테라폼은 IRSA까지만 설치하는 것을 선호합니다. AWS 관련 리소스(IAM, VPC 등)는 테라폼으로 쿠버네티스 애플리케이션은 헬름 + ArgoCD로 설치, ..

gRPC in EKS ALB + aws lb controller

TL; DR; . grpc는 nlb + ingress-nginx-controller 설정으로 에러가 발생하여 alb + aws load balancer controller로 해결하였다. . ingress로 설정한 alb는 특이하게 path를 '/'가 아닌 '/*'로 지정해야 한다. 작업 내역 기존 REST 방식이 아닌 gprc는 nlb + ingress-nginx-controller로 설정하면 에러가 발생하였다. ### SERVER SIDE ingress-nginx-controller-6997b74f67-fgbb7 controller 10.0.197.170 - - [15/Jun/2023:05:11:33 +0000] "PRI * HTTP/2.0" 400 150 "-" "-" 0 0.003 [] [] - -..

AWS NLB EKS 환경에서 사용자 IP 파드로 전달

사용자의 IP를 파드까지 정상적으로 전달하도록 작업한 내역을 공유한다. TL;DR AWS NLB는 L4 기반이라 L7 Application LB의 x-forwarded-for 설정없이 client-ip 전달이 가능 하지만 쿠버네티스의 Proxy 구조 상 외부 LB에서 받은 트래픽이 전체 클러스터의 노드를 거쳐서 파드로 전달되기 때문에 파드에는 client ip가 아닌 노드 IP가 기록됨 externalTrafficPolicy을 Local로 변경하면 노드 IP가 아닌 client ip 전달 가능. 하지만 설정을 변경하면 전체 클러스터의 노드가 아닌 ingress controller가 설치된 노드에서만 트래픽을 전달하여 ingress controller가 설치된 노드(통상 이중화를 위한 2개의 노드)만 트래..

Tailscale VPN for 쿠버네티스 & VPC

최근에 EKS, AWS VPC 환경에서 Tailscale VPN을 잘 사용하고 있어 내용을 공유한다. TL;DR Tailscale VPN을 1) EKS 환경에서 LoadBalancer, Ingress 등을 추가 설정하지 않고 ClusterIP 타입 그대로 VPN을 사용하는 사용자에게 외부 노출 2) EC2 사용하는 VPC의 전체 네트워크를 Tailscale VPN으로 연결 EC2 VM이 아닌 쿠버네티스 파드로 실행할 수 있어 EC2 VM 비용을 절감할 수 있다. 추가로 Deployment로 실행하면 파드 다운 시 자동 실행되니 관리 포인트도 줄어든다. ClusterIP는 YAML 파일에서 ClusterIP를 고정할 수 있어, 서비스를 재시작해도 IP가 변경되지 않는다. 쿠버네티스 DNS 이름을 그대로 사..

Kubernetes Ingress-NGINX on EKS

이직하고 EKS에 ingress-nginx 설정한 내용들 정리합니다. 1. Ingress-nginx on EKS 설정 내용 헬름 파일 이용 설치 LB 타입으로 CLB가 아닌 NLB 사용 AWS 인증서 적용 - 헬름 배포 시 변수 파일로 지정하여 설치 시 자동으로 적용되도록 AWS LB에서 TLS Termination 처리 설정 : NLB가 TLS 처리하고 이 후 백엔드는 Https to Http로 전달 443 port 남기고 default 80 port는 삭제 Default 헬름 차트 변수 파일(values.yaml) 수정 내역 서비스 annotations 수정 annotations: service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp ..

쿠버네티스 칼리코 네트워크

오늘은 쿠버네티스 칼리코(calico) CNI에 관하여 정리한다. 가시다님 네트워크 스터디 3주차 예습 내용이다. 1) 같은 노드 내 파드 - 파드 통신 2) 파드와 외부 인터넷 통신 3) 다른 노드의 파드와 파드 통신 내용 실습한 걸 정리하였다. 가시다님, 3주차 스터디 실습 환경은 아래와 같다. 3대의 컨트롤 플레인 + 워커 노드 + 1대의 워커 노드. 쿠버 버전 1.22.4, CRI containerd. [spkr@erdia22 ~ (ubun81:default)]$ kgn # k get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME ubun20-81 R..

sniff - kubectl 환경 패킷 캡쳐 유틸리디

가시다님 스터디에서 ‘stewart’ 님이 공유해 주신 파드 패깃덤프 플러그인 sniff 사용 예제를 공유한다. sniff 사용하면 파드에 접속해서 tcpdump 명령어 실행하지 않아도 로컬PC에서 kubectl 명령어로 원격 파드의 패킷 덤프를 바로 실행할 수 있다. 패킷덤프는 그동안 귀찮아서 네트워크 엔지니어에게 미루었는데 내가 해보게 되고 여러모로 도움이 되는 스터디다. sniff 참고 https://github.com/eldadru/ksniff GitHub - eldadru/ksniff: Kubectl plugin to ease sniffing on kubernetes pods using tcpdump and wireshark Kubectl plugin to ease sniffing on kube..