# Linux 기초

> **지원 버전**: 검토한 예제 환경: Ubuntu 24.04 LTS, Debian 13, Amazon Linux 2023; 패키지/서비스 이름은 배포판별로 다름 **마지막 업데이트**: 2026년 9월 15일

Kubernetes와 컨테이너 기술을 이해하기 위해서는 Linux에 대한 기본적인 이해가 필수적입니다. 이 문서에서는 Kubernetes 환경에서 특히 중요한 Linux의 핵심 개념들을 다룹니다.

터미널과 네트워크를 처음 배운다면 [처음부터 배우는 Linux 네트워크](https://www.atomai.click/kubernetes-docs/llms/ko/networking/beginner/README.md)의 1장부터 진행하세요. 이 문서는 이후 컨테이너·커널 개념을 찾아보는 심화 참고 자료로도 사용할 수 있습니다.

## 실습 환경 설정

이 문서의 예제를 따라하기 위해서는 다음과 같은 환경이 필요합니다:

### 필수 환경

* Linux 운영체제 (Ubuntu 24.04 LTS, Debian 13 또는 Amazon Linux 2023 권장)
* 터미널 액세스
* sudo 권한

### 클라우드 환경 설정 (선택 사항)

격리된 실습 VM을 사용합니다. AWS에서는 리전/아키텍처에 맞는 AL2023을 선택하며 고정 AMI ID는 다른 리전에서 재사용할 수 없습니다. AWS는 AL2 표준 지원이 2026-06-30 종료되었다고 안내합니다. 아래는 AMI 조회만 수행하므로 인스턴스 생성과 제한된 접근 경로를 별도로 준비한 후 기존 인스턴스에 접속합니다.

```bash
# 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 커널과 사용자 공간](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#linux-커널과-사용자-공간)
* [프로세스 관리](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#프로세스-관리)
* [네임스페이스](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#네임스페이스)
* [cgroups (Control Groups)](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#cgroups-control-groups)
* [파일 시스템](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#파일-시스템)
* [네트워킹 기초](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#네트워킹-기초)
* [보안 컨텍스트](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#보안-컨텍스트)
* [systemd와 서비스 관리](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#systemd와-서비스-관리)
* [커널 파라미터와 모듈](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#커널-파라미터와-모듈)
* [시스템 리소스 제한](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#시스템-리소스-제한)
* [로그 관리](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#로그-관리)
* [DNS와 네트워크 설정](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#dns와-네트워크-설정)
* [시간 동기화](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#시간-동기화)
* [패키지 관리](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#패키지-관리)
* [주요 Linux 명령어](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#주요-linux-명령어)
* [컨테이너 관련 Linux 기능](https://www.atomai.click/kubernetes-docs/llms/ko/basics/01-linux-basics.md#컨테이너-관련-linux-기능)

## Linux 커널과 사용자 공간

### 커널의 역할

> **핵심 개념**: Linux 커널은 운영체제의 핵심으로, 하드웨어와 소프트웨어 사이의 중개자 역할을 합니다.

Linux 커널은 운영체제의 핵심으로, 하드웨어와 소프트웨어 사이의 중개자 역할을 합니다. 주요 기능은 다음과 같습니다:

* **프로세스 관리**: 프로세스 생성, 스케줄링, 종료
* **메모리 관리**: 가상 메모리, 물리적 메모리 할당
* **장치 관리**: 하드웨어 장치와의 통신
* **시스템 호출 인터페이스**: 사용자 공간 프로그램이 커널 서비스에 접근할 수 있는 방법 제공

### 사용자 공간

사용자 공간은 일반 응용 프로그램이 실행되는 메모리 영역입니다. 사용자 공간 프로그램은 시스템 호출을 통해 커널 서비스에 접근합니다.

![애플리케이션과 셸이 시스템 라이브러리와 시스템 호출 인터페이스를 거쳐 커널 서브시스템(프로세스·메모리 관리, 파일 시스템, 네트워킹, 보안)에 접근하고, 장치 드라이버를 통해 CPU·메모리·스토리지·네트워크 카드와 통신하는 Linux의 사용자 공간–커널 공간–하드웨어 계층 구조를 보여준다.](https://raw.githubusercontent.com/Atom-oh/kubernetes-docs/main/ko/.gitbook/assets/ko-basics-01-linux-basics-0.png)

[🔍 인터랙티브 다이어그램 보기](https://www.atomai.click/kubernetes-docs/archmaps/ko-basics-01-linux-basics-0.html)

### 시스템 호출 예시

| 시스템 호출     | 설명          | 관련 명령어              |
| ---------- | ----------- | ------------------- |
| `fork()`   | 새 프로세스 생성   | `ps`, `top`         |
| `exec()`   | 프로그램 실행     | `bash`, `sh`        |
| `open()`   | 파일 열기       | `cat`, `less`       |
| `read()`   | 파일에서 데이터 읽기 | `cat`, `grep`       |
| `write()`  | 파일에 데이터 쓰기  | `echo`, `tee`       |
| `socket()` | 네트워크 소켓 생성  | `netstat`, `ss`     |
| `clone()`  | 태스크 생성 및 플래그에 따른 새 네임스페이스   | `unshare`, `docker` |

### 리눅스 커널 아키텍처

![사용자 공간의 애플리케이션과 셸이 시스템 라이브러리를 거쳐 시스템 호출 인터페이스로 커널 공간에 진입하고, 프로세스·메모리·파일 시스템·네트워킹·보안 서브시스템이 장치 드라이버를 통해 CPU·메모리·스토리지·네트워크 카드 하드웨어와 통신하는 리눅스 커널 아키텍처의 계층 구조를 보여준다.](https://raw.githubusercontent.com/Atom-oh/kubernetes-docs/main/ko/.gitbook/assets/ko-basics-01-linux-basics-1.png)

[🔍 인터랙티브 다이어그램 보기](https://www.atomai.click/kubernetes-docs/archmaps/ko-basics-01-linux-basics-1.html)

## 프로세스 관리

### 프로세스와 스레드

* **프로세스**: 실행 중인 프로그램의 인스턴스로, 독립된 메모리 공간을 가짐
* **스레드**: 프로세스 내에서 실행되는 작업 단위로, 같은 프로세스의 스레드들은 메모리 공간을 공유

### 프로세스 상태

* **실행(Running)**: CPU에서 실행 중
* **대기(Waiting)**: I/O 완료 또는 이벤트 발생 대기
* **준비(Ready)**: 실행 가능하지만 CPU 할당 대기
* **좀비(Zombie)**: 종료되었지만 부모 프로세스가 상태를 확인하지 않은 상태
* **중단(Stopped)**: 일시 중지된 상태

### 주요 프로세스 관리 명령어

```bash
# 프로세스 목록 확인
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은 격리하지 않음

### 네임스페이스 관련 명령어

```bash
# 프로세스의 네임스페이스 확인
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 bash
```

## cgroups (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 관련 명령어

```bash
# 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될 수 있음

### 마운트와 볼륨

```bash
# 파일 시스템 마운트
mount -t <파일시스템유형> <소스> <마운트포인트>

# 마운트된 파일 시스템 확인
mount
df -h

# 파일 시스템 언마운트
umount <마운트포인트>
```

## 네트워킹 기초

### 네트워크 인터페이스

* **lo**: 루프백 인터페이스 (127.0.0.1)
* **eth0, ens3 등**: 물리적 네트워크 인터페이스
* **docker0, cni0 등**: 가상 브릿지 인터페이스 (컨테이너 네트워킹)

### 네트워크 구성 명령어

```bash
# 네트워크 인터페이스 확인
ip addr show
ifconfig

# 라우팅 테이블 확인
ip route
route -n

# 네트워크 연결 확인
netstat -tuln
ss -tuln

# 네트워크 패킷 분석
tcpdump -i <인터페이스>
```

### 네트워크 네임스페이스와 가상 인터페이스

```bash
# 네트워크 네임스페이스 생성
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) 권한으로 구성됩니다.

![ls -l 출력의 10자리 권한 문자열을 파일 타입 1자리와 소유자·그룹·기타 사용자 권한 3자리씩(r w x)으로 나눠 읽는 구조와, 예시 drwxr-xr--가 디렉토리 · 소유자 모든 권한 · 그룹 읽기/실행 · 기타 사용자 읽기만으로 해석되는 과정을 보여준다.](https://raw.githubusercontent.com/Atom-oh/kubernetes-docs/main/ko/.gitbook/assets/ko-basics-01-linux-basics-2.png)

[🔍 인터랙티브 다이어그램 보기](https://www.atomai.click/kubernetes-docs/archmaps/ko-basics-01-linux-basics-2.html)

### 권한 관련 명령어

```bash
# 파일 권한 변경
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**: 프로그램별 보안 프로필을 통한 접근 제어 시스템

```bash
# 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 명령어

```bash
# 서비스 상태 확인
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-reload
```

### systemd 유닛 파일 작성

작은 실습용 서비스로 유닛 구조를 설명합니다. kubelet은 systemctl cat kubelet으로 확인하고 배포판/kubeadm이 관리하는 유닛과 drop-in을 덮어쓰지 않습니다.

```ini
# /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.target
```

### systemd 리소스 제한

위 linux-basics-demo.service를 실습 VM에 저장하고 daemon-reload한 경우에만 아래 속성을 설정합니다. 운영 kubelet/containerd에 이 학습용 제한을 적용하지 않습니다.

```bash
# 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에서만 변경합니다.

```bash
# 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 클러스터용입니다. 새 클러스터에 모든 모듈을 일괄 로드하지 않습니다.

```bash
# 모듈 로드
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 <모듈명>
```

### 커널 버전 및 기능 확인

```bash
# 커널 버전 확인
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 노드에서 충분한 리소스를 확보하기 위해 조정이 필요할 수 있습니다.

```bash
# 현재 제한 확인
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
EOF
```

### PAM 제한 설정

limits.conf는 pam_limits를 사용하는 새 로그인 세션에 적용됩니다. 일반 systemd 시스템 서비스에는 자동 적용되지 않으므로 서비스 drop-in의 LimitNOFILE/TasksMax 등을 사용합니다. 기존 세션/프로세스에는 소급 적용되지 않습니다. 배포판별 PAM 체인을 확인하고 common-session에 중복 행을 일괄 추가하지 않습니다.

```bash
# 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
```

### 프로세스별 리소스 확인

```bash
# 프로세스의 현재 리소스 제한 확인
cat /proc/<PID>/limits

# 특정 프로세스의 파일 디스크립터 확인
find /proc/<PID>/fd -mindepth 1 -maxdepth 1 -printf '%f\n' | wc -l
```

## 로그 관리

### journald - systemd 통합 로깅

journald는 systemd의 로깅 시스템으로, Kubernetes 노드의 시스템 서비스 로그를 관리합니다.

```bash
# 전체 시스템 로그
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 설정

```bash
# journald 설정 파일
sudo vi /etc/systemd/journald.conf

# 주요 설정 옵션
# Storage=persistent        # 디스크에 영구 저장
# SystemMaxUse=1G          # 최대 디스크 사용량
# SystemKeepFree=500M      # 최소 여유 공간
# MaxRetentionSec=1month   # 최대 보관 기간

# 설정 적용
sudo systemctl restart systemd-journald
```

### 전통적인 syslog

일부 시스템에서는 여전히 syslog를 사용합니다.

```bash
# 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이 관리합니다.

```bash
# logrotate 설정
sudo vi /etc/logrotate.d/linux-basics-demo

# 파일 내용 (kubelet이 관리하지 않는 애플리케이션 텍스트 로그 전용):
```

```text
/var/log/linux-basics-demo/*.log {
    daily
    rotate 7
    missingok
    notifempty
    compress
    delaycompress
    copytruncate
}
```

```bash
# 수동으로 로테이션 실행
sudo logrotate -f /etc/logrotate.d/linux-basics-demo
```

## DNS와 네트워크 설정

### DNS 설정

호스트의 resolv.conf는 NetworkManager/systemd-resolved 등이 관리할 수 있으므로 먼저 실제 설정을 확인합니다. 8.8.8.8 같은 공용 DNS는 cluster.local 서비스를 확인하지 못합니다. ClusterFirst Pod는 kubelet이 구성한 클러스터 DNS를 사용하며 호스트에 클러스터 검색 접미사를 추가하는 것만으로 연결되지 않습니다.

```bash
# 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/네임스페이스/클러스터 도메인을 실제 값으로 바꿔야 합니다. 호스트 파일에 복사하지 않습니다.

```text
nameserver <cluster-dns-service-ip>
search <namespace>.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
```

### systemd-resolved

현대적인 Linux 배포판에서는 systemd-resolved를 사용합니다.

```bash
# systemd-resolved 상태 확인
systemctl status systemd-resolved

# DNS 서버 확인
resolvectl status

# DNS 캐시 통계
resolvectl statistics

# DNS 캐시 초기화
resolvectl flush-caches
```

### 네트워크 설정 파일

NetworkManager와 netplan 중 배포판이 사용하는 도구를 확인합니다. netplan의 YAML은 셸 명령이 아니며 /etc/netplan 아래 파일에 저장합니다. 원격 연결 중 주소/라우팅을 변경하기 전에 복구 경로를 준비하고 netplan try로 확인합니다.

```bash
nmcli connection show
nmcli device status
# On a netplan-based installation:
ls /etc/netplan
```

```yaml
# Example netplan file: replace eth0 with the actual interface name.
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: true
```

```bash
sudo netplan generate
sudo netplan try
```

## 시간 동기화

시간 동기화는 분산 시스템에서 매우 중요합니다. Kubernetes 클러스터의 모든 노드는 정확한 시간을 유지해야 합니다.

### chronyd (권장)

chronyd는 네트워크 조건 변화에 대응하는 NTP 클라이언트/서버입니다. 동기화 성능은 클록, 시간 소스 및 설정에 따라 달라집니다.

```bash
# 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 makestep
```

### chronyd 설정

RHEL 계열은 보통 /etc/chrony.conf, Debian/Ubuntu는 /etc/chrony/chrony.conf를 사용합니다. 배포판의 제공자 설정(EC2의 Amazon Time Sync Service 포함)을 먼저 확인하고 임의의 공용 서버로 덮어쓰지 않습니다. 다음은 파일 내용 예제입니다.

```text
# Choose an approved reachable time source.
server <approved-ntp-server> iburst
# Permit stepping only during the first three clock updates.
makestep 1.0 3
```

```bash
# Choose the unit actually installed on your distribution:
systemctl status chronyd.service  # RHEL/Amazon Linux
systemctl status chrony.service   # Debian/Ubuntu
chronyc tracking
chronyc sources
```

### timesyncd (배포판별 선택)

Ubuntu 25.10부터 기본 시간 동기화는 chrony이며 이전 릴리스/이미지에는 systemd-timesyncd가 사용될 수 있습니다. 활성 시간 서비스 하나를 사용합니다. show-timesync는 timesyncd 전용이며 chrony 상태는 chronyc로 확인합니다.

```bash
timedatectl status
# Only for installations using systemd-timesyncd:
timedatectl show-timesync --all
systemctl status systemd-timesyncd
```

```ini
# /etc/systemd/timesyncd.conf: use approved servers for this environment.
[Time]
NTP=<approved-ntp-server>
```

```bash
# After editing a timesyncd installation:
sudo systemctl restart systemd-timesyncd
```

### 시간대 설정

```bash
# 현재 시간 및 시간대 확인
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)

```bash
# 패키지 목록 업데이트
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 autoclean
```

### yum/dnf (RHEL/CentOS/Fedora)

```bash
# 패키지 설치
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 구성 요소는 버전 호환성이 중요하므로 자동 업데이트를 방지해야 합니다.

```bash
# 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 명령어

### 파일 및 디렉토리 관리

```bash
ls -la           # 파일 목록 (숨김 파일 포함)
cd <디렉토리>     # 디렉토리 변경
pwd              # 현재 디렉토리 확인
mkdir -p <경로>   # 디렉토리 생성 (필요시 상위 디렉토리도 생성)
rm -rf <경로>     # 파일/디렉토리 삭제
cp -r <소스> <대상> # 파일/디렉토리 복사
mv <소스> <대상>   # 파일/디렉토리 이동 또는 이름 변경
find <경로> -name "<패턴>" # 파일 검색
```

### 텍스트 처리

```bash
cat <파일>        # 파일 내용 출력
less <파일>       # 파일 내용 페이지별 확인
grep "<패턴>" <파일> # 파일에서 패턴 검색
sed 's/<패턴>/<대체>/' <파일> # 텍스트 치환
awk '{print $1}' <파일> # 텍스트 처리
```

### 시스템 정보

```bash
uname -a         # 커널 정보
lsb_release -a   # 배포판 정보
free -h          # 메모리 사용량
df -h            # 디스크 사용량
du -sh <경로>     # 디렉토리 크기
```

### 프로세스 및 서비스 관리

```bash
systemctl status <서비스> # 서비스 상태 확인
systemctl restart <서비스> # start/stop도 각각 별도 하위 명령으로 사용
journalctl -u <서비스> # 서비스 로그 확인
```

## 컨테이너 관련 Linux 기능

### OverlayFS

OverlayFS는 여러 디렉토리를 겹쳐서 단일 디렉토리로 표현하는 유니온 마운트 파일 시스템입니다. Docker와 같은 컨테이너 런타임에서 이미지 레이어를 구현하는 데 사용됩니다.

![클라이언트(앱)가 OverlayFS의 병합된 뷰(merged view)를 통해 파일에 접근하고, 그 아래에 쓰기 가능한 upperdir, 스크래치 공간인 workdir, 읽기 전용 lowerdir 레이어가 겹쳐 있는 구조를 보여준다.](https://raw.githubusercontent.com/Atom-oh/kubernetes-docs/main/ko/.gitbook/assets/ko-basics-01-linux-basics-11.png)

[🔍 인터랙티브 다이어그램 보기](https://www.atomai.click/kubernetes-docs/archmaps/ko-basics-01-linux-basics-11.html)

### 네트워크 브릿지와 NAT

Docker 기본 bridge 네트워크는 외부 통신에 브릿지/NAT를 사용합니다. Kubernetes CNI는 라우팅, 오버레이 또는 VPC 네이티브 네트워크를 사용할 수 있으며 모든 Pod 간 트래픽에 NAT가 적용되지는 않습니다.

![단일 호스트에서 두 컨테이너가 veth pair로 docker0 브릿지에 연결되고, iptables NAT 규칙을 거쳐 호스트 eth0을 통해 외부 인터넷과 통신하는 Docker 브리지 네트워킹 구조를 보여준다.](https://raw.githubusercontent.com/Atom-oh/kubernetes-docs/main/ko/.gitbook/assets/ko-basics-01-linux-basics-10.png)

[🔍 인터랙티브 다이어그램 보기](https://www.atomai.click/kubernetes-docs/archmaps/ko-basics-01-linux-basics-10.html)

### 시스템 호출 필터링 (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.atomai.click/kubernetes-docs/ko/quizzes/basics/01-linux-basics-quiz)를 풀어보세요.

## 참고 자료

* [The Linux Documentation Project](https://tldp.org/)
* [Linux Kernel Documentation](https://www.kernel.org/doc/)
* [Linux Namespaces](https://man7.org/linux/man-pages/man7/namespaces.7.html)
* [Control Groups v2](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html)

## 검증 참고 자료

- 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
