[Kubernetes] Networking (기본 개념, CNI, ...)

Xabi·2025년 9월 18일

kubernetes

목록 보기
19/20

네트워킹이란?

네트워킹은 여러 컴퓨터나 장치들이 서로 연결되어 데이터를 주고받는 것이다. 마치 전화망처럼 컴퓨터들이 서로 대화할 수 있게 해주는 시스템이다.

네트워킹 기본 개념들

1. IP 주소 (IP Address)

컴퓨터의 주소와 같습니다
예: 192.168.1.1, 127.0.0.1
인터넷에서 각 장치를 구분하는 고유한 번호

2. 포트 (Port)

컴퓨터 안의 문과 같습니다
예: 웹서버는 보통 80번 포트, HTTPS는 443번 포트
하나의 컴퓨터에서 여러 서비스를 구분할 때 사용

3. 프로토콜 (Protocol)

컴퓨터들이 대화할 때의 규칙
HTTP: 웹페이지를 주고받을 때
TCP: 안전하고 순서대로 데이터 전송
UDP: 빠르지만 데이터 손실 가능성 있음

4. 클라이언트와 서버

클라이언트: 요청하는 쪽 (웹브라우저, 앱)
서버: 응답하는 쪽 (웹서버, 데이터베이스)

5. 데이터 전송 과정 (간단하게)

1) 클라이언트가 서버에 요청
2) 서버가 요청을 처리
3) 서버가 클라이언트에 응답
4) 클라이언트가 응답을 받아서 처리

실생활 비유

  • IP 주소: 집 주소
  • 포트: 집의 각 방 번호
  • 프로토콜: 편지를 보내는 방식 (우편, 택배 등)
  • 클라이언트: 편지를 보내는 사람
  • 서버: 편지를 받는 사람

6. 스위칭(Switching)

스위칭은 네트워크에서 데이터를 전송할 때 올바른 목적지로 데이터를 전달하는 방법이다.

  • 네트워크에서 경로를 선택하여 데이터를 전송하는 기술
  • 여러 장치들이 연결된 네트워크에서 효율적으로 통신할 수 있게 해줌
  • 마치 교통 신호등이나 전화 교환대와 비슷한 역할

시스템 A에서 시스템 B로 도달하기 위해서, 두 시스템을 스위치에 연결하면 스위치가 두 시스템을 포함하는 네트워크를 생성하여 스위치에 연결한다.

시스템 A ---- 스위치 ---- 시스템 B
    |          |          |
  eth0       포트       eth0

eth0 인터페이스

eth0이란?

  • Ethernet 0의 줄임말
  • 리눅스/유닉스에서 첫 번째 이더넷 네트워크 인터페이스
  • 물리적 네트워크 카드와 연결되는 논리적 인터페이스
# eth0 상태 확인
ifconfig eth0

# 출력 예시
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>
      inet 192.168.1.100  # IP 주소
      ether aa:bb:cc:dd:ee:ff  # MAC 주소

eth0역할

  • IP 주소 할당 받음
  • MAC 주소를 가짐 (하드웨어 고유 주소)
  • 패킷 송수신의 출입구 역할

실제 통신 과정

  • 시스템 A → 시스템 B 통신
    • 시스템 A (eth0): 데이터를 스위치로 전송
    • 스위치: MAC 주소 테이블 확인
    • 스위치: 시스템 B가 연결된 포트로 전송
    • 시스템 B (eth0): 데이터 수신
시스템 A: IP 192.168.1.10, MAC aa:bb:cc:dd:ee:01
스위치: 192.168.1.0/24 네트워크 생성
시스템 B: IP 192.168.1.20, MAC aa:bb:cc:dd:ee:02

스위치는 단순히 물리적 연결을 제공하는 것이 아니라, 지능적인 네트워크 장비로서 효율적인 통신을 가능하게 한다.

7. 라우팅 (Routing)

한 네트워크의 시스템이 다른 네트워크의 시스템에 어떻게 연결할 수 있을까?
라우터는 두 개의 네트워크를 서로 연결하는 데 도움이 된다.

라우팅은 네트워크에서 데이터 패킷이 목적지까지 도달하는 최적 경로를 결정하는 과정이다.

  • 패킷이 출발지에서 목적지까지 가는 최적 경로 선택
  • 라우터가 네트워크 경로 정보를 바탕으로 결정
  • IP 주소를 기반으로 경로 판단

📍 라우팅 vs 스위칭 차이점

  • 스위칭 (Layer 2)
    • 같은 네트워크 내에서 동작
    • MAC 주소 기반 전송
    • 브로드캐스트 도메인 내에서만 작동
  • 라우팅 (Layer 3)
    • 서로 다른 네트워크 간 연결
    • IP 주소 기반 전송
    • 브로드캐스트 도메인을 분리

실제 통신 과정

  • 시스템 A: 목적지가 다른 네트워크임을 인식
  • 기본 게이트웨이로 패킷 전송
  • 라우터 1: 라우팅 테이블 확인 후 라우터 2로 전송
  • 라우터 2: 목적지 네트워크에 직접 연결되어 있음을 확인
  • 시스템 B: 패킷 수신
[시스템 A] ---- [라우터 1] ---- [라우터 2] ---- [시스템 B]
192.168.1.10     10.0.0.1       10.0.0.2      192.168.2.20

8. 게이트웨이 (Gateway)

시스템 B가 시스템 C로 패킷을 보내려고 할 때 라우터가 패킷을 전송할 네트워크의 위치를 어떻게 알 수 있을까?

라우터는 네트워크의 또 다른 장치일 뿐이다.
여기에서 게이트웨이 또는 라우터로 시스템 경로를 구성한다.
네트워크가 방이라면 게이트웨이는 외부 세계, 다른 네트워크 또는 인터넷으로 연결되는 문이다.
시스템은 그 문을 통과하기 위해 그 문이 어디에 있는지 알아야 한다.

게이트웨이란 서로 다른 네트워크 간의 연결점 역할을 한다.

  • 서로 다른 네트워크를 연결하는 장치 또는 소프트웨어
  • 프로토콜 변환 및 경로 제공 역할
  • 네트워크의 출입구(관문) 역할
[우리집] → [아파트 관리실] → [외부 도로] → [목적지]
   |           |              |
 로컬PC   기본게이트웨이(라우터)   인터넷
 
 -> 관리실을 통해야만 외부로 나갈 수 있음!
[PC: 192.168.1.100] ─┐
[스마트폰: 192.168.1.101] ─┤
[노트북: 192.168.1.102] ─┴─ [공유기: 192.168.1.1] ── 인터넷
                              ↑
                        기본 게이트웨이

통신 흐름

  • 애플리케이션: 외부 서버로 데이터 전송 요청
  • eth0: 로컬 네트워크가 아님을 확인
  • OS: 기본 게이트웨이(192.168.1.1)로 전송
  • 게이트웨이: 외부 네트워크로 패킷 전달

게이트웨이 덕분에 우리는 집안의 여러 장치들이 하나의 인터넷 연결을 통해 전 세계와 통신할 수 있다.

  • 게이트웨이는 네트워크의 출입구 역할
  • 기본 게이트웨이는 외부 통신의 필수 요소
  • 프로토콜 변환 및 보안 기능 제공 가능
  • 현대에는 소프트웨어 게이트웨이도 중요


리눅스 호스트를 라우터로 설정하는 법

패킷은 한 인터페이스에서 다음 인터페이스로 자동 전달되지 않아, ping 응답을 받지 못한다.

위 경로의 파일 값을 0에서 1로 변경해주면 ping 정상적 응답을 받을 수 있다.
단, 이 값은 재부팅 시 변경사항이 적용되지 않는다.
따라서 /etc/sysctl.conf 에 적용이 필요하다.


유용한 명령어

ip link
ip addr
ip addr add 192.168.1.10/24 dev eth0
ip route
route
ip route add 192.168.1.10/24 via 192.168.2.1
cat /proc/sys/net/ipv4/ip_forward

단, 재부팅 시 변경사항이 적용될 수 있게 /etc/sysctl.conf 에 적용 필요하다.

# 라우팅 테이블 전체 보기
ip route

# 특정 목적지로의 경로 확인
ip route get 8.8.8.8

# 라우팅 테이블을 자세히 보기
ip route show table all

# 특정 인터페이스의 라우트만 보기
ip route show dev eth0

쿠버네티스 네트워크

Ports

쿠버네티스 구성 시 아래와 같은 Port가 열려있어야 한다.
공식 문서에서 찾아볼 수 있다.
https://kubernetes.io/docs/reference/networking/ports-and-protocols/

🔍 포트 2379 vs 2380 비교

구분포트 2379포트 2380
용도Client APIPeer Communication
통신 대상클라이언트 ↔ etcdetcd ↔ etcd (클러스터 내부)
주요 기능데이터 읽기/쓰기클러스터 동기화, 리더 선출
접근 주체kube-apiserver, kubectl 등etcd 노드들끼리만

시스템의 모든 네트워크 인터페이스와 그 상태 정보를 보여주는 명령어
-> 네트워크 인터페이스 목록을 보여주는 리눅스 명령어

🔍 각 네트워크 인터페이스 상세 설명

1️⃣ lo (Loopback Interface)

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
  • 용도: 자기 자신과 통신하는 가상 인터페이스
  • IP 주소: 보통 127.0.0.1 (localhost)
  • 특징: 모든 리눅스 시스템에 기본으로 존재
  • 상태: UP (활성화됨)

2️⃣ eth0 (물리적 네트워크 인터페이스)

3: eth0@if40208: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc noqueue state UP mode DEFAULT group default
  • 용도: 외부 네트워크와 통신하는 주 네트워크 인터페이스
  • 특징: 실제 인터넷 연결을 담당
  • MAC 주소: e2:c7:f1:46:e1:65
  • MTU: 1410 (최대 전송 단위)

3️⃣ flannel.1 (Flannel CNI 인터페이스)

4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1360 qdisc noqueue state UNKNOWN mode DEFAULT group default
  • 용도: Kubernetes 클러스터 내 Pod 간 네트워크 통신
  • Flannel: Kubernetes의 네트워크 플러그인 중 하나
  • 기능: 서로 다른 노드의 Pod들이 통신할 수 있게 해줌

4️⃣ cni0 (CNI Bridge)

5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1360 qdisc noqueue state UP mode DEFAULT group default qlen 1000
  • 용도: Container Network Interface 브리지
  • 기능: 같은 노드 내의 Pod들을 연결하는 가상 스위치 역할
  • 특징: Pod들이 이 브리지를 통해 서로 통신

5️⃣ veth2ae6b68f (Virtual Ethernet - Pod 1)

6: veth2ae6b68f@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1360 qdisc noqueue master cni0 state UP mode DEFAULT group default qlen 1000
  • 용도: 첫 번째 Pod와 연결된 가상 이더넷 인터페이스
  • master cni0: cni0 브리지에 연결되어 있음
  • link-netns: 특정 Pod의 네트워크 네임스페이스와 연결

6️⃣ veth18c82c50 (Virtual Ethernet - Pod 2)

7: veth18c82c50@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1360 qdisc noqueue master cni0 state UP mode DEFAULT group default qlen 1000
  • 용도: 두 번째 Pod와 연결된 가상 이더넷 인터페이스
  • 구조: Pod 1과 동일한 구조

🏗️ 네트워크 구조 요약

인터넷 ↔ eth0 ↔ flannel.1 ↔ cni0 ↔ veth인터페이스들 ↔ Pod들
  1. 외부 통신: eth0를 통해 인터넷과 연결
  2. 클러스터 간 통신: flannel.1을 통해 다른 노드와 연결
  3. 노드 내 통신: cni0 브리지를 통해 같은 노드의 Pod들 연결
  4. Pod 연결: veth 인터페이스를 통해 각 Pod를 브리지에 연결

CNI bin dir 위치

/opt/cni/bin

쿠버네티스 클러스터에서 사용 중인 CNI 찾기
(CNI configuration file)

ls /etc/cni/net.d
profile
롱런하는 개발자!

0개의 댓글