쿠버네티스 05. 네트워킹
3주 과정, 하루 2시간

쿠버네티스 05. 네트워킹

Pod IP가 어디서 오고, Service 가상 IP가 어떻게 실제 Pod로 바뀌고, 이름이 어떻게 IP가 되고, 밖의 요청이 어떻게 들어오는지 노드 안까지 들어가서 확인합니다. 위에서부터 하나씩 체크하세요.

다음 할 일

…

실습 방법 보기
전체 진행0 / 0
진행 상황: 이 브라우저에 저장

공부하는 방법

매일 1시간몰아서 8시간보다 매일 1시간이 오래 남습니다. 과제마다 예상 시간이 적혀 있습니다.
읽기 20%, 손 80%개념을 읽었으면 바로 kind 노드 안에서 ip, iptables, crictl로 눈으로 확인합니다.
일부러 부수기설정을 틀리게 바꾸고, 에러 메시지만 보고 원인을 찾습니다.
소리 내 설명하기단계 끝의 자가 점검에 답을 보지 않고 말해 봅니다. 막히면 그 과제로 돌아갑니다.
맥북에서 실습하기Windows에서 한다면 건너뛰세요

맥에서는 Ubuntu 가상 머신(VM)을 하나 띄워 그 안에서 실습합니다. 그러면 이 사이트의 명령을 Windows(WSL)와 똑같이 쓸 수 있습니다. 사이트에 "WSL Ubuntu 터미널"이라고 나오면 "VM 터미널"로 읽으세요.

  1. Homebrew 설치 (맥용 설치 관리자)회사 맥이면 설치 전에 IT팀 승인을 확인하세요.
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  2. Ubuntu 가상 머신 만들고 들어가기Multipass는 무료입니다. 이 VM이 Windows의 WSL 역할을 합니다.
    brew install --cask multipass                                  # 가상 머신 관리 도구 설치
    multipass launch --name ubuntu --cpus 2 --memory 4G --disk 20G  # Ubuntu VM 만들기 (쿠버네티스는 --memory 8G 권장)
    multipass shell ubuntu                                          # VM 터미널로 들어가기
    # 여기서부터 사이트의 "WSL Ubuntu 터미널" 명령을 그대로 실행
  3. 맥 브라우저에서 VM 안의 서비스 열기WSL과 달리 localhost가 자동으로 연결되지 않습니다.
    multipass info ubuntu | grep IPv4  # VM의 IP 확인 (예: 192.168.64.5)
    # 브라우저에서 localhost 대신 http://<VM IP>:<포트> 로 접속
    # kubectl port-forward 는 --address 0.0.0.0 을 붙여야 맥에서 열림
  4. 끝나면 정리VM은 켜 두면 맥의 메모리를 계속 씁니다.
    multipass stop ubuntu            # VM 끄기 (내용은 남음)
    multipass start ubuntu           # 다시 켜기
    multipass delete --purge ubuntu  # 완전히 삭제

kind 클러스터와 Docker는 VM 안에서 설치하고 만듭니다. 멀티 노드 실습은 VM 메모리를 8G 이상으로 주세요.

WSL 설치, PowerShell 명령건너뜁니다. 위 2번 VM이 대신합니다.
Apple Silicon(M1 이후) 맥VM에서 uname -m이 aarch64면 다운로드 주소의 amd64를 arm64로 바꿉니다. arm64 버전이 없는 이미지는 exec format error가 날 수 있습니다.
Docker Desktop맥도 큰 회사는 유료입니다. VM 안의 Docker Engine을 쓰고, 맥에서 직접 쓰려면 무료인 Colima를 씁니다.
파일 주고받기multipass transfer 파일 ubuntu: 또는 multipass mount ~/study ubuntu:/home/ubuntu/study
브라우저로 열기localhost 대신 VM IP를 씁니다 (위 3번).

VM 없이 맥에서 바로 하고 싶다면 brew install kubectl kind helm colima docker 로 도구를 깔 수 있습니다. 단, 리눅스 내부(namespace, cgroup, systemd, iptables)를 들여다보는 실습은 VM에서만 됩니다.

처음 보는 용어

네트워크 네임스페이스리눅스가 인터페이스, IP, 라우팅 표를 따로 갖게 나눈 공간입니다. Pod 하나가 네임스페이스 하나를 씁니다.
veth pair양 끝이 이어진 가상 랜선입니다. 한쪽은 Pod 안 eth0, 다른 쪽은 노드에 있어 Pod와 노드를 잇습니다.
브리지(bridge)노드 안의 가상 스위치입니다. 브리지 방식 CNI는 같은 노드 Pod들의 veth를 여기에 꽂아 서로 잇습니다.
CNI컨테이너 네트워크 표준 규약입니다. 런타임이 설정 파일을 읽고 플러그인 실행 파일을 ADD, DEL로 불러 Pod 네트워크를 만들고 지웁니다.
IPAMIP 주소 관리 담당 플러그인입니다. 어느 IP를 어느 Pod에 줄지 정하고 기록합니다(host-local 등).
podCIDR노드 하나가 Pod에 나눠 줄 수 있는 IP 대역입니다. controller-manager가 클러스터 대역을 잘라 노드마다 기록합니다.
overlay(VXLAN)노드 사이에서 Pod 패킷을 노드 IP 패킷 안에 한 번 더 포장해 보내는 방식입니다. 바탕 네트워크가 Pod 대역을 몰라도 됩니다.
eBPF커널 안에서 안전하게 돌아가는 작은 프로그램입니다. Cilium은 이것으로 패킷 전달, 로드밸런싱, 정책을 처리합니다.
ClusterIPService에 붙는 가상 IP입니다. 어떤 인터페이스에도 없고 kube-proxy 규칙 안에만 존재합니다.
kube-proxy노드마다 도는 에이전트로, Service와 EndpointSlice를 watch해 iptables, nftables, IPVS 규칙을 만듭니다.
EndpointSliceService 뒤 준비된 Pod IP와 포트, 상태(ready, serving, terminating)를 적은 명단입니다.
DNAT, SNAT(masquerade)DNAT는 목적지 주소를, SNAT는 출발지 주소를 바꾸는 것입니다. Service는 DNAT, 노드를 건너 돌아오는 길 맞추기는 SNAT입니다.
externalTrafficPolicy외부에서 들어온 트래픽을 클러스터 전체 Pod로 보낼지(Cluster), 받은 노드의 Pod로만 보내 출발지 IP를 지킬지(Local) 정하는 설정입니다.
headless ServiceclusterIP: None 인 Service입니다. 가상 IP 없이 DNS가 Pod IP 목록을 직접 돌려줍니다.
ExternalNameDNS CNAME만 돌려주는 Service입니다. 클러스터 밖 이름에 사내 별명을 붙일 때 씁니다.
CoreDNS클러스터 DNS 서버입니다. Service와 Pod 이름에 답하고 나머지는 바깥 DNS로 넘깁니다.
ndots이름에 점이 이 개수보다 적으면 search 도메인부터 붙여 보는 기준입니다. 쿠버네티스 기본은 5입니다.
Gateway APIIngress 뒤를 잇는 외부 트래픽 표준 API입니다. GatewayClass, Gateway, HTTPRoute로 역할을 나눕니다.
NetworkPolicyPod 레이블, 네임스페이스, IP 대역 기준으로 들어오고 나가는 연결을 허용하는 규칙입니다. 실제 차단은 CNI가 합니다.
hairpinPod가 자기 Service로 요청했는데 자기 자신에게 돌아오는 경우입니다. 출발지 SNAT이 필요해 주소가 바뀌어 보입니다.

계속 쓰게 될 자료