쿠버네티스 01. 리눅스와 컨테이너
3주 과정, 하루 1시간

쿠버네티스 01. 리눅스와 컨테이너

쿠버네티스가 결국 조종하는 리눅스 프로세스, 네트워크, 네임스페이스, cgroups, 이미지를 손으로 직접 만들고 망가뜨려 봅니다. 위에서부터 하나씩 체크하세요.

다음 할 일

…

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

공부하는 방법

매일 1시간몰아서 8시간보다 매일 1시간이 오래 남습니다. 과제마다 예상 시간이 적혀 있습니다.
읽기 20%, 손 80%개념을 읽었으면 바로 WSL 터미널에서 ps, ip, cat /proc, docker 로 눈으로 확인합니다.
일부러 부수기설정을 틀리게 바꾸고, 에러 메시지만 보고 원인을 찾습니다.
소리 내 설명하기단계 끝의 자가 점검에 답을 보지 않고 말해 봅니다. 막히면 그 과제로 돌아갑니다.
맥북에서 실습하기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에서만 됩니다.

처음 보는 용어

PID 1PID 네임스페이스에서 첫 번째로 실행된 프로세스입니다. 핸들러 없는 시그널이 전달되지 않고, 고아 프로세스를 입양해 거둬야 하는 특별한 책임이 있습니다.
SIGTERM, SIGKILLSIGTERM(15)은 정리하고 끝내라는 요청이라 프로그램이 잡을 수 있고, SIGKILL(9)은 커널이 즉시 끝내는 강제 종료라 잡을 수 없습니다.
종료 코드 137128 + 9, 즉 SIGKILL로 끝났다는 뜻입니다. 메모리 초과(OOM)나 유예 시간 초과 후 강제 종료에서 나옵니다.
systemd, journald리눅스의 PID 1로 서비스를 시작하고 되살리는 관리자와, 그 로그를 모아 journalctl로 보여 주는 기록 담당입니다. kubelet과 containerd도 systemd 서비스입니다.
UID, GID사용자와 그룹의 숫자 번호입니다. 컨테이너와 쿠버네티스는 이름이 아니라 이 숫자로 파일 권한을 판단합니다.
CIDR10.244.0.0/16 처럼 IP 대역을 적는 방법입니다. / 뒤 숫자는 고정된 앞자리 비트 수라 작을수록 대역이 큽니다.
iptables, netfilter리눅스 커널의 패킷 검사 기능(netfilter)에 규칙을 넣는 도구입니다. 차단과 허용(filter), 주소 바꾸기(nat)를 하며 kube-proxy와 도커가 사용합니다.
DNAT들어오는 패킷의 목적지 주소를 바꾸는 것입니다. 도커의 포트 공개와 쿠버네티스 Service가 이 방식으로 실제 컨테이너에 연결합니다.
TCP 3단계 연결SYN, SYN-ACK, ACK 세 번을 주고받아 연결을 여는 과정입니다. 여기서 막히는 위치로 refused와 timeout이 갈립니다.
TLS 인증서서버의 신분증입니다. 믿을 만한 CA가 서명해야 하고, 이름과 만료일이 맞아야 연결이 성립합니다.
리눅스 네임스페이스프로세스가 볼 수 있는 범위(프로세스 목록, 네트워크, 마운트, 호스트 이름 등)를 나누는 커널 기능입니다. 쿠버네티스 Namespace와는 다른 개념입니다.
cgroups v2프로세스 묶음이 쓰는 CPU, 메모리, 프로세스 수를 제한하고 측정하는 커널 기능입니다. /sys/fs/cgroup 아래 파일로 다룹니다.
veth양 끝이 이어진 가상 랜선 한 쌍입니다. 한쪽은 컨테이너 네트워크 네임스페이스, 다른 쪽은 호스트에 두어 연결합니다.
overlayfs읽기 전용 아래층과 쓰기용 위층을 겹쳐 하나처럼 보여 주는 파일시스템입니다. 이미지 레이어와 컨테이너 쓰기 층의 바탕입니다.
OCI컨테이너 이미지 형식, 실행 방법, 레지스트리 API를 정한 업계 표준입니다. 덕분에 도커로 만든 이미지를 containerd에서 그대로 실행합니다.
containerd, runccontainerd는 이미지와 컨테이너 수명을 관리하는 데몬이고, runc는 OCI 설정대로 네임스페이스와 cgroup을 만들어 프로세스를 실행하는 저수준 런타임입니다.
CRIkubelet이 컨테이너 런타임과 대화하는 gRPC 규격입니다. containerd와 CRI-O가 구현하며, 도커는 구현하지 않아 dockershim이 필요했습니다.
dockershimkubelet 안에 있던 도커용 번역 코드로, v1.24에서 제거되었습니다. 제거 뒤에도 도커로 만든 이미지는 그대로 씁니다.
다이제스트이미지 내용으로 계산한 sha256 지문입니다. 태그와 달리 절대 바뀌지 않아 배포 이미지를 고정할 때 씁니다.
좀비 프로세스끝났지만 부모가 종료 상태를 거두지 않아 프로세스 표에 남은 항목입니다. PID 1이 거두지 않으면 쌓여서 PID 한도를 소모합니다.

계속 쓰게 될 자료