Linux 기초
지원 버전: 검토한 예제 환경: Ubuntu 24.04 LTS, Debian 13, Amazon Linux 2023; 패키지/서비스 이름은 배포판별로 다름 마지막 업데이트: 2026년 9월 15일
Kubernetes와 컨테이너 기술을 이해하기 위해서는 Linux에 대한 기본적인 이해가 필수적입니다. 이 문서에서는 Kubernetes 환경에서 특히 중요한 Linux의 핵심 개념들을 다룹니다.
터미널과 네트워크를 처음 배운다면 처음부터 배우는 Linux 네트워크의 1장부터 진행하세요. 이 문서는 이후 컨테이너·커널 개념을 찾아보는 심화 참고 자료로도 사용할 수 있습니다.
실습 환경 설정
이 문서의 예제를 따라하기 위해서는 다음과 같은 환경이 필요합니다:
필수 환경
- Linux 운영체제 (Ubuntu 24.04 LTS, Debian 13 또는 Amazon Linux 2023 권장)
- 터미널 액세스
- sudo 권한
클라우드 환경 설정 (선택 사항)
격리된 실습 VM을 사용합니다. AWS에서는 리전/아키텍처에 맞는 AL2023을 선택하며 고정 AMI ID는 다른 리전에서 재사용할 수 없습니다. AWS는 AL2 표준 지원이 2026-06-30 종료되었다고 안내합니다. 아래는 AMI 조회만 수행하므로 인스턴스 생성과 제한된 접근 경로를 별도로 준비한 후 기존 인스턴스에 접속합니다.
# Read-only AMI discovery; select a kernel-specific parameter when reproducibility is required.
aws ssm get-parameter --region us-east-1 \
--name /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64 \
--query Parameter.Value --output text
# SSH 접속
ssh -i your-key.pem ec2-user@your-instance-public-ip로컬 환경 설정 (선택 사항)
로컬 환경에서 실습하려면 다음 중 하나를 사용할 수 있습니다:
- VirtualBox + Vagrant: 가상 머신 환경 구성
- WSL2: Windows에서 Linux 환경 사용
- Docker: 기본 셸 실습에 적합하지만 일반 컨테이너에는 전체 systemd 호스트나 호스트 네트워크/커널 변경 권한이 없음
목차
- Linux 커널과 사용자 공간
- 프로세스 관리
- 네임스페이스
- cgroups (Control Groups)
- 파일 시스템
- 네트워킹 기초
- 보안 컨텍스트
- systemd와 서비스 관리
- 커널 파라미터와 모듈
- 시스템 리소스 제한
- 로그 관리
- DNS와 네트워크 설정
- 시간 동기화
- 패키지 관리
- 주요 Linux 명령어
- 컨테이너 관련 Linux 기능
Linux 커널과 사용자 공간
커널의 역할
핵심 개념: Linux 커널은 운영체제의 핵심으로, 하드웨어와 소프트웨어 사이의 중개자 역할을 합니다.
Linux 커널은 운영체제의 핵심으로, 하드웨어와 소프트웨어 사이의 중개자 역할을 합니다. 주요 기능은 다음과 같습니다:
- 프로세스 관리: 프로세스 생성, 스케줄링, 종료
- 메모리 관리: 가상 메모리, 물리적 메모리 할당
- 장치 관리: 하드웨어 장치와의 통신
- 시스템 호출 인터페이스: 사용자 공간 프로그램이 커널 서비스에 접근할 수 있는 방법 제공
사용자 공간
사용자 공간은 일반 응용 프로그램이 실행되는 메모리 영역입니다. 사용자 공간 프로그램은 시스템 호출을 통해 커널 서비스에 접근합니다.
시스템 호출 예시
| 시스템 호출 | 설명 | 관련 명령어 |
|---|---|---|
fork() | 새 프로세스 생성 | ps, top |
exec() | 프로그램 실행 | bash, sh |
open() | 파일 열기 | cat, less |
read() | 파일에서 데이터 읽기 | cat, grep |
write() | 파일에 데이터 쓰기 | echo, tee |
socket() | 네트워크 소켓 생성 | netstat, ss |
clone() | 태스크 생성 및 플래그에 따른 새 네임스페이스 | unshare, docker |
리눅스 커널 아키텍처
프로세스 관리
프로세스와 스레드
- 프로세스: 실행 중인 프로그램의 인스턴스로, 독립된 메모리 공간을 가짐
- 스레드: 프로세스 내에서 실행되는 작업 단위로, 같은 프로세스의 스레드들은 메모리 공간을 공유
프로세스 상태
- 실행(Running): CPU에서 실행 중
- 대기(Waiting): I/O 완료 또는 이벤트 발생 대기
- 준비(Ready): 실행 가능하지만 CPU 할당 대기
- 좀비(Zombie): 종료되었지만 부모 프로세스가 상태를 확인하지 않은 상태
- 중단(Stopped): 일시 중지된 상태
주요 프로세스 관리 명령어
# 프로세스 목록 확인
ps aux
# 실시간 프로세스 모니터링
top
# 더 향상된 실시간 프로세스 모니터링
htop
# 프로세스 종료
kill <PID>
killall <프로세스명>
# 백그라운드 실행
command &
# 작업 관리
jobs
fg %<작업번호>
bg %<작업번호>네임스페이스
네임스페이스는 Linux 커널의 기능으로, 프로세스 그룹을 격리하여 각 그룹이 시스템 자원을 독립적으로 볼 수 있게 합니다. 이는 컨테이너 기술의 핵심 요소입니다.
주요 네임스페이스 유형
- PID 네임스페이스: 프로세스 ID 격리, 컨테이너가 자체 PID 1(init)을 가질 수 있게 함
- 네트워크 네임스페이스: 네트워크 스택 격리 (인터페이스, IP 주소, 라우팅 테이블, 방화벽 등), 컨테이너 네트워킹의 기반
- 마운트 네임스페이스: 마운트 테이블을 격리하며 실제 파일 내용/루트 격리는 별도 마운트와 루트 구성 필요
- UTS 네임스페이스: 호스트명과 NIS 도메인명 격리(DNS 도메인은 아님), 각 컨테이너에 고유한 호스트 식별자 부여
- IPC 네임스페이스: 프로세스 간 통신 자원 격리 (공유 메모리, 세마포어, 메시지 큐 등), 마이크로서비스 아키텍처에서 서비스 간 격리에 중요
- 사용자 네임스페이스: 사용자 및 그룹 ID 격리, 루트리스(rootless) 컨테이너 실행 지원으로 보안 강화
- cgroup 네임스페이스: cgroup 루트 디렉토리 격리, 컨테이너 내부에서 리소스 제한 가시성 제공
- 시간 네임스페이스: CLOCK_MONOTONIC/CLOCK_BOOTTIME 오프셋 격리 (Linux 5.6+); 실제 날짜/시각 CLOCK_REALTIME은 격리하지 않음
네임스페이스 관련 명령어
# 프로세스의 네임스페이스 확인
ls -la /proc/<PID>/ns/
# 새로운 네임스페이스에서 명령 실행
sudo unshare --mount --net --pid --fork --mount-proc bash
# 기존 프로세스의 네임스페이스에 진입
sudo nsenter --target <PID> --net --pid bash
# 네트워크 네임스페이스 생성 및 관리
ip netns add <name>
ip netns exec <name> <command>
# 루트리스(rootless) 컨테이너 실행을 위한 사용자 네임스페이스 활용
unshare --user --map-root-user --mount --net bash
# 시간 네임스페이스 사용 (Linux 5.6+)
sudo unshare --time --fork bashcgroups (Control Groups)
cgroups는 프로세스 그룹의 자원 사용을 제한하고 격리하는 Linux 커널 기능입니다. 컨테이너의 자원 제한을 구현하는 데 사용됩니다. 클라우드 네이티브 환경과 Kubernetes에서 리소스 관리의 핵심 기술입니다.
cgroups의 주요 기능
- CPU 시간 제한: 프로세스 그룹이 사용할 수 있는 CPU 시간 제한 및 CPU 코어 할당
- 메모리 제한: 프로세스 그룹이 사용할 수 있는 메모리 양 제한 및 OOM(Out of Memory) 동작 제어
- 블록 I/O 제한: 디스크 I/O 대역폭 제한 및 우선순위 설정
- 네트워크 트래픽 제어: tc/eBPF와 cgroup 분류를 조합하며 cgroup v2 자체에는 독립적인 대역폭 제한 파일이 없음
- 장치 접근 제어: 특정 장치에 대한 접근 제어 및 권한 관리
- pids 제어: 프로세스 생성 수 제한으로 fork 폭탄 방지
- freezer: 프로세스 그룹 일시 중지 및 재개 (컨테이너 일시 중지에 활용)
- cpuset: 특정 CPU 코어와 NUMA 노드에 프로세스 바인딩
cgroups v1과 v2
- cgroups v1: 각 자원 유형별로 별도의 계층 구조, 레거시 시스템에서 여전히 사용
- cgroups v2: 통합된 단일 계층 구조로 더 일관된 관리 제공, 최신 배포판의 기본값
- 하이브리드 모드: v1과 v2를 함께 사용하여 호환성 유지하면서 새 기능 활용
cgroups 관련 명령어
# cgroups 확인
ls -la /sys/fs/cgroup/ # cgroups v2
ls -la /sys/fs/cgroup/cpu /sys/fs/cgroup/memory # cgroups v1
# systemd를 통한 cgroups 관리 (현대적인 방식)
sudo systemctl set-property --runtime <서비스명> CPUQuota=20%
sudo systemctl set-property --runtime <서비스명> MemoryMax=1G
sudo systemctl set-property --runtime <서비스명> IOWeight=500
# 프로세스의 cgroup 확인
cat /proc/<PID>/cgroup
# Run only the example command inside a transient cgroup managed by systemd.
sudo systemd-run --scope -p CPUQuota=20% -p MemoryHigh=768M -p MemoryMax=1G sleep 60
# memory.max/high take one byte count or "max"; cpu.max takes quota and period.
# Do not move your shell into systemd-owned user.slice or edit its control files.
# 컨테이너 런타임과 cgroups
podman stats # 컨테이너 리소스 사용량 모니터링
docker run --cpus=0.5 --memory=512m nginx # 리소스 제한 설정파일 시스템
파일 시스템 계층 구조
Linux는 단일 루트 디렉토리(/)에서 시작하는 계층적 파일 시스템 구조를 가집니다.
주요 디렉토리:
/bin: 기본 명령어/sbin: 시스템 관리 명령어/etc: 시스템 구성 파일/home: 사용자 홈 디렉토리/var: 가변 데이터 (로그, 캐시 등)/tmp: 임시 파일/usr: 사용자 프로그램 및 데이터/proc: 프로세스 및 커널 정보 (가상 파일 시스템)/sys: 시스템 및 하드웨어 정보 (가상 파일 시스템)
파일 시스템 유형
- ext4: 널리 사용하는 Linux 파일 시스템이며 기본값은 배포판에 따라 다름
- XFS: 대용량 파일 시스템에 적합
- Btrfs: 스냅샷, 압축 등 고급 기능 제공
- OverlayFS: 여러 디렉토리를 겹쳐서 단일 디렉토리로 표현 (컨테이너에서 많이 사용)
- tmpfs: 메모리 기반 임시 파일 시스템이며 swap이 비활성화되지 않았다면 페이지가 swap될 수 있음
마운트와 볼륨
# 파일 시스템 마운트
mount -t <파일시스템유형> <소스> <마운트포인트>
# 마운트된 파일 시스템 확인
mount
df -h
# 파일 시스템 언마운트
umount <마운트포인트>네트워킹 기초
네트워크 인터페이스
- lo: 루프백 인터페이스 (127.0.0.1)
- eth0, ens3 등: 물리적 네트워크 인터페이스
- docker0, cni0 등: 가상 브릿지 인터페이스 (컨테이너 네트워킹)
네트워크 구성 명령어
# 네트워크 인터페이스 확인
ip addr show
ifconfig
# 라우팅 테이블 확인
ip route
route -n
# 네트워크 연결 확인
netstat -tuln
ss -tuln
# 네트워크 패킷 분석
tcpdump -i <인터페이스>네트워크 네임스페이스와 가상 인터페이스
# 네트워크 네임스페이스 생성
ip netns add <네임스페이스명>
# 가상 이더넷 페어 생성
ip link add <veth1> type veth peer name <veth2>
# 가상 인터페이스를 네임스페이스에 연결
ip link set <veth2> netns <네임스페이스명>보안 컨텍스트
사용자와 그룹
- UID (User ID): 사용자 식별자
- GID (Group ID): 그룹 식별자
- root (UID 0): 관리자 권한을 가진 특별한 사용자
파일 권한
Linux 파일 권한은 소유자, 그룹, 기타 사용자에 대한 읽기(r), 쓰기(w), 실행(x) 권한으로 구성됩니다.
권한 관련 명령어
# 파일 권한 변경
chmod 755 <파일명> # rwxr-xr-x
chmod u+x <파일명> # 소유자에게 실행 권한 추가
# 파일 소유자 변경
chown <사용자>:<그룹> <파일명>
# 특수 권한
chmod 4755 <파일명> # setuid 설정
chmod 2755 <파일명> # setgid 설정
chmod 1755 <파일명> # sticky bit 설정SELinux와 AppArmor
- SELinux (Security-Enhanced Linux): NSA에서 개발한 강제적 접근 제어 시스템
- AppArmor: 프로그램별 보안 프로필을 통한 접근 제어 시스템
# SELinux 상태 확인
getenforce
# 검토된 격리 실습에서만 사용: permissive는 시스템 전체 강제를 해제합니다.
# sudo setenforce 0
# 조사 후 원래 모드를 복구하며 일반적인 해결책으로 강제를 해제하지 않습니다.
# AppArmor 상태 확인
aa-status
# AppArmor 프로필 관리
aa-enforce /etc/apparmor.d/<프로필>
aa-complain /etc/apparmor.d/<프로필>systemd와 서비스 관리
systemd는 현대적인 Linux 시스템의 init 시스템이자 서비스 관리자입니다. Kubernetes 노드에서 kubelet, containerd 등 핵심 서비스를 관리하는 데 사용됩니다.
systemd의 주요 기능
- 서비스 관리: 시스템 서비스의 시작, 중지, 재시작, 활성화/비활성화
- 의존성 관리: 서비스 간 의존성 자동 관리 및 병렬 시작
- 로깅: journald를 통한 통합 로그 관리
- 타이머: cron 대신 사용할 수 있는 타이머 유닛
- 리소스 관리: cgroups를 통한 서비스별 리소스 제한
systemd 유닛 타입
- service: 시스템 서비스 (예: kubelet.service, containerd.service)
- socket: 소켓 기반 활성화
- target: 유닛 그룹 (런레벨과 유사)
- timer: 예약 작업
- mount: 파일 시스템 마운트
- device: 장치 유닛
systemd 명령어
# 서비스 상태 확인
systemctl status kubelet
systemctl status containerd
# 서비스 제어
systemctl start <서비스>
systemctl stop <서비스>
systemctl restart <서비스>
systemctl reload <서비스> # 설정 다시 읽기
# 부팅 시 자동 시작 설정
systemctl enable <서비스>
systemctl disable <서비스>
# 서비스 로그 확인
journalctl -u kubelet -f # 실시간 로그
journalctl -u kubelet --since "1 hour ago"
journalctl -u kubelet --no-pager
# 모든 서비스 목록
systemctl list-units --type=service
systemctl list-unit-files --type=service
# 실패한 서비스 확인
systemctl --failed
# systemd 설정 다시 읽기
systemctl daemon-reloadsystemd 유닛 파일 작성
작은 실습용 서비스로 유닛 구조를 설명합니다. kubelet은 systemctl cat kubelet으로 확인하고 배포판/kubeadm이 관리하는 유닛과 drop-in을 덮어쓰지 않습니다.
# /etc/systemd/system/linux-basics-demo.service
[Unit]
Description=Linux basics training service
Documentation=man:systemd.service(5)
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/sleep infinity
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.targetsystemd 리소스 제한
위 linux-basics-demo.service를 실습 VM에 저장하고 daemon-reload한 경우에만 아래 속성을 설정합니다. 운영 kubelet/containerd에 이 학습용 제한을 적용하지 않습니다.
# CPU 제한 (20%)
sudo systemctl set-property --runtime linux-basics-demo.service CPUQuota=20%
# 메모리 제한 (1GB)
sudo systemctl set-property --runtime linux-basics-demo.service MemoryMax=1G
# I/O 가중치 설정 (1-10000, 기본 100)
sudo systemctl set-property --runtime linux-basics-demo.service IOWeight=500
# 설정 확인
systemctl show linux-basics-demo.service | grep -E 'CPUQuota|MemoryMax|IOWeight'커널 파라미터와 모듈
sysctl을 통한 커널 파라미터 설정
sysctl은 실행 중인 커널의 파라미터를 조회하고 변경하는 도구입니다. Kubernetes 클러스터 구성 시 네트워크 및 시스템 파라미터 튜닝에 필수적입니다.
CNI별 sysctl 설정과 튜닝 예시
아래 값은 모든 Kubernetes 노드의 필수 기본값이 아닙니다. 선택한 IP 계열/CNI/서비스 프록시 요구를 확인합니다. bridge-nf 설정은 br_netfilter를 사용하는 구성에서만 필요합니다. 성능/ARP/conntrack 값은 측정 없이 운영 노드에 적용하지 않습니다. 먼저 현재 값을 기록하고 격리된 실습 VM에서만 변경합니다.
# IP 포워딩 활성화 (컨테이너 네트워킹에 필수)
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
# 브릿지 트래픽이 iptables를 통과하도록 설정 (bridge netfilter가 필요한 CNI 구성에 한함)
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=1
# 최대 파일 디스크립터 수 증가
sudo sysctl -w fs.file-max=2097152
# 네트워크 성능 튜닝
sudo sysctl -w net.core.somaxconn=32768
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sudo sysctl -w net.core.netdev_max_backlog=16384
# ARP 캐시 설정 (대규모 클러스터)
sudo sysctl -w net.ipv4.neigh.default.gc_thresh1=80000
sudo sysctl -w net.ipv4.neigh.default.gc_thresh2=90000
sudo sysctl -w net.ipv4.neigh.default.gc_thresh3=100000
# 현재 설정 확인
sysctl net.ipv4.ip_forward
sysctl -a | grep bridge-nf-call
# 영구 설정 (/etc/sysctl.conf 또는 /etc/sysctl.d/*.conf)
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# 설정 적용
sudo sysctl --system커널 모듈 관리
모듈은 런타임/CNI/스토리지 선택에 따라 다릅니다. IPVS 모드는 Kubernetes 1.35부터 deprecated이며 아래 IPVS 명령은 기존 IPVS 클러스터용입니다. 새 클러스터에 모든 모듈을 일괄 로드하지 않습니다.
# 모듈 로드
sudo modprobe overlay # OverlayFS (컨테이너 스토리지)
sudo modprobe br_netfilter # 브릿지 네트워킹
sudo modprobe ip_vs # IPVS 로드 밸런싱 (kube-proxy IPVS 모드)
sudo modprobe ip_vs_rr # Round Robin 알고리즘
sudo modprobe ip_vs_wrr # Weighted Round Robin
sudo modprobe ip_vs_sh # Source Hashing
# 로드된 모듈 확인
lsmod | grep overlay
lsmod | grep br_netfilter
# 모듈 정보 확인
modinfo overlay
# 부팅 시 자동 로드 설정
cat <<EOF | sudo tee /etc/modules-load.d/kubernetes.conf
overlay
# Add br_netfilter only if required by the chosen CNI.
EOF
# 모듈 언로드
sudo modprobe -r <모듈명>커널 버전 및 기능 확인
# 커널 버전 확인
uname -r
# 커널 컴파일 옵션 확인
cat /boot/config-$(uname -r) | grep OVERLAY
cat /boot/config-$(uname -r) | grep NETFILTER
# 사용 가능한 커널 기능 확인
cat /proc/filesystems # 지원되는 파일 시스템
cat /proc/sys/net/ipv4/ip_forward # IP 포워딩 상태시스템 리소스 제한
ulimit - 사용자별 리소스 제한
ulimit은 프로세스가 사용할 수 있는 시스템 리소스를 제한합니다. Kubernetes 노드에서 충분한 리소스를 확보하기 위해 조정이 필요할 수 있습니다.
# 현재 제한 확인
ulimit -a
# 주요 제한 항목
ulimit -n # 열 수 있는 파일 디스크립터 수
ulimit -u # 최대 프로세스 수
ulimit -m # RSS 제한; 최신 Linux에서는 강제되지 않음
ulimit -v # 가상 메모리 크기
# 제한 변경 (현재 세션)
ulimit -n 65536 # 파일 디스크립터를 65536으로 증가
# 영구 설정 (/etc/security/limits.conf)
sudo tee -a /etc/security/limits.conf <<EOF
* soft nofile 65536
* hard nofile 65536
* soft nproc 32768
* hard nproc 32768
EOF
# 특정 사용자/그룹 설정
sudo tee -a /etc/security/limits.conf <<EOF
root soft nofile 65536
root hard nofile 65536
@docker soft nofile 65536
@docker hard nofile 65536
EOFPAM 제한 설정
limits.conf는 pam_limits를 사용하는 새 로그인 세션에 적용됩니다. 일반 systemd 시스템 서비스에는 자동 적용되지 않으므로 서비스 drop-in의 LimitNOFILE/TasksMax 등을 사용합니다. 기존 세션/프로세스에는 소급 적용되지 않습니다. 배포판별 PAM 체인을 확인하고 common-session에 중복 행을 일괄 추가하지 않습니다.
# Inspect the active configuration; PAM file names differ by distribution.
grep -R pam_limits.so /etc/pam.d
systemctl show kubelet -p LimitNOFILE -p TasksMax프로세스별 리소스 확인
# 프로세스의 현재 리소스 제한 확인
cat /proc/<PID>/limits
# 특정 프로세스의 파일 디스크립터 확인
find /proc/<PID>/fd -mindepth 1 -maxdepth 1 -printf '%f\n' | wc -l로그 관리
journald - systemd 통합 로깅
journald는 systemd의 로깅 시스템으로, Kubernetes 노드의 시스템 서비스 로그를 관리합니다.
# 전체 시스템 로그
journalctl
# 특정 서비스 로그
journalctl -u kubelet
journalctl -u containerd
journalctl -u docker
# 실시간 로그 (tail -f와 유사)
journalctl -u kubelet -f
# 시간 범위 지정
journalctl --since "2025-11-24 10:00:00"
journalctl --since "1 hour ago"
journalctl --since yesterday
journalctl --until "2025-11-24 12:00:00"
# 우선순위별 필터링
journalctl -p err # 에러 및 더 높은 심각도 (0-3)
journalctl -p warning # 경고 이상
journalctl -p debug # 디버그 포함 모두
# 출력 형식 변경
journalctl -u kubelet -o json # JSON 형식
journalctl -u kubelet -o json-pretty # Pretty JSON
journalctl -u kubelet -o cat # 메시지만
# 부팅 로그
journalctl -b # 현재 부팅 로그
journalctl -b -1 # 이전 부팅 로그
journalctl --list-boots # 부팅 목록
# 디스크 사용량 확인
journalctl --disk-usage
# 로그 정리
journalctl --vacuum-time=7d # 7일 이전의 보관된 journal 파일 삭제
journalctl --vacuum-size=1G # 보관된 journal 총량을 줄이도록 오래된 파일 삭제journald 설정
# journald 설정 파일
sudo vi /etc/systemd/journald.conf
# 주요 설정 옵션
# Storage=persistent # 디스크에 영구 저장
# SystemMaxUse=1G # 최대 디스크 사용량
# SystemKeepFree=500M # 최소 여유 공간
# MaxRetentionSec=1month # 최대 보관 기간
# 설정 적용
sudo systemctl restart systemd-journald전통적인 syslog
일부 시스템에서는 여전히 syslog를 사용합니다.
# syslog 파일 위치
# /var/log/syslog # Debian/Ubuntu
# /var/log/messages # RHEL/CentOS
# 실시간 로그 확인
tail -f /var/log/syslog
# 로그 검색
grep "kubelet" /var/log/syslog
grep -i "error" /var/log/syslog로그 로테이션
일반 애플리케이션 파일에 logrotate를 사용합니다. copytruncate는 복사/잘라내기 사이에 기록이 유실될 수 있으므로 애플리케이션이 지원하면 파일 재열기 방식을 선호합니다. CRI 컨테이너 로그 회전은 kubelet이 관리합니다.
# logrotate 설정
sudo vi /etc/logrotate.d/linux-basics-demo
# 파일 내용 (kubelet이 관리하지 않는 애플리케이션 텍스트 로그 전용):/var/log/linux-basics-demo/*.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
}# 수동으로 로테이션 실행
sudo logrotate -f /etc/logrotate.d/linux-basics-demoDNS와 네트워크 설정
DNS 설정
호스트의 resolv.conf는 NetworkManager/systemd-resolved 등이 관리할 수 있으므로 먼저 실제 설정을 확인합니다. 8.8.8.8 같은 공용 DNS는 cluster.local 서비스를 확인하지 못합니다. ClusterFirst Pod는 kubelet이 구성한 클러스터 DNS를 사용하며 호스트에 클러스터 검색 접미사를 추가하는 것만으로 연결되지 않습니다.
# On the Linux host
cat /etc/resolv.conf
cat /etc/hosts
# If a cluster is available, inspect its actual DNS Service address.
kubectl -n kube-system get service kube-dns
# Run inside an existing Pod with DNS utilities and ClusterFirst policy:
# nslookup kubernetes.default.svc.cluster.local아래는 Pod resolver 파일의 형식 예제이며 IP/네임스페이스/클러스터 도메인을 실제 값으로 바꿔야 합니다. 호스트 파일에 복사하지 않습니다.
nameserver <cluster-dns-service-ip>
search <namespace>.svc.cluster.local svc.cluster.local cluster.local
options ndots:5systemd-resolved
현대적인 Linux 배포판에서는 systemd-resolved를 사용합니다.
# systemd-resolved 상태 확인
systemctl status systemd-resolved
# DNS 서버 확인
resolvectl status
# DNS 캐시 통계
resolvectl statistics
# DNS 캐시 초기화
resolvectl flush-caches네트워크 설정 파일
NetworkManager와 netplan 중 배포판이 사용하는 도구를 확인합니다. netplan의 YAML은 셸 명령이 아니며 /etc/netplan 아래 파일에 저장합니다. 원격 연결 중 주소/라우팅을 변경하기 전에 복구 경로를 준비하고 netplan try로 확인합니다.
nmcli connection show
nmcli device status
# On a netplan-based installation:
ls /etc/netplan# Example netplan file: replace eth0 with the actual interface name.
network:
version: 2
ethernets:
eth0:
dhcp4: truesudo netplan generate
sudo netplan try시간 동기화
시간 동기화는 분산 시스템에서 매우 중요합니다. Kubernetes 클러스터의 모든 노드는 정확한 시간을 유지해야 합니다.
chronyd (권장)
chronyd는 네트워크 조건 변화에 대응하는 NTP 클라이언트/서버입니다. 동기화 성능은 클록, 시간 소스 및 설정에 따라 달라집니다.
# chronyd 설치 (RHEL/CentOS)
sudo yum install chrony
# chronyd 설치 (Ubuntu/Debian)
sudo apt install chrony
# 설치된 유닛 확인: RHEL/Amazon Linux는 chronyd, Debian/Ubuntu는 chrony.
systemctl status chronyd
# 시간 동기화 상태 확인
chronyc tracking
# NTP 서버 목록
chronyc sources
# 상세 정보
chronyc sourcestats
# 수동 시간 동기화
# Only during a reviewed maintenance window; stepping can disrupt time-sensitive workloads.
# sudo chronyc makestepchronyd 설정
RHEL 계열은 보통 /etc/chrony.conf, Debian/Ubuntu는 /etc/chrony/chrony.conf를 사용합니다. 배포판의 제공자 설정(EC2의 Amazon Time Sync Service 포함)을 먼저 확인하고 임의의 공용 서버로 덮어쓰지 않습니다. 다음은 파일 내용 예제입니다.
# Choose an approved reachable time source.
server <approved-ntp-server> iburst
# Permit stepping only during the first three clock updates.
makestep 1.0 3# Choose the unit actually installed on your distribution:
systemctl status chronyd.service # RHEL/Amazon Linux
systemctl status chrony.service # Debian/Ubuntu
chronyc tracking
chronyc sourcestimesyncd (배포판별 선택)
Ubuntu 25.10부터 기본 시간 동기화는 chrony이며 이전 릴리스/이미지에는 systemd-timesyncd가 사용될 수 있습니다. 활성 시간 서비스 하나를 사용합니다. show-timesync는 timesyncd 전용이며 chrony 상태는 chronyc로 확인합니다.
timedatectl status
# Only for installations using systemd-timesyncd:
timedatectl show-timesync --all
systemctl status systemd-timesyncd# /etc/systemd/timesyncd.conf: use approved servers for this environment.
[Time]
NTP=<approved-ntp-server># After editing a timesyncd installation:
sudo systemctl restart systemd-timesyncd시간대 설정
# 현재 시간 및 시간대 확인
timedatectl
# 시간대 목록
timedatectl list-timezones
# 시간대 변경
sudo timedatectl set-timezone Asia/Seoul
# 시간 수동 설정 (NTP 비활성화 시)
: "${LAB_TIME:?Set an intentional time for an isolated VM with NTP disabled}"
# sudo timedatectl set-time "$LAB_TIME"
# NTP 활성화/비활성화
sudo timedatectl set-ntp true패키지 관리
Kubernetes와 관련 도구를 설치하고 관리하기 위한 패키지 관리자 사용법입니다.
apt (Debian/Ubuntu)
# 패키지 목록 업데이트
sudo apt update
# 패키지 업그레이드
sudo apt upgrade
# 패키지 설치
sudo apt install <패키지명>
# 패키지 제거
sudo apt remove <패키지명>
sudo apt purge <패키지명> # 설정 파일도 함께 제거
# 패키지 검색
apt search <키워드>
# 패키지 정보 확인
apt show <패키지명>
# 설치된 패키지 목록
apt list --installed
# 저장소 추가 (Kubernetes 예시)
set -o pipefail
: "${KUBERNETES_MINOR:?Choose a supported cluster-compatible minor, for example v1.37}"
sudo apt install -y ca-certificates curl gnupg
sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL "https://pkgs.k8s.io/core:/stable:/${KUBERNETES_MINOR}/deb/Release.key" | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${KUBERNETES_MINOR}/deb/ /" | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
# 불필요한 패키지 정리
sudo apt autoremove
sudo apt autocleanyum/dnf (RHEL/CentOS/Fedora)
# 패키지 설치
sudo yum install <패키지명>
sudo dnf install <패키지명> # Fedora/RHEL 8+
# 패키지 업데이트
sudo yum update
sudo dnf update
# 패키지 제거
sudo yum remove <패키지명>
sudo dnf remove <패키지명>
# 패키지 검색
yum search <키워드>
dnf search <키워드>
# 패키지 정보
yum info <패키지명>
dnf info <패키지명>
# 설치된 패키지 목록
yum list installed
dnf list installed
# 저장소 추가 (Kubernetes 예시)
: "${KUBERNETES_MINOR:?Choose a supported cluster-compatible minor, for example v1.37}"
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/${KUBERNETES_MINOR}/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/${KUBERNETES_MINOR}/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
# 캐시 정리
sudo yum clean all
sudo dnf clean all패키지 버전 고정
Kubernetes 구성 요소는 버전 호환성이 중요하므로 자동 업데이트를 방지해야 합니다.
# apt (Ubuntu/Debian)
sudo apt-mark hold kubelet kubeadm kubectl
# apt hold 해제
sudo apt-mark unhold kubelet kubeadm kubectl
# DNF: 배포판이 지원하는 versionlock 플러그인을 먼저 설치합니다.
# 또는 위 Kubernetes 저장소의 exclude 설정을 사용합니다.
sudo dnf versionlock add kubelet kubeadm kubectl
# versionlock 항목 해제
sudo dnf versionlock delete kubelet kubeadm kubectl주요 Linux 명령어
파일 및 디렉토리 관리
ls -la # 파일 목록 (숨김 파일 포함)
cd <디렉토리> # 디렉토리 변경
pwd # 현재 디렉토리 확인
mkdir -p <경로> # 디렉토리 생성 (필요시 상위 디렉토리도 생성)
rm -rf <경로> # 파일/디렉토리 삭제
cp -r <소스> <대상> # 파일/디렉토리 복사
mv <소스> <대상> # 파일/디렉토리 이동 또는 이름 변경
find <경로> -name "<패턴>" # 파일 검색텍스트 처리
cat <파일> # 파일 내용 출력
less <파일> # 파일 내용 페이지별 확인
grep "<패턴>" <파일> # 파일에서 패턴 검색
sed 's/<패턴>/<대체>/' <파일> # 텍스트 치환
awk '{print $1}' <파일> # 텍스트 처리시스템 정보
uname -a # 커널 정보
lsb_release -a # 배포판 정보
free -h # 메모리 사용량
df -h # 디스크 사용량
du -sh <경로> # 디렉토리 크기프로세스 및 서비스 관리
systemctl status <서비스> # 서비스 상태 확인
systemctl restart <서비스> # start/stop도 각각 별도 하위 명령으로 사용
journalctl -u <서비스> # 서비스 로그 확인컨테이너 관련 Linux 기능
OverlayFS
OverlayFS는 여러 디렉토리를 겹쳐서 단일 디렉토리로 표현하는 유니온 마운트 파일 시스템입니다. Docker와 같은 컨테이너 런타임에서 이미지 레이어를 구현하는 데 사용됩니다.
네트워크 브릿지와 NAT
Docker 기본 bridge 네트워크는 외부 통신에 브릿지/NAT를 사용합니다. Kubernetes CNI는 라우팅, 오버레이 또는 VPC 네이티브 네트워크를 사용할 수 있으며 모든 Pod 간 트래픽에 NAT가 적용되지는 않습니다.
시스템 호출 필터링 (seccomp)
seccomp(Secure Computing Mode)는 프로세스가 사용할 수 있는 시스템 호출을 제한하는 Linux 커널 기능입니다. 컨테이너의 보안을 강화하는 데 사용됩니다.
기능(Capabilities) 제한
Linux 기능은 전통적인 root 권한을 더 작은 권한 단위로 나눈 것입니다. 컨테이너는 필요한 기능만 부여받아 보안을 강화합니다.
주요 기능:
CAP_NET_ADMIN: 네트워크 설정 변경CAP_SYS_ADMIN: 시스템 관리 작업CAP_CHOWN: 파일 소유권 변경CAP_DAC_OVERRIDE: 파일 권한 무시
결론
Linux의 기본 개념과 기능은 Kubernetes와 컨테이너 기술을 이해하는 데 필수적입니다. 이 문서에서 다룬 주요 내용을 정리하면:
핵심 기술
- 네임스페이스와 cgroups: 컨테이너 격리와 자원 관리의 기반
- OverlayFS: 컨테이너 이미지 레이어링의 핵심
- systemd: Kubernetes 노드 서비스 관리
운영 필수 지식
- 커널 파라미터 튜닝: sysctl을 통한 네트워킹 및 시스템 최적화
- 모듈 관리: CNI 플러그인과 스토리지 드라이버 지원
- 로그 관리: journald를 통한 시스템 및 서비스 로그 분석
- 시간 동기화: 분산 시스템의 일관성 유지
문제 해결
- 리소스 제한: ulimit과 cgroups를 통한 리소스 관리
- 네트워킹: DNS, 브릿지, iptables 설정
- 패키지 관리: Kubernetes 구성 요소의 버전 관리
이러한 Linux 기초 지식을 바탕으로 Kubernetes 환경에서 발생하는 문제를 효과적으로 해결하고, 클러스터를 최적화하며, 안정적으로 운영할 수 있습니다.
퀴즈
이 장에서 배운 내용을 테스트하려면 Linux 기초 퀴즈를 풀어보세요.
참고 자료
검증 참고 자료
- https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html
- https://kubernetes.io/docs/concepts/architecture/cgroups/
- https://man7.org/linux/man-pages/man7/time_namespaces.7.html
- https://man7.org/linux/man-pages/man2/getrlimit.2.html
- https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html
- https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html
- https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html
- https://www.freedesktop.org/software/systemd/man/latest/journalctl.html
- https://kubernetes.io/docs/concepts/cluster-administration/logging/
- https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
- https://ubuntu.com/about/release-cycle
- https://www.debian.org/releases/
- https://www.centos.org/centos-linux-eol/
- https://documentation.ubuntu.com/server/how-to/networking/timedatectl-and-timesyncd/
- https://aws.amazon.com/amazon-linux-2/faqs/
- https://docs.aws.amazon.com/linux/al2023/ug/ec2.html
- https://github.com/logrotate/logrotate/blob/main/logrotate.8.in
- https://github.com/linux-pam/linux-pam/blob/master/modules/pam_limits/limits.conf.5.xml




