티스토리 뷰
Oracle Cloud + Tailscale + Kubernetes 완벽 가이드(1)
pak2251 2025. 10. 26. 19:241단계: Oracle Cloud 준비 및 설정
시리즈: Oracle Cloud + Tailscale + Kubernetes 완벽 가이드
다음: 2단계: Tailscale 메시 네트워크 구성 →
Oracle Cloud 무료 계정 생성부터 인스턴스 준비까지
📋 이 단계에서 할 일
- Oracle Cloud 무료 계정 생성 (필요한 만큼)
- ARM64 인스턴스 생성
- VCN 및 보안 규칙 설정
- 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 레벨 방화벽은 비활성화합니다.
비활성화하는 이유:
- 중복 제어: Oracle Cloud Security List로 충분
- CNI 충돌 방지: Cilium/iptables와 firewalld 충돌 가능
- 트러블슈팅 단순화: 네트워크 문제 발생 시 원인 파악 용이
- 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 메시 네트워크 구성
'실제 경험과 인사이트를 AI와 함께 정리한 글' 카테고리의 다른 글
| Oracle Cloud + Tailscale + Kubernetes 완벽 가이드(3) (0) | 2025.10.26 |
|---|---|
| Oracle Cloud + Tailscale + Kubernetes 완벽 가이드(2) (0) | 2025.10.26 |
| Oracle Cloud + Tailscale + Kubernetes 완벽 가이드(0) (0) | 2025.10.26 |
| Kubernetes 기반 데이터베이스 Operator - MongoDB Replica Set 관리 (1) | 2025.10.22 |
| Kubernetes Namespace 삭제 전쟁: 18시간의 Terminating과의 싸움 (0) | 2025.10.22 |
- Total
- Today
- Yesterday
- api gateway
- AI agent
- workflow
- architecture
- authentication
- security
- Tax Analysis
- ai 개발 도구
- AI
- LangChain
- Ontology
- Kubernetes
- backend
- PYTHON
- Claude
- authorization
- claude code
- troubleshooting
- Next.js
- LLM
- react
- knowledge graph
- Rag
- Tailwind CSS
- Developer Tools
- frontend
- AI Development
- 개발 도구
- SHACL
- Go
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
