쿠버네티스 클러스터 관련하여 다양한 테스트를 하다 보면 네트워크 대역이 다른 두 개의 클러스터가 필요할 때가 있다.단순히 파드나 서비스 대역이 다른 것이 아닌, 노드 대역을 다르게 설정하려면 Docker 컨테이너의 네트워크 대역이 달라야 한다.Docker 컨테이너 네트워크 생성green 클러스터를 위한 네트워크 브리지를 하나 생성한다.docker network create --subnet=172.18.0.0/16 green-net 이번에는 다른 클러스터를 위한 blue 네트워크 브리지를 생성한다.docker network create --subnet=172.19.0.0/16 blue-net 생성 후 확인하면 브리지 네트워크가 생성된 것을 볼 수 있다. green 클러스터 생성하기 환경변수를 이용하여 실..
Maglev는 Google에서 개발한 로드밸런싱 알고리즘으로, 백엔드 서버 간의 부하를 효율적으로 분산하는 역할을 합니다. 핵심 아이디어Maglev의 핵심 아이디어는 다음과 같습니다:소수 M 크기의 해시 테이블(슬롯)을 만든다.각 백엔드에 대해 “슬롯에 들어갈 순서”를 (offset, skip)으로 계산해시 테이블에 차례로 백엔드를 배정해 나가며, 슬롯이 이미 차 있으면 다음 순서로 건너뛴다. Maglev 동작 상세하게 살펴보기초기 설정 lb에 달려있는 백엔드가 이렇게 3개있고 이렇게 해시 테이블의 사이즈가 7일때 해시 알고리즘 2개를 이용해서 해시 테이블을 구성합니다. 오프셋 계산을 위한 해시 알고리즘 얼마만큼 건너뛸건지를 계산할 해시 알고리즘 이렇게 해서 다음과 같이 먼저 각각의 백엔드 값을 ..
cilium 설치하기 cilium install --version 1.17.1 -n kube-system \ --set kubeProxyReplacement=true \ --set k8sServiceHost=${API_SERVER_IP} \ --set k8sServicePort=${API_SERVER_PORT} \ --set hubble.enabled=true \ --set hubble.relay.enabled=true \ --set hubble.ui.enabled=true \ --set prometheus.enabled=true \ --set operator.prometheus.enabled=true \ --set hubble.metrics.enableOpenMetrics=true \ ..
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다. IPVS 모드IPVS 는 리눅스 커널에서 동작하는 소프트웨어 로드밸런서이다. 백엔드(플랫폼)으로 Netfilter 를 사용하며, TCP/UDP 요청을 처리 할 수 있다. PVS는 L4 계층에서 동작하며, 다양한 로드 밸런싱 알고리즘을 통해 서비스 요청을 여러 백엔드 서버로 분산시켜 트래픽을 효율적으로 관리합니다. 이를 통해 대규모 트래픽 환경에서도 안정적인 서비스를 제공하며, 고성능 로드 밸런싱을 필요로 하는 Kubernetes 클러스터에서 주로 사용됩니다. IPVS 모드는 커널 레벨에서 직접 작동하기 때문에 빠르고 확장성 있는 네트워크 트래픽 처리가 가능합니다. iptables 의 rule 기반 처리..
cilium에서는 egress gateway를 지원하는데 별도의 파드가 뜨는 방식이 아닌 노드를 egress 노드로 만들어서 해당 노드에 설정되어있는 아이피로 변환시키는 방법을 사용합니다. 한번 직접 테스트를 해보도록 하겠습니다. kind: ClusterapiVersion: kind.x-k8s.io/v1alpha4nodes:- role: control-plane- role: worker- role: worker- role: workernetworking: disableDefaultCNI: true # kind cni 설치 안하기 kubeProxyMode: "none" # kube-proxy 설치 안하게 하기 바로 kind로 클러스터 생성하고 cilium도 설치해 줍니다. API_SERVER=$(..
어느 날 잘 동작하던 nginx가 갑자기 DNS 리졸빙에 실패하면서 에러가 발생했습니다. nginx를 proxy로 사용하고 있었는데, 특정 서비스로 요청을 보내지 못하고 DNS를 해결하지 못하는 문제가 발생했습니다. 🚨 이슈nginx의 proxy_pass로 설정된 도메인으로의 요청이 갑자기 모두 실패하기 시작했습니다.could not be resolved (110: Operation timed out) 🔍 원인CoreDNS의 재시작이 문제의 원인이었습니다. CoreDNS가 재시작되었지만, nginx는 이전에 연결되어 있던 CoreDNS 정보를 계속 참조했습니다. 이로 인해 nginx는 UDP 통신을 통해 사라진 CoreDNS로 요청을 시도했고, 그 결과 conntrack 테이블에는 이미 삭제된 Cor..
Selective Service Node Exposure는 서비스를 생성하고 그 서비스를 통해 트래픽을 받을 수 있는 노드를 설정 할 수 있는 기능입니다. 1.17버전 부터 사용이 가능합니다. 아래의 그림에서 처럼 서비스의 annotations에 정의되어있는 service.cilium.io/node의 값과 같은 값을 갖고 있는 노드에서만 해당 서비스로 호출이 가능합니다. 서비스가 아닌 파드아이피로 직접 호출할 때에는 어디에서든지 통신이 가능합니다. 직접 테스트 해보기노드에 라벨을 붙이고 나면 cilium과 오퍼레이터를 재시작 해야하기 때문에 이번엔 클러스터 생성할 때 부터 라벨을 붙여보겠습니다.cat > labeled-cilium.yaml 라벨이 잘 들어가져있나 확인해봅니다. cilium을 설치합..
Proxy Protocol이란?Proxy Protocol은 로드 밸런서나 프록시 서버를 거쳐 백엔드 서버로 트래픽이 전달될 때, 클라이언트의 원래 IP 주소와 포트 정보를 보존하기 위해 사용되는 프로토콜이다. 일반적으로 로드 밸런서나 프록시 서버는 클라이언트의 원래 IP를 숨기고 자체 IP로 요청을 전달하기 때문에, 백엔드 서버는 클라이언트의 실제 IP 정보를 알 수 없게 된다. Proxy Protocol은 이러한 문제를 해결하기 위해 요청의 첫 부분에 클라이언트 IP 주소와 포트 정보를 포함시켜 전달한다. Proxy Protocol의 동작 방식Proxy Protocol은 v1과 v2 두 가지 버전이 있으며, 현재 두 버전 모두 사용되고 있다.v1: 텍스트 기반의 프로토콜로, 헤더 정보가 사람이 읽기 쉬..
Calico를 사용하는 환경에서 BIRD 프로세스에 문제가 발생하면 라우팅 정보가 제대로 전달되지 않아 네트워크 성능 저하나 장애가 발생할 수 있다. 이러한 상황을 진단하기 위해 BIRD 프로세스의 상태를 분석하는 것이 중요한데, 이를 위해 SIGUSR1 신호를 보내면 BIRD의 상세 상태와 라우팅 테이블 정보를 덤프할 수 있다. 이 글에서는 호스트에서 컨테이너 내부의 BIRD 프로세스에 SIGUSR1 신호를 보내는 방법을 단계별로 설명한다. 호스트에서 BIRD 프로세스 찾기우선 호스트에서 pidof 명령어를 사용해 BIRD 프로세스의 PID를 찾는다.pidof bird 이렇게 하면 호스트에서 BIRD 프로세스의 PID를 얻을 수 있다. 컨테이너 내부의 PID 찾기다음으로, 해당 PID를 사용하여 /pr..
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다. 서비스에는 로드밸런스 타입과 다르게 수동으로 외부 IP를 할당하여 노출시킬 수 있는 방법이 있습니다. 외부 IP는 쿠버네티스 클러스터에서 IP 할당을 관리하지 않습니다. 직접 테스트해보기kind를 통해 여러 개의 노드로 구성된 클러스터를 생성하고, 가상의 IP를 하나 생성하여 연결해보겠습니다. 이제 pod와 서비스를 각각 생성하겠습니다.# 파드 생성하기 kubectl run nginx --image=nginx:latest# 서비스 생성하기kubectl expose pod nginx --port 80 이렇게 생성하면 ClusterIP로 설정되기 때문에 여기에 external IP를 추가해보겠습니다.ex..
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다. LoadBalancer 란NodePort는 각 노드의 특정 포트를 통해 외부 트래픽을 전달합니다. 이 방식의 장점은 클러스터 외부에서 접근이 가능하다는 점이지만, 고정된 IP가 없고 포트 범위에 제약이 있어 대규모 서비스나 고가용성이 필요한 경우 한계가 있습니다. 반면, LoadBalancer는 클라우드 환경에서 자동으로 로드밸런서를 생성해 고정된 외부 IP를 제공합니다. 이를 통해 여러 파드에 트래픽을 효율적으로 분산할 수 있습니다. 그러나 이 방식을 사용하려면 클라우드 프로바이더와의 연동이 필요합니다. 클라우드 환경에서는 이 연동이 자동화되어 매우 편리하지만, 온프레미스 환경이나 특정 네트워크 구성..
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다. NodePort는 Kubernetes에서 외부 트래픽을 클러스터 내부의 특정 서비스로 전달할 수 있게 해주는 가장 간단한 방법 중 하나입니다. 클러스터의 각 노드에 특정 포트(기본 30000-32767)를 열어 외부 네트워크에서 노드의 IP와 포트를 통해 서비스에 접근할 수 있도록 해주며, 이를 통해 클러스터 외부에서도 서비스를 사용할 수 있습니다. 이번 글에서는 NodePort를 생성하는 방법과 함께 NodePort가 내부적으로 어떻게 동작하는지 자세히 살펴보겠습니다. 클러스터 정보 쿠버네티스 버전: 1.31pod cidr: 10.10.0.0/16service. cidr: 10.200.1.0/24ku..
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다. 파드는 고유한 IP를 가지지만 재시작할 때마다 IP가 변경되기 때문에 파드에 안정적으로 접근하는 것이 쉽지 않습니다. 이를 해결하기 위해 쿠버네티스는 여러 파드를 하나의 로드밸런서로 묶어주는 "서비스"라는 객체를 제공합니다. 서비스는 세 가지 타입이 있으며, 클러스터 내부에서만 접근 가능한 Cluster IP, 노드의 IP와 포트를 통해 외부에서 접근할 수 있는 NodePort, 그리고 외부 로드밸런서와 함께 사용되는 LoadBalancer가 있습니다. 이 중에서 Cluster IP는 클러스터 내부에서 파드 간의 통신을 원활하게 하기 위한 가장 기본적인 형태의 서비스 타입입니다. 파드가 가상 인터페..
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다. Calico는 BGP를 활용해 네트워크 토폴로지를 관리하고, 각 노드 간 경로 정보를 효율적으로 교환합니다. 이를 통해 클러스터 내 노드가 자동으로 라우팅 정보를 갱신하고, 네트워크 확장 시 복잡한 설정 없이도 트래픽 흐름을 최적화할 수 있습니다. 특히 라우트 리플렉터 기능을 사용하면, 전체 네트워크의 피어링 수를 줄여 트래픽 부하를 줄이고 성능을 향상시킬 수 있습니다. Full Mesh (✰ Node-to-Node 기본 설정)Node-to-Node 메시 설정은 Calico에서 기본적으로 모든 노드가 서로 직접 BGP 피어링을 맺어 경로 정보를 교환하는 방식입니다. 이 설정은 클러스터 내의 모든 노드들..
어느 날부턴가 calico-node가 간헐적으로 NotReady 상태로 전환되는 이상한 현상이 발생했다. 처음에는 단순히 한 노드에서만 나타났고, 서비스에 큰 문제가 없어 "뭐지?" 하고 넘겼다. 그런데 시간이 지나니 다른 노드들까지 하나둘씩 NotReady 상태로 변해버렸다. 마치 퍼지는 전염병처럼 말이다! 🚨 이슈알고 보니 calico-node에서 동작하는 BIRD 프로세스의 CPU 사용률이 점점 높아지면서, readinessProbe에 설정된 calico-node -bird-ready 명령어의 응답이 느려지고 있었다. 그 결과로 노드의 상태는 하나둘씩 NotReady로 전환되는 일이 벌어진 것이다. 🔍 원인https://github.com/projectcalico/bird/pull/104 ne..
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다. 마지막으로 오버레이 네트워크를 사용하지 않는 Direct 모드에 대해서 알아보고자 합니다. Direct 모드란calico에서는 파드에서 만들어진 패킷을 별도의 캡슐화 없이 목적지 노드로 전달하는 모드입니다. Direct모드 설치하기Instance의 출발지 목적지 확인하는 기능 비활성화# AWS CLI 로 특정 인스턴스의 Source/Destination Check 기능을 Disable 하기aws ec2 modify-instance-attribute --instance-id --source-dest-check "{\"Value\": false}" 인스턴스가 테스트에 사용할 kubernetes 인스턴..
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다. 이번 포스트에서는 CNI 중에서 네트워크 정책 기능을 제공하는 Calico에 대해 알아보겠습니다. Calico 컴포넌트 데이터 저장소Kubernetes API Datastore는 Calico에서 네트워크 설정 정보를 Kubernetes API와 통합해 저장하는 방식입니다. 이 방식에서는 설정 정보를 Kubernetes API를 통해 관리하며, 설정 데이터는 ConfigMap이나 Custom Resource Definition(CRD) 형태로 저장됩니다. 직접적으로 Kubernetes API의 데이터베이스에 접근하지 않고, Kubernetes의 표준 API를 통해 네트워크 설정을 관리합니다. 별도의 추..
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다. 시작하기 전: 쿠버네티스 네트워킹쿠버네티스 네트워크 모델은 4가지 요구사항과 4가지 문제를 해결해야 합니다. ✰ 요구사항파드와 파드간 통신시 NAT 없이 통신이 가능합니다.노드의 에이전트(kubelet, systemd)는 파드와 통신이 가능합니다.호스트 네트워크를 사용하는 파드는 NAT없이 파드와 통신이 가능합니다.서비스 클러스터 IP대역과 파드가 사용하는 IP대역은 중복되지 않아야 합니다. ✰ 문제 점파드 내 컨테이너는 루프백을 통한 통신을 할 수 있습니다.파드 간 통신을 할 수 있습니다.클러스터 내부에서 서비스를 통한 통신을 할 수 있습니다.클러스터 외부에서 서비스를 통한 통신을 할 수 있습니다...
저는 kind(v0.24.0)와 orbstack 사용합니다. cilium-cli 설치하기$ brew install cilium-cli$ cilium versioncilium-cli: v0.16.16 compiled with go1.23.0 on darwin/arm64cilium image (default): v1.16.0cilium image (stable): v1.16.1cilium image (running): unknown. Unable to obtain cilium version. Reason: release: not found kind를 이용하여 마스터 노드1대 워커노드 2대의 쿠버네티스 클러스터를 생성합니다. cilium은 systemd cgroup 드라이버 사용을 권장하기 때문에 cgrou..