Devops
26 posts in this category
Jenkins Pipeline 완전 가이드
Jenkins Pipeline을 사용하여 강력한 CI/CD 파이프라인을 구축하는 방법을 알아봅니다.
GitHub Actions 고급 워크플로우 패턴
복잡한 배포 시나리오를 위한 고급 GitHub Actions 워크플로우 패턴을 알아봅니다.
Prometheus와 Grafana로 모니터링 시스템 구축하기
Prometheus와 Grafana를 사용하여 애플리케이션과 인프라 모니터링 시스템을 구축하는 방법을 단계별로 알아봅니다.
Enterprise에서의 K8S
enterprise 환경에서의 K8S 구성에 대해서
GitHub Actions로 시작하는 CI/CD 자동화
GitHub Actions를 사용하여 간단한 CI/CD 파이프라인을 구축하는 방법을 알아봅니다. 코드 푸시부터 자동 배포까지 전체 워크플로우를 설정해보겠습니다.
k8s etcd란
k8s etcd에 대해서
k8s 안전하게 shutdown하기
k8s 셧다운 하는 방법에 대해서
k8s 인스톨 할때 체크 목록
k8s 인스톨 할 때 체크 목록과 순서
k8s 학습 로드맵
k8s 학습 로드맵
KubeSpary로 K8S를 쉽게 설치
KubeSpary를 사용하여 K8S를 쉽게 설치하는 방법을 공유합니다.
/etc/environment 에 관해서(전역환경변수)
Linux /etc/environment
완벽 가이드
1. 개요
/etc/environment
는 리눅스 시스템 전역에서 사용하는 환경변수를 설정하는 파일입니다.
주요 특징:
- 로그인 세션 전체에 적용 (PAM 기반)
- 쉘 종류와 무관 (bash, zsh, GUI 로그인, SSH 등)
- 간단한 문법 (
KEY=value
) - 스크립트 기능 없음 (
export
, 변수 확장 불가)
목적: PATH, 로케일, 프록시 설정 등 공통 환경변수를 한 곳에서 관리.
2. 문법 및 제약
- 형식:
KEY=value
(공백 포함 시"쌍따옴표"
로 감싸야 함) export
키워드 사용 불가$HOME
,~
, 명령 치환($(...)
) 동작 안 함- 주석은 보장되지 않으므로 가급적 피할 것
예시 문법
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
LANG="ko_KR.UTF-8"
JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
HTTP_PROXY="http://192.168.0.10:3128"
HTTPS_PROXY="http://192.168.0.10:3128"
NO_PROXY="localhost,127.0.0.1,10.96.0.0/12,10.244.0.0/16,.svc,.cluster.local"
3. 적용 범위와 우선순위
- PAM을 거치는 로그인 세션(TTY, SSH, GUI)에 적용
- 기존 세션에는 반영 안 됨 → 재로그인 필요
- 쉘 초기화 스크립트(
/etc/profile
,~/.bashrc
)에서 동일 변수를 재설정하면 덮어씀 - systemd 서비스는
/etc/environment
를 자동으로 읽지 않을 수 있음
4. 다른 설정 파일과 비교
파일 | 대상 | 특징 |
---|---|---|
/etc/environment | 전역 세션 | 간단한 KEY=value, 스크립트 불가 |
/etc/profile , /etc/bash.bashrc | 로그인 쉘 | export 가능, 조건문 가능 |
/etc/default/<서비스> | 서비스 전용 | Debian/Ubuntu 전통 방식 |
systemd unit 파일 | 서비스 전용 | Environment= , EnvironmentFile= 사용 |
5. 설정 방법
sudoedit /etc/environment
# 또는
sudo nano /etc/environment
변경 후 새 세션에서 확인:
/etc/hosts 에 관해서
/etc/hosts 완전 정리 (K8s 운영자 관점)
집/랩 환경에서 K8s를 굴릴 때 /etc/hosts
를 정확히 이해하면 “DNS가 안 잡히는 상황”, “부트스트랩 시 통신 안 됨”, “로컬 테스트 도메인 강제 매핑” 같은 문제를 빠르게 뚫을 수 있어요.
아래를 쭉 보면 역할 → 동작 원리 → 실전 설정 → K8s 특화 팁 순으로 정리돼 있습니다.
1) /etc/hosts
는 뭐 하는 파일?
- 로컬(host) 단에서 “이름 → IP”를 가장 먼저(보통) 해석하는 정적 매핑표
- 네트워크를 타지 않고 OS가 파일을 읽어서 즉시 해석
nsswitch.conf
순서에 따라 보통/etc/hosts
가 DNS보다 우선- DNS 레코드와 충돌 시
/etc/hosts
가 항상 이김
확인 명령:
/etc/resolv 에 관해서
📘 리눅스 /etc/resolv.conf
완벽 가이드 (K8s 환경 포함)
1. /etc/resolv.conf
역할
- 도메인 이름 → IP 주소 변환(DNS Resolution) 시 참조하는 설정 파일
- 모든 DNS 조회(
dig
,nslookup
, 웹 브라우저 등)의 기본 규칙 제공 - 쿠버네티스에서는 노드의 resolv.conf → Pod의 resolv.conf로 전파됨
2. 기본 구조 예시
nameserver 8.8.8.8
nameserver 1.1.1.1
search example.com local.lan
options ndots:2 timeout:2 attempts:2 rotate
주요 지시어
지시어 | 설명 | 예시 |
---|---|---|
nameserver <IP> | 사용할 DNS 서버 (최대 3개) | nameserver 8.8.8.8 |
search <도메인> | 짧은 호스트명에 붙일 검색 도메인 | search local.lan home.lan |
domain <도메인> | 단일 검색 도메인 | domain local.lan |
options | 추가 옵션 | ndots:2 , timeout:3 , rotate 등 |
3. 자주 쓰는 options
ndots:N
→ 점(.
)이 N개 이상이면 FQDN으로 판단
예:ndots:5
이면foo.bar
도 search 도메인 붙여 여러 번 시도 → 느려질 수 있음timeout:T
→ 응답 대기 시간(초)attempts:N
→ 재시도 횟수rotate
→ nameserver 라운드로빈 방식single-request-reopen
→ IPv4/IPv6 동시 요청 문제 회피
4. 직접 수정하면 안 되는 이유
- 많은 배포판에서 자동 생성/관리됨
- 부팅, DHCP 갱신, 네트워크 재시작 시 덮어씌워짐
- 관리 주체 예시:
- systemd-resolved →
/etc/resolv.conf
는 127.0.0.53(stub) 가리킴 - NetworkManager
- resolvconf,
dhclient
- Netplan
- systemd-resolved →
5. 올바른 수정 방법
systemd-resolved 사용 시
sudo nano /etc/systemd/resolved.conf
# DNS, Domains, DNSStubListener 설정
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=9.9.9.9
Domains=local.lan
sudo systemctl restart systemd-resolved
resolvectl status
- kubelet이 참고할 파일:
/run/systemd/resolve/resolv.conf
NetworkManager 사용 시
nmcli connection modify eth0 ipv4.dns "1.1.1.1 8.8.8.8"
nmcli connection modify eth0 ipv4.ignore-auto-dns yes
nmcli connection up eth0
DHCP 클라이언트 사용 시
# /etc/dhcp/dhclient.conf
supersede domain-name-servers 1.1.1.1, 8.8.8.8;
6. 쿠버네티스에서의 resolv.conf
dnsPolicy
값 | 설명 |
---|---|
ClusterFirst | 기본값. 클러스터 DNS(CoreDNS) 우선 |
ClusterFirstWithHostNet | hostNetwork Pod에서 클러스터 DNS 우선 |
Default | 노드의 resolv.conf 그대로 사용 |
None | 완전 수동, dnsConfig 필요 |
Pod에서 dnsConfig 사용 예
apiVersion: v1
kind: Pod
metadata:
name: dns-test
spec:
dnsPolicy: None
dnsConfig:
nameservers:
- 1.1.1.1
searches:
- example.com
options:
- name: ndots
value: "1"
containers:
- name: busybox
image: busybox
command: ["sleep", "3600"]
7. CoreDNS 업스트림 변경 예
.:53 {
forward . 1.1.1.1 8.8.8.8
cache 30
errors
}
internal.local:53 {
forward . 192.168.0.1
}
8. 집 K8s 환경에서 추천 구성
- 노드:
/etc/resolv.conf
가 127.0.0.53이면 kubelet에 다음 설정:--resolv-conf=/run/systemd/resolve/resolv.conf
- CoreDNS:
- 신뢰 가능한 업스트림 DNS 명시
- Pod 특수 케이스:
- 외부 DNS 바로 사용:
dnsPolicy: None
+dnsConfig
- 외부 DNS 바로 사용:
9. 디버깅 명령어
노드에서
cat /etc/resolv.conf
resolvectl status
dig @1.1.1.1 kubernetes.io
Pod에서
kubectl exec -it <pod> -- cat /etc/resolv.conf
kubectl exec -it <pod> -- dig kubernetes.default.svc.cluster.local
CoreDNS 로그
kubectl -n kube-system logs -l k8s-app=kube-dns
10. FAQ
- Q: resolv.conf 직접 수정해도 돼?
A: 재부팅/네트워크 재시작 시 덮어씌워짐. 상위 설정에서 변경 권장. - Q: nameserver 4개 넣으면?
A: 3개까지만 유효. - Q: ndots 줄이면?
A: 내부 DNS 성능 향상 가능.
📌 요약
/etc/resolv.conf
는 DNS 해석 기본 설정- 쿠버네티스에서는 노드 → Pod로 전파
- Ubuntu + systemd-resolved 환경에서는 /run/systemd/resolve/resolv.conf를 kubelet에 지정
- CoreDNS 업스트림 명시로 안정성 확보 셋업
/var/log/auth.log 에 관해서
/var/log/auth.log 완벽 가이드 (Ubuntu/Debian 기준)
1. 개요
- 정의:
/var/log/auth.log
는 인증·권한 관련 보안 로그를 저장하는 파일입니다. - 대상:
sshd
,sudo
,su
,polkit
,login
,cron(PAM)
,systemd(PAM)
등에서 발생한 이벤트. - 목적: 비인가 접속, 권한 상승, 계정 잠금/해제 등 침해사고 탐지의 핵심 소스.
RHEL/CentOS 계열에서는
/var/log/secure
파일이 동일한 역할을 합니다.
2. 주요 기록 항목
구분 | 예시 이벤트 |
---|---|
SSH 접속 | 로그인 성공/실패, 키 인증 실패, 접속원 IP, 포트 |
sudo 사용 | 명령 실행, 권한 상승 시도 |
su 전환 | 다른 계정/루트 전환 |
PAM 인증 | 계정 만료, 잠금, 2FA |
polkit | GUI/서비스 권한 승인/거부 |
계정 관리 | 잠금/해제, 비밀번호 변경 |
3. 로그 포맷 구조
기본 구조:
k8s 기본 네트워킹 cli
Kubernetes 운영자를 위한 리눅스 네트워크 명령어 정리
📌 목적: K8s 환경에서 네트워크 문제를 진단, 분석, 설정 변경을 위해 알아야 하는 필수 명령어와 활용 예시 정리
📅 마지막 업데이트: 2025-08-12
1. 필수 명령어
1.1 ip addr
(or ip a
)
네트워크 인터페이스(IP) 확인 및 설정
자주 쓰는 옵션
ip addr show
: 전체 인터페이스 IP 표시ip addr show eth0
: 특정 인터페이스만 표시ip addr add 192.168.0.10/24 dev eth0
: IP 추가ip addr del 192.168.0.10/24 dev eth0
: IP 삭제
사용 예시
Prometheus 모니터링 시스템 구축하기
테스트 페이지 - 프로메테우스 셋업
pv pvc storageclass 에 관해서
Kubernetes 스토리지 가이드: PV / PVC / StorageClass 완전 정복
버전 무관 개념 중심 정리 (CSI 기반 일반 원칙). 집/온프레미스 K8s에도 바로 적용 가능.
목차
- 빠른 요약 (TL;DR)
- 핵심 개념
- 각 오브젝트 심화
- 프로비저닝 방식
- 접근 모드 / 볼륨 모드
- 예제로 배우는 구성 패턴
- 리사이즈/스냅샷/백업
- 보안/권한/퍼미션
- 성능/운영 팁
- 트러블슈팅 체크리스트
- 자주 하는 실수
- 명령어 치트시트
- 부록: 템플릿 모음
빠른 요약 (TL;DR)
- PV: 클러스터에 실제 존재하는 저장소 리소스 (디스크 자체).
- PVC: 개발자/워크로드가 요구하는 스토리지 요청서 (용량/접근모드/클래스).
- StorageClass: PVC를 만들면 PV를 자동으로 생성하는 규칙서(드라이버 설정).
- 관계:
Pod → PVC → PV → (Storage Backend)
- 온프레미스/홈랩: NFS 또는 Local Path Provisioner, 규모가 커지면 Longhorn/Rook-Ceph 등 고려.
[Storage Backend] ←(CSI/프로비저너)— [StorageClass 규칙]
↑ ↑
└────────────── 바인딩 ───────────┘
[PVC 요청서] ← Pod가 참조
│
▼
[PV 실물]
핵심 개념
- Static Provisioning: 관리자가 먼저 PV를 생성 → 사용자는 PVC로 그 PV를 바인딩.
- Dynamic Provisioning: 사용자가 PVC만 만들면, StorageClass 규칙에 따라 PV가 자동 생성되어 바인딩.
- 접근 모드(accessModes):
ReadWriteOnce(RWO)
,ReadOnlyMany(ROX)
,ReadWriteMany(RWX)
등.- 다중 노드에서 동시에 쓰기하려면 보통 RWX가 필요(NFS/분산 스토리지).
- 볼륨 모드(volumeMode):
Filesystem
(기본) /Block
(원시 블록 디바이스). - 보존 정책(reclaimPolicy):
Delete
/Retain
/ (드라이버에 따라Recycle
은 보통 미사용).- 중요 데이터는 Retain으로 두고 수동 정리 권장.
- 바인딩 시점(volumeBindingMode):
Immediate
vsWaitForFirstConsumer
.- 후자는 Pod 스케줄링 시점에 노드/가용영역을 고려해 바인딩(클라우드/토폴로지에 유리).
- 확장(allowVolumeExpansion): PVC 사이즈 증가 허용 여부.
각 오브젝트 심화
PV (PersistentVolume)
- 무엇: “실제 디스크”를 나타내는 K8s 오브젝트.
- 주요 필드
spec.capacity.storage
: 용량(예:10Gi
)spec.accessModes
: RWO/ROX/RWXspec.volumeMode
: Filesystem/Blockspec.persistentVolumeReclaimPolicy
: Delete/Retain- 백엔드 설정:
nfs
,hostPath
,iscsi
,csi:
등 nodeAffinity
: 특정 노드에만 붙도록 제한 가능(로컬 디스크 시 유용).
- 수명: Pod와 독립. Pod가 죽어도 데이터 유지.
PVC (PersistentVolumeClaim)
- 무엇: “스토리지 요청서”(용량/접근 모드/클래스).
- 주요 필드
spec.resources.requests.storage
spec.accessModes
spec.storageClassName
spec.volumeMode
- (정적 바인딩 시)
spec.selector.matchLabels
로 특정 PV만 선택 가능.
- 상태:
Pending → Bound
로 바인딩되면 사용 가능.
StorageClass
- 무엇: “PV를 생성하는 규칙/드라이버 설정”
- 주요 필드
provisioner
: 예)kubernetes.io/no-provisioner
(정적),rancher.io/local-path
,nfs.csi.k8s.io
,ebs.csi.aws.com
등parameters
: 드라이버별 설정 (디스크 타입, fsType 등)reclaimPolicy
: Delete/RetainallowVolumeExpansion
: true/falsevolumeBindingMode
: Immediate / WaitForFirstConsumermountOptions
:noatime
등 마운트 옵션allowedTopologies
: 영역/존 한정
프로비저닝 방식
1) Static Provisioning
- 관리자가 PV를 미리 정의(NFS 경로/로컬 디스크 등).
- 사용자가 PVC를 만들면 조건 일치하는 PV와 바인딩.
- 주로 온프레미스에서 기존 NAS/NFS 공유를 잡아줄 때 단순/명확.
2) Dynamic Provisioning
- 관리자가 StorageClass와 **프로비저너(또는 CSI 드라이버)**를 배포.
- 사용자가 PVC 생성 시
storageClassName
을 명시. - 컨트롤러가 조건에 맞는 PV를 자동 생성하고 바인딩.
- 클라우드/CSI 환경, 또는 nfs-subdir-external-provisioner, local-path-provisioner 등에서 편리.
접근 모드 / 볼륨 모드
- accessModes
- RWO: 한 노드의 한 Pod(여러 Pod 가능하나 같은 노드 내)에서 읽기/쓰기.
- ROX: 여러 노드에서 읽기 전용 공유.
- RWX: 여러 노드/Pod에서 읽기/쓰기 공유(NFS/분산스토리지 필요).
- (클러스터/드라이버에 따라) ReadWriteOncePod 모드가 제공되기도 함.
- volumeMode
- Filesystem: 일반 마운트(디렉토리로 사용). 대부분의 워크로드 기본.
- Block: 파일시스템 없이 블록 디바이스로 노출(DB 특수 케이스).
예제로 배우는 구성 패턴
아래 예제의 네임스페이스는 기본(
default
) 가정. 필요 시metadata.namespace
추가.
scp 개념정리
SCP 완벽 가이드 (Kubernetes & Linux 실무용)
1) 기본 개념
scp
= SSH 위에서 파일/디렉터리를 복사하는 명령.- 형식:
scp [옵션] <src> <dst>
- 방향: 로컬→리모트, 리모트→로컬, 리모트↔리모트 모두 가능.
- 현대 OpenSSH는 기본적으로 SFTP 모드 사용 (
-O
로 레거시 scp 프로토콜 강제 가능).
2) 필수 옵션 & 패턴
자주 쓰는 옵션
옵션 | 설명 |
---|---|
-r | 디렉터리 재귀 복사 |
-p | 원본의 시간/권한 보존 |
-C | 압축 |
-l <kbps> | 대역폭 제한 |
-i <key> | 특정 프라이빗 키 사용 |
-P <port> | SSH 포트 지정 |
-o <SSH옵션> | 임시 SSH 옵션 지정 |
-J <jump> | 점프호스트 경유 |
로컬 → 리모트
scp -P 2222 ./app.jar ubuntu@worker-1:/opt/apps/
scp -rpC ./config ubuntu@worker-2:/etc/myservice/
리모트 → 로컬
scp ubuntu@master-1:/var/log/k8s/api-server.log ./logs/
리모트 ↔ 리모트
scp ubuntu@worker-1:/opt/data/dump.tar ubuntu@worker-2:/opt/backup/
scp -3 ubuntu@worker-1:/opt/data/dump.tar ubuntu@worker-2:/opt/backup/
점프호스트 경유
scp -J ubuntu@bastion:22 ./site.tgz ubuntu@worker-3:/srv/
3) 실무 레시피
특정 파일만
scp ./*.yaml ubuntu@master-1:~/manifests/
scp ubuntu@master-1:'/var/log/*.log' ./logs/
숨김파일 포함
scp -rpC ~/.bash* ~/.zshrc ubuntu@worker-1:~/
권한 문제 해결
scp ./nginx.conf ubuntu@worker-1:/tmp/
ssh ubuntu@worker-1 'sudo mv /tmp/nginx.conf /etc/nginx/nginx.conf && sudo systemctl reload nginx'
대용량 성능 최적화
tar czf - ./dataset | ssh ubuntu@worker-2 'tar xzf - -C /data/'
중단 후 재개
sftp ubuntu@worker-1
sftp> reget bigfile.img
sftp> reput bigfile.img
kubectl과 함께
kubectl cp ./config.yaml default/my-pod:/app/config.yaml
4) 보안 베스트 프랙티스
# 서버 측 설정
PasswordAuthentication no
PubkeyAuthentication yes
# 권한 설정
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys
- 호스트키 검증:
-o StrictHostKeyChecking=yes
- 점프호스트 사용
- 방화벽(UFW)로 SSH 포트 제한
- Fail2ban / Cloudflare Tunnel 고려
5) 성능/안정화 팁
scp -o Ciphers=aes128-gcm@openssh.com -C big.csv ubuntu@host:/data/
scp -l 40000 big.img ubuntu@host:/backup/
scp -o ConnectTimeout=5 -o ServerAliveInterval=10 -o ServerAliveCountMax=6 ...
6) 문제 해결 체크리스트
- Permission denied → 키/권한 확인
- Connection timed out → 방화벽/포트포워딩 확인
- 파일명 특수문자 → 따옴표 감싸기
- 원격 글로빙 문제 → 따옴표로 원격에서 해석
7) rsync와 비교
- scp: 간단, 빠른 일회성 복사
- rsync: 동기화, 재개, 검증 등 강력
8) 즐겨 쓰는 스니펫
scp -pqC ./k8s/*.yaml ubuntu@master-1:~/manifests/
scp ubuntu@worker-2:'/var/log/syslog*' ./logs/worker-2/
scp -3 ubuntu@worker-1:/opt/dump.tgz ubuntu@worker-3:/opt/backup/
tar czf - ./dataset | ssh ubuntu@worker-2 'tar xzf - -C /data/'
scp ./nginx.conf ubuntu@worker-1:/tmp/ && ssh ubuntu@worker-1 'sudo install -m 644 /tmp/nginx.conf /etc/nginx/nginx.conf && sudo systemctl reload nginx'
scp -J ubuntu@bastion ./bundle.tgz ubuntu@worker-3:/srv/
scp -l 30000 -C ./logs.tar.gz ubuntu@backup:/backup/
9) 생산성 팁
~/.ssh/config
적극 활용- 스크립트화
- 전송 후
sha256sum
비교
ssh 개념정리
SSH 완벽 가이드 (K8s & 리눅스 실무 기준)
1. SSH 키 생성과 보관
SSH 접속의 기본은 키 기반 인증입니다.
키 생성 (ed25519 권장)
ssh-keygen -t ed25519 -a 100 -C "yun@homelab" -f ~/.ssh/id_ed25519
-t ed25519
: 키 타입을 ed25519로 설정 (보안+속도)-a 100
: KDF 라운드 수 (브루트포스 방어)-C
: 키 주석(Comment)-f
: 키 저장 경로
퍼미션 설정
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
공개키 배포
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host
2. ~/.ssh/config 설정 예제
Host *
ServerAliveInterval 30
ServerAliveCountMax 3
TCPKeepAlive yes
ControlMaster auto
ControlPersist 10m
ControlPath ~/.ssh/cm-%r@%h:%p
IdentitiesOnly yes
IdentityFile ~/.ssh/id_ed25519
StrictHostKeyChecking ask
UpdateHostKeys yes
Host bastion
HostName 203.0.113.10
User yun
Host k8s-master
HostName 192.168.219.151
User cadenza
ProxyJump bastion
Host k8s-worker-1
HostName 192.168.219.181
User cadenza
ProxyJump bastion
Host k8s-worker-2
HostName 192.168.219.182
User cadenza
ProxyJump bastion
Host k8s-*
Compression yes
ForwardAgent no
3. 자주 쓰는 SSH 명령 패턴
- 디버깅:
ssh -vvv host
- 특정 키로 접속:
ssh -i ~/.ssh/otherkey host
- 특정 포트:
ssh -p 2222 host
- 원격 명령 실행:
ssh host "uptime"
- 파일 복사:
scp file.txt k8s-master:/tmp/
- 디렉토리 동기화:
rsync -avz -e ssh ./dir/ k8s-worker-1:/opt/dir/
4. 포트 포워딩 활용
로컬 포워딩 (-L)
ssh -L 16443:127.0.0.1:6443 k8s-master
→ 로컬에서 kubectl --server https://127.0.0.1:16443
가능
systemlog 에 관해서
리눅스 /var/log/syslog
와 /var/log/messages
완전 정리 (K8s 운영 관점 포함)
1. 개요
- Debian/Ubuntu 계열:
/var/log/syslog
→ 주요 시스템 로그 파일. - RHEL/CentOS/Rocky 계열:
/var/log/messages
→ 동일한 역할. - 공통점: 커널, 시스템 서비스, 사용자 애플리케이션의 일반 로그가 모임.
로그 흐름
- 커널/애플리케이션 → syslog API 호출 또는 표준 출력.
- systemd-journald 수집 → 메모리/디스크 저널에 저장.
- rsyslog/syslog-ng가 journald에서 읽어 파일(
/var/log/...
)로 기록.
2. 로그에 담기는 내용
- 커널 이벤트: 네트워크 링크 업/다운, 디스크 I/O 에러, OOM Killer.
- 시스템 서비스: kubelet, containerd, NetworkManager, CRI 플러그인.
- 사용자 공간 데몬: sshd, cron, rsyslog.
- 애플리케이션: syslog로 출력한 메시지.
예시
Aug 12 13:54:01 master-node-1 CRON[2345]: (root) CMD (/usr/local/bin/backup.sh)
Aug 12 13:54:03 worker-node-2 kernel: [12345.678901] eth0: link up
Aug 12 13:54:10 master-node-1 kubelet[1123]: Failed to pull image "nginx:latest": rpc error: ...
3. 로그 보는 방법
파일 기반
# 최신 100줄
sudo tail -n 100 /var/log/syslog
sudo tail -n 100 /var/log/messages
# 실시간 모니터링
sudo tail -f /var/log/syslog
# 특정 키워드 검색
sudo grep -i "kubelet" /var/log/syslog
journald 기반
# 현재 부팅 로그
sudo journalctl -b
# 서비스별
sudo journalctl -u kubelet
sudo journalctl -u containerd
# 심각도 필터
sudo journalctl -p err -b
# 시간 범위
sudo journalctl --since "2025-08-12 09:00" --until "2025-08-12 12:00" -u kubelet
# 커널만
sudo journalctl -k -b
4. 심각도 & 시설
- Severity: 0(emerg) ~ 7(debug)
- Facility: kern, auth, daemon, syslog, local0~local7
예시:
tee vs sed
Linux에서 tee
와 sed
사용법 (k8s.conf 예제 중심)
1. 개념
tee
- 표준 입력을 파일로 쓰는 명령어
-a
옵션이 있으면 → 기존 내용 뒤에 추가(append)-a
옵션이 없으면 → 기존 내용 덮어쓰기(overwrite)
sed
- 파일 내용을 읽어 특정 줄을 검색/수정/삭제하는 스트림 편집기
- 주로 기존 값 수정에 사용
2. 예제: /etc/sysctl.d/k8s.conf
2.1 기존 파일 내용
$ cat /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 0
3. tee
예제
3.1 내용 추가 (append)
cat << EOF | sudo tee -a /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
결과
기본네트워킹 다루기
📌 Kubernetes 네트워킹 실전 매뉴얼
목표: Kubernetes 네트워킹 개념을 중요도/빈도순으로 정리하고, 명령어 + 장애 사례 + 해결 방법 + 실전 예제를 함께 제공
1. Service 타입 & 동작원리
📖 개념
- Pod는 재시작 시 IP가 변경됨 → 고정 IP 대신 Service로 접근
- Service 종류:
- ClusterIP: 클러스터 내부 전용
- NodePort: 각 노드의 특정 포트를 외부에 개방
- LoadBalancer: 외부 LB IP를 할당
- Headless Service: DNS로 개별 Pod IP 반환
🔧 필수 명령어
kubectl get svc -A -o wide
kubectl describe svc my-service
kubectl get endpoints my-service -o wide
💡 실전 예제
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
⚠️ 자주 겪는 문제 & 해결
- 문제: Service는 있는데 Pod 연결 안 됨
원인: Selector 라벨 불일치
해결:kubectl get pod --show-labels
로 라벨 확인 후 Service 수정
2. Pod-to-Pod 통신 (CNI)
📖 개념
- CNI 플러그인(Calico, Flannel 등)이 Pod 간 네트워크를 연결
- Pod CIDR은 노드별로 분리
🔧 필수 명령어
kubectl get pods -o wide
kubectl exec -it pod-a -- ping <pod-b-ip>
kubectl exec -it pod-a -- curl http://<pod-b-ip>:<port>
💡 실전 예제
- Calico 설치
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
⚠️ 문제 & 해결
- 문제: 다른 노드 Pod 간 ping 불가
해결: CNI 포트(예: 4789/UDP, 179/TCP) 방화벽 허용
3. DNS & CoreDNS
📖 개념
- 내부 DNS 서버로 CoreDNS 사용
svc-name.namespace.svc.cluster.local
형식
🔧 필수 명령어
kubectl exec -it pod-a -- nslookup my-service
kubectl exec -it pod-a -- dig my-service +short
💡 실전 예제
- ExternalName 서비스
apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
type: ExternalName
externalName: example.com
⚠️ 문제 & 해결
- 문제: 특정 네임스페이스에서만 DNS 실패
해결: FQDN(my-service.namespace
)로 호출
4. Ingress & Ingress Controller
📖 개념
- HTTP/HTTPS 트래픽 라우팅
- Ingress Controller(NGINX, Traefik)가 실제 처리
🔧 필수 명령어
kubectl get ingress -A
kubectl describe ingress my-ingress
kubectl logs -n ingress-nginx <controller-pod>
💡 실전 예제
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
5. MetalLB / LoadBalancer
📖 개념
- 온프레미스 환경에서 LoadBalancer 타입 구현
- L2/L3 모드
🔧 필수 명령어
kubectl get ipaddresspool -n metallb-system
kubectl get l2advertisement -n metallb-system
💡 실전 예제
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 192.168.0.240-192.168.0.250
6. NetworkPolicy
📖 개념
- Pod 간 트래픽 제어
🔧 필수 명령어
kubectl get netpol -A
kubectl describe netpol my-policy
💡 실전 예제
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-nginx
spec:
podSelector:
matchLabels:
app: nginx
ingress:
- from:
- podSelector:
matchLabels:
app: allowed-app
ports:
- protocol: TCP
port: 80
7. Node-to-Pod & 외부 통신
📖 개념
- ExternalTrafficPolicy=Local → 클라이언트 IP 유지
- ExternalTrafficPolicy=Cluster → 로드밸런싱
💡 실전 팁
kubectl edit svc my-service
# spec.externalTrafficPolicy: Local
8. Port Forwarding
kubectl port-forward svc/my-service 8080:80
9. kube-proxy & iptables/IPVS
📖 개념
- Service IP → Pod IP 변환 처리
- iptables vs ipvs 모드
💡 상태 확인
kubectl get configmap kube-proxy -n kube-system -o yaml
10. 네트워크 트러블슈팅 명령어 모음
kubectl get pod -o wide
kubectl get svc -o wide
kubectl exec -it <pod> -- traceroute <ip>
kubectl exec -it <pod> -- tcpdump -i eth0 port 80
📌 Best Practice 모음
- 서비스 라벨 규칙 표준화 → Selector 오류 방지
- CNI 선택 시 성능/보안 고려 → Calico(CNI+NetworkPolicy), Cilium(eBPF)
- Ingress는 TLS 필수 → cert-manager로 자동 발급
- MetalLB IP Pool은 DHCP 범위와 겹치지 않게
- NetworkPolicy는 점진적 적용
- 모든 네트워크 구성은 IaC(GitOps)로 관리
- 테스트용 PortForward 적극 활용
네트워크설정(netplan)
Linux 네트워크 설정 (/etc/network/interfaces & /etc/netplan) 완벽 가이드
1. 어떤 방식을 쓰는지 확인/선택
- Ubuntu 16.04 이하 / Debian →
/etc/network/interfaces
(ifupdown/ifupdown2) - Ubuntu 18.04+ →
/etc/netplan/*.yaml
(renderer:systemd-networkd
orNetworkManager
)
# netplan 사용 여부
which netplan && ls /etc/netplan
# 현재 렌더러 확인
networkctl --version
홈 k8s 서버라면: netplan + renderer: networkd 권장
2. 공통 운영 팁
- 원격 수정 시
netplan try
로 롤백 가능 - K8s 노드 IP는 고정 IP 또는 DHCP 예약 권장
- 오버레이 네트워크 MTU 조정 필요
- VLAN, bond 등으로 네트워크 분리 가능
3. /etc/network/interfaces
방식 예제
auto lo
iface lo inet loopback
# DHCP
auto enp3s0
iface enp3s0 inet dhcp
# Static IPv4
auto enp3s0
iface enp3s0 inet static
address 192.168.10.21/24
gateway 192.168.10.1
dns-nameservers 1.1.1.1 8.8.8.8
mtu 1500
# Static IPv6
iface enp3s0 inet6 static
address 2001:db8:1::21/64
gateway 2001:db8:1::1
dns-nameservers 2606:4700:4700::1111
적용:
디스크 용량, 사용량 확인
Ubuntu 기준 디스크 용량 및 사용량 확인 가이드
이 문서는 Ubuntu 리눅스 환경에서 디스크의 물리적인 총 용량과 현재 사용 중인 용량을 확인하는 방법에 대해 자세히 설명합니다.
📌 1. df
명령어 - 디스크 사용량 확인
기본 사용법
df -h
-h
: 사람이 읽기 쉬운 단위로 출력 (KB, MB, GB 등)
예시 출력
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 20G 75G 22% /
tmpfs 16G 1.0M 16G 1% /dev/shm
유용한 옵션
옵션 | 설명 |
---|---|
-h | Human-readable (단위 표기) |
-T | 파일시스템 유형 표시 |
--total | 총합 정보 표시 |
-a | 모든 파일시스템 포함 (사용 안 되는 것도 포함) |
예시
df -hT
df -h --total
📌 2. lsblk
명령어 - 물리 디스크 및 파티션 확인
기본 사용법
lsblk
출력 예시
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
└─sda1 8:1 0 100G 0 part /
유용한 옵션
옵션 | 설명 |
---|---|
-f | 파일 시스템 포함 출력 |
-o | 출력 필드 지정 |
예시
lsblk -f
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
📌 3. du
명령어 - 디렉토리별 디스크 사용량 확인
예시: 루트 디렉토리의 사용량 요약
sudo du -sh /*
-s
: 합계만 표시-h
: 사람이 읽기 쉬운 단위로 표시
특정 디렉토리 하위 전체 확인
du -h --max-depth=1 /home
📌 4. df
+ grep
으로 특정 마운트 포인트 확인
df -h | grep '/$'
📌 5. mount
명령어로 마운트 정보 확인
mount | column -t
📌 6. 디스크 용량 시각화 도구
ncdu
- 인터랙티브한 디스크 사용량 확인 도구
sudo apt install ncdu
sudo ncdu /
📌 7. ls -lh
명령어 - 디렉토리 내 파일 크기 확인
ls -lh /var/log
-l
: 자세히-h
: 사람 읽기 쉬운 단위
📌 8. 블록 디바이스 정보 - blkid
sudo blkid
📌 9. 디스크 스마트 정보 확인 - smartctl
sudo apt install smartmontools
sudo smartctl -a /dev/sda
✅ 요약
목적 | 명령어 |
---|---|
전체 디스크 사용량 요약 | df -h |
물리 디스크 확인 | lsblk |
디렉토리 사용량 | du -sh /* |
시각적 디스크 탐색 | ncdu / |
파일별 크기 확인 | ls -lh |
마운트된 디스크만 확인 | `df -h |
이 문서는 Ubuntu 및 일반적인 Linux 배포판에서 디스크 상태를 점검할 때 매우 유용합니다.
중요하고 자주 사용하는 설정들
리눅스에서 자주 사용하고 중요한 설정 파일 목록 (K8s 포함)
쿠버네티스(K8s) 환경에서 특히 자주 보게 되는 리눅스 기본 설정 파일과 네트워크 관련 설정 파일을 사용 빈도와 중요도 순으로 정리했습니다.
1. /etc/hosts
- 용도: 호스트명과 IP 주소를 수동으로 매핑
- K8s에서: 내부 테스트, DNS 문제 시 임시 호스트명 매핑
- 예시
127.0.0.1 localhost
192.168.0.10 master-node
192.168.0.11 worker-node-1
- 명령어 참고
cat /etc/hosts
sudo nano /etc/hosts
2. /etc/resolv.conf
- 용도: DNS 서버 설정
- K8s에서: CoreDNS 설정 확인, DNS 장애 트러블슈팅 시 필수
- 예시
nameserver 8.8.8.8
nameserver 1.1.1.1
search cluster.local
- 명령어 참고
cat /etc/resolv.conf
3. /etc/hostname
- 용도: 서버의 호스트명 지정
- K8s에서: 노드명 변경 시 참고
- 예시
master-node
- 명령어 참고
hostname
sudo hostnamectl set-hostname new-name
4. /etc/fstab
- 용도: 부팅 시 자동 마운트할 파일 시스템 정의
- K8s에서: PV(Local Path, NFS 등) 사용 시 마운트 설정 확인
- 예시
UUID=xxxx-xxxx /data ext4 defaults 0 2
- 명령어 참고
cat /etc/fstab
5. /etc/systemd/system/
- 용도: 사용자 정의 systemd 서비스 파일
- K8s에서: kubelet, containerd 등 서비스 설정
- 예시
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
- 명령어 참고
systemctl status kubelet
6. /etc/sysctl.conf & /etc/sysctl.d/
- 용도: 커널 파라미터 설정
- K8s에서: 네트워크 패킷 포워딩, 브리지 관련 설정 필수
- 예시
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
- 명령어 참고
sysctl -a
sudo sysctl --system
7. /etc/security/limits.conf
- 용도: 프로세스별 리소스 제한
- K8s에서: etcd, Elasticsearch 등 메모리/파일 핸들 제한 설정
- 예시
* soft nofile 65535
* hard nofile 65535
8. /etc/profile & ~/.bashrc
- 용도: 환경 변수 설정
- K8s에서: PATH, alias, kubeconfig 경로 설정
- 예시
export KUBECONFIG=/etc/kubernetes/admin.conf
alias k=kubectl
9. /etc/network/interfaces 또는 /etc/netplan/
- 용도: 네트워크 인터페이스 IP 설정
- K8s에서: 노드 고정 IP 지정
- 예시 (netplan)
network:
ethernets:
eth0:
addresses: [192.168.0.10/24]
gateway4: 192.168.0.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
version: 2
10. /etc/ssh/sshd_config
- 용도: SSH 서버 설정
- K8s에서: 노드 원격 접속 보안 설정
- 예시
Port 22
PermitRootLogin no
PasswordAuthentication no
11. /var/log/syslog & /var/log/messages
- 용도: 시스템 로그
- K8s에서: 네트워크/DNS 문제, kubelet 오류 확인
- 명령어 참고
tail -f /var/log/syslog
journalctl -u kubelet -f
12. /etc/modules-load.d/
- 용도: 부팅 시 로드할 커널 모듈 지정
- K8s에서:
br_netfilter
,overlay
필수 - 예시
overlay
br_netfilter
13. /etc/containerd/config.toml
- 용도: containerd 설정
- K8s에서:
SystemdCgroup = true
설정 필요 - 명령어 참고
sudo systemctl restart containerd
14. /etc/kubernetes/
- 용도: K8s 마스터 노드 설정 파일
- 예시
/etc/kubernetes/admin.conf
/etc/kubernetes/manifests/kube-apiserver.yaml
15. /etc/crontab & /etc/cron.*
- 용도: 주기적 작업 예약
- K8s에서: 백업, 로그 정리 등
- 예시
0 2 * * * root /usr/local/bin/backup.sh
참고
이 목록은 K8s 홈랩 환경과 운영 리눅스 서버 모두에서 중요한 파일 위주로 선정했습니다.