티스토리 뷰

1단계: Oracle Cloud 준비 및 설정

시리즈: Oracle Cloud + Tailscale + Kubernetes 완벽 가이드
다음: 2단계: Tailscale 메시 네트워크 구성


Oracle Cloud 무료 계정 생성부터 인스턴스 준비까지

📋 이 단계에서 할 일

  1. Oracle Cloud 무료 계정 생성 (필요한 만큼)
  2. ARM64 인스턴스 생성
  3. VCN 및 보안 규칙 설정
  4. SSH 접속 및 초기 설정

🆓 Oracle Cloud 무료 계정

무료 제공 사양

  • ARM64 (Ampere A1): 4 OCPU + 24GB RAM
  • 스토리지: Boot Volume + Block Volume 합계 200GB, Boot Volume 단독 200GB 가능 (공식 문서)
  • 네트워크: 10TB/월 아웃바운드
  • 기간: 영구 무료 (Free Tier)

멀티 노드 구성 팁

Oracle Cloud는 계정당 ARM 인스턴스를 1개만 허용합니다.
멀티 노드 클러스터를 구성하려면:

  • 가족/친구 계정 활용
  • 각 계정에서 인스턴스 생성
  • Tailscale로 네트워크 연결

🖥️ 인스턴스 생성

1. Compute 인스턴스 생성

Compute → Instances → Create Instance

Shape 선택

  • Shape: VM.Standard.A1.Flex (ARM64)
  • Operating System: Oracle Linux 8 (최신)

리소스 할당

노드 역할 OCPU Memory Boot Volume 용도
Master 4 24GB 200GB Control Plane, etcd
Worker 4 24GB 200GB 워크로드 실행

스토리지 설계: Boot Volume 200GB 단일 구성

인스턴스 생성 시 Boot Volume을 200GB로 지정한다. 무료 티어 200GB를 Boot Volume에 전부 할당하는 방식이다.

Block Volume을 별도로 분리하지 않는 이유는 Kubernetes의 kubelet이 ephemeral-storage를 루트 파일시스템(/) 파티션 기준으로 계산하기 때문이다. Block Volume을 별도 마운트하면 kubelet이 인식하지 못하고, iSCSI로 LVM에 합치면 재부팅 시 initramfs 단계에서 iSCSI가 연결되기 전에 LVM 조립이 실패하여 부팅이 불가능해진다.

네트워킹

  • Public IP: 반드시 할당 ✅
  • Private Subnet: 기본값 사용

SSH 키

# 로컬에서 SSH 키 생성 (없는 경우)
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"

# 공개 키 내용 복사
cat ~/.ssh/id_rsa.pub

Oracle Cloud 콘솔에 공개 키 붙여넣기

2. 인스턴스 생성 완료 후

생성된 인스턴스 정보 메모:

  • Public IP: X.X.X.X
  • Private IP: 10.0.0.X (VCN 내부)
  • Hostname: instance-YYYYMMDD-HHMM

💾 루트 파티션 확장

Oracle Linux은 Boot Volume을 200GB로 지정해도 OS 이미지 기준(50GB)으로 파티션을 생성한다. 디스크는 200GB이지만 파티션과 LVM은 50GB 범위만 사용하므로, 수동 확장이 필요하다.

1. 불필요한 서비스 중지 및 oled 파티션 회수

/var/oled는 Oracle Linux Event Daemon 전용 파티션(15GB)이다. Kubernetes 노드에서는 불필요하므로 회수한다.

# 불필요한 서비스 중지
sudo systemctl stop oracle-cloud-agent oracle-cloud-agent-updater
sudo systemctl disable oracle-cloud-agent oracle-cloud-agent-updater
sudo systemctl stop pmcd pmie pmlogger
sudo systemctl disable pmcd pmie pmlogger

# oled 언마운트 및 LV 제거
sudo umount /var/oled
sudo lvremove -y /dev/ocivolume/oled
sudo sed -i '/oled/d' /etc/fstab

2. 파티션 → PV → LV → 파일시스템 순서로 확장

# sda3 파티션을 디스크 끝까지 확장
sudo growpart /dev/sda 3

# LVM Physical Volume 크기 갱신
sudo pvresize /dev/sda3

# 여유 공간 전부를 root LV에 할당
sudo lvextend -l +100%FREE /dev/ocivolume/root

# XFS 파일시스템 확장 (온라인, 재부팅 불필요)
sudo xfs_growfs /

# 결과 확인
df -h /
# Filesystem                  Size  Used Avail Use% Mounted on
# /dev/mapper/ocivolume-root  198G   11G  188G   6% /

루트 파티션이 약 198GB로 확장된다. kubelet은 이 전체 용량을 ephemeral-storage로 인식한다.

🔐 VCN 보안 설정

Security List 편집

Networking → Virtual Cloud Networks → VCN 선택 → Security Lists → Default Security List

Ingress Rules 추가

모든 규칙에서 Stateless: No 설정

공통 (모든 노드)

Source Protocol Port 설명
0.0.0.0/0 TCP 22 SSH 접속
0.0.0.0/0 UDP 41641 Tailscale WireGuard
100.64.0.0/10 TCP 10250 Kubelet API
100.64.0.0/10 UDP 8472 Cilium VXLAN
100.64.0.0/10 TCP 4240 Cilium Health
100.64.0.0/10 TCP 4244 Cilium Hubble

마스터 노드 전용

Source Protocol Port 설명
0.0.0.0/0 TCP 6443 Kubernetes API Server
100.64.0.0/10 TCP 2379-2380 etcd
100.64.0.0/10 TCP 10251 kube-scheduler
100.64.0.0/10 TCP 10252 kube-controller-manager
100.64.0.0/10 TCP 10257 kube-controller-manager (secure)
100.64.0.0/10 TCP 10259 kube-scheduler (secure)

API 게이트웨이 노출 (마스터 또는 지정된 노드)

Source Protocol Port 설명 대상
0.0.0.0/0 TCP 80 HTTP (리다이렉트) 모든 노드
0.0.0.0/0 TCP 443 HTTPS 모든 노드
0.0.0.0/0 TCP 20443 Headscale HTTPS 마스터 (Headscale 서버)
0.0.0.0/0 TCP 30000-32767 NodePort Services 모든 노드

참고: 100.64.0.0/10은 Tailscale 네트워크 대역입니다

Egress Rules

  • Destination: 0.0.0.0/0
  • Protocol: All Protocols
  • 설명: 모든 아웃바운드 트래픽 허용

🛡️ OS 방화벽 설정

firewalld 비활성화 (권장)

Oracle Cloud Security List로 이미 방화벽이 제어되므로, OS 레벨 방화벽은 비활성화합니다.

비활성화하는 이유:

  1. 중복 제어: Oracle Cloud Security List로 충분
  2. CNI 충돌 방지: Cilium/iptables와 firewalld 충돌 가능
  3. 트러블슈팅 단순화: 네트워크 문제 발생 시 원인 파악 용이
  4. Kubernetes 권장사항: 대부분의 설치 가이드에서 OS 방화벽 비활성화
# SSH 접속
ssh -i ~/.ssh/id_rsa opc@<PUBLIC_IP>

# firewalld 중지 및 비활성화
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# 상태 확인 (inactive 확인)
sudo systemctl status firewalld

📝 초기 시스템 설정

1. 시스템 업데이트

# 패키지 업데이트
sudo dnf update -y

# 재부팅 (커널 업데이트 시)
sudo reboot

2. 필수 패키지 설치

# 기본 도구
sudo dnf install -y \
  vim \
  git \
  curl \
  wget \
  net-tools \
  nc \
  telnet \
  tree \
  htop

# 시간 동기화
sudo systemctl enable --now chronyd
timedatectl status

3. SELinux 설정 (Oracle Linux)

# SELinux를 Permissive 모드로 설정
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 확인
sestatus

4. 스왑 비활성화

Kubernetes는 스왑을 사용하지 않습니다:

# 스왑 비활성화
sudo swapoff -a

# 영구 비활성화
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 확인
free -h

5. 커널 파라미터 설정 (한 번에 모두)

# 커널 모듈 자동 로드 설정
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 모든 sysctl 파라미터 한 번에 설정
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes.conf
# Kubernetes 기본 요구사항
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1

# Tailscale 최적화
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 6

# 파일 디스크립터 증가 (많은 Pod/Container 지원)
fs.inotify.max_user_watches = 1048576
fs.inotify.max_user_instances = 1024

# Cilium CNI 기본 요구사항
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0

# Cilium eBPF 최적화
kernel.unprivileged_bpf_disabled = 1
net.core.bpf_jit_enable = 1
net.core.bpf_jit_harden = 0
net.core.bpf_jit_kallsyms = 1
kernel.bpf_stats_enabled = 1

# 연결 추적 테이블 크기 (eBPF LB용)
net.netfilter.nf_conntrack_max = 1000000
net.netfilter.nf_conntrack_buckets = 250000
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 3600

# 네트워크 성능 최적화
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8096
net.core.netdev_max_backlog = 5000
net.ipv4.neigh.default.gc_thresh1 = 8000
net.ipv4.neigh.default.gc_thresh2 = 12000
net.ipv4.neigh.default.gc_thresh3 = 16000
EOF

# 설정 적용
sudo sysctl --system

# 확인
lsmod | grep br_netfilter
lsmod | grep overlay
sysctl net.bridge.bridge-nf-call-iptables
sysctl net.ipv4.ip_forward

📋 체크리스트

각 노드에서 확인:

인프라 설정

  • Oracle Cloud 인스턴스 생성 완료
  • Public IP 할당 확인
  • Security List 규칙 추가
  • SSH 접속 가능
  • firewalld 비활성화 완료

스토리지 설정

  • Boot Volume 200GB로 인스턴스 생성 확인
  • oled 파티션 회수 (lvremove)
  • root LV 확장 (lvextend + xfs_growfs)
  • df -h /로 ~195GB 확인

시스템 설정

  • 시스템 업데이트 완료
  • SELinux Permissive 모드
  • 스왑 비활성화
  • 커널 모듈 로드 (overlay, br_netfilter)
  • sysctl 파라미터 적용

🔄 다음 단계

모든 노드가 준비되면:
02-setup-tailscale-network.md - Tailscale 메시 네트워크 구성

💡 팁

ARM vs x86 선택

  • ARM64 추천: 무료 리소스가 더 많음 (4 OCPU vs 2 OCPU)
  • 대부분의 컨테이너 이미지가 ARM64 지원

인스턴스가 생성되지 않을 때

  • 용량 부족: 다른 가용 도메인(AD) 시도
  • 시간대 변경: 새벽 시간대 시도
  • Shape 변경: AMD (x86) 시도

SSH 접속 문제

# 권한 문제 해결
chmod 600 ~/.ssh/id_rsa

# 상세 로그 확인
ssh -vvv -i ~/.ssh/id_rsa opc@<PUBLIC_IP>

다음 문서: Tailscale 메시 네트워크 구성

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함