Oracle Cloud Infrastructure (OCI)์์ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์๋์ผ๋ก ํ๋ก๋น์ ๋ํ๋ Pulumi ๊ธฐ๋ฐ ์ธํ๋ผ์คํธ๋ญ์ฒ ํ๋ก์ ํธ์ ๋๋ค.
- ๋ฉํฐ ๋ฆฌ์ OKE ํด๋ฌ์คํฐ: ์์ธ(se)๊ณผ ์ค์ฌ์นด(os) ๋ฆฌ์ ์ Kubernetes ํด๋ฌ์คํฐ ์๋ ์์ฑ
- ๋คํธ์ํน: VCN, ์๋ธ๋ท, ๊ฒ์ดํธ์จ์ด, ๋ณด์ ๊ทธ๋ฃน ์๋ ๊ตฌ์ฑ
- IAM ๊ด๋ฆฌ: ํ์ํ ์ ์ฑ ๋ฐ ๊ทธ๋ฃน ์๋ ์์ฑ
- ํด๋ฌ์คํฐ ํผ์ด๋ง: ๋ฆฌ์ ๊ฐ ๋คํธ์ํฌ ์ฐ๊ฒฐ ์ค์
- ๋ก๋ ๋ฐธ๋ฐ์: ์๋น์ค ๋ ธ์ถ์ ์ํ ๋ก๋ ๋ฐธ๋ฐ์ ์๋ธ๋ท ๊ตฌ์ฑ
- OCI ๊ณ์ ์์ฑ ๋ฐ ์ด๊ธฐ ์ค์
- ๋๋ฉ์ธ ๊ด๋ฆฌ (Cloudflare DNS ์ค์ ์ ๋ณ๋ ํ์)
- ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ (Kubernetes ํด๋ฌ์คํฐ๋ง ์ ๊ณต)
- SSL ์ธ์ฆ์ ๊ด๋ฆฌ
- ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น ์๋ฃจ์
-
OCI ๊ณ์ ์์ฑ
- Oracle Cloud ๊ฐ์
- Always Free Tier ๋๋ Pay-as-you-go ๊ณ์ ์์ฑ
-
OCI CLI ์ค์น
# macOS brew install oci-cli # Linux bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)" # Windows # PowerShell์์ ์คํ powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.ps1'))"
-
OCI CLI ์ค์
oci setup config
- User OCID, Tenancy OCID, Region, Private Key Path ์ ๋ ฅ
- API Key๋ฅผ OCI ์ฝ์์์ ๋ฑ๋ก
-
Python 3.8+ ์ค์น
-
Pulumi ์ค์น
# macOS brew install pulumi # Linux/Windows curl -fsSL https://get.pulumi.com | sh
-
Pulumi ๊ณ์ ์ค์
pulumi login
# ํ๋ก์ ํธ ํด๋ก
git clone https://github.com/flexyzwork/pulumi-python-oke-infrastructure.git
cd pulumi-python-oke-infrastructure
# ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
make install
OCI ์ฝ์์์ ๋ค์ ๋จ๊ณ๋ฅผ ์ํ:
- Identity & Security โ ๋๋ฉ์ธ ์ด๋
- ํ์ฌ ๋๋ฉ์ธ์ ๊ทธ๋ฃน ๋งํฌ ํด๋ฆญ
- ๊ทธ๋ฃน ํญ์์ Administrators ์ ํ
- Administrators์ OCID ๋ณต์ฌ (๋์ค์ config.json์์ ์ฌ์ฉ)
- Identity & Security โ ๋๋ฉ์ธ ์ด๋
- ํ์ฌ ๋๋ฉ์ธ์ ์ฌ์ฉ์ ๋งํฌ ํด๋ฆญ
- ๋ณธ์ธ ์ฌ์ฉ์ ๊ฒ์ ํ ์ ํ - Administrators ๊ทธ๋ฃน์ ์ถ๊ฐ
- Identity & Security โ Policies ์ด๋
- Create Policy ํด๋ฆญ
- ์ ์ฑ
์ ๋ณด ์
๋ ฅ:
- Name:
Tenant Admin Policy
- Description:
Admin policy for OCI infrastructure
- Compartment: Root compartment ์ ํ
- Name:
- Policy Builder์์ ๋ค์ ์ ์ฑ
์ถ๊ฐ:
ALLOW GROUP Administrators to manage all-resources IN TENANCY
๊ฐ ๋ฆฌ์ ์์ ๋ค์ ์ ๋ณด๋ฅผ ํ์ธ:
# ์์ธ ๋ฆฌ์ ์ค์
export OCI_CLI_REGION=ap-seoul-1
# ๊ฐ์ฉ์ฑ ๋๋ฉ์ธ ์กฐํ
oci iam availability-domain list --compartment-id <your-tenancy-ocid>
# Oracle Linux ์ด๋ฏธ์ง ์กฐํ (ARM ๊ธฐ๋ฐ)
oci compute image list --compartment-id <your-tenancy-ocid> --operating-system "Oracle Linux" --shape "VM.Standard.A1.Flex"
# ์ค์ฌ์นด ๋ฆฌ์ ๋ ๋์ผํ๊ฒ ์ํ
export OCI_CLI_REGION=ap-osaka-1
# ์ ๋ช
๋ น์ด๋ค ์ฌ์คํ
Pulumi config์ SSH ๊ณต๊ฐํค๋ฅผ ์ค์ :
pulumi config set --secret ssh_public_key "your-ssh-public-key"
# ์์
pulumi config set --secret ssh_public_key "ssh-ed25519 AAAAC3NzaC1lZ......"
pulumi.prod.yaml ํ์ผ์ ์ํธํ๋์ด ์ ์ฅ๋จ
# ์์ ํ์ผ ๋ณต์ฌ
cp config.json.example config.json
config.json
ํ์ผ์ ํธ์งํ์ฌ ์ค์ ๊ฐ์ผ๋ก ์
๋ฐ์ดํธ:
{
"peer_map": {
"se": ["os"]
},
"home_region": "os",
"node": {
"kubernetes_version": "v1.32.1",
"node_pool_name": "pool1",
"node_pool_size": 2,
"node_shape": "VM.Standard.A1.Flex",
"node_memory_gbs": 12,
"node_ocpus": 2
},
"regions": {
"se": {
"availability_domain": "YOUR_SEOUL_AD",
"service_cidr": "all-icn-services-in-oracle-services-network",
"service_id": "YOUR_SEOUL_SERVICE_ID",
"image_id": "YOUR_SEOUL_IMAGE_ID",
"vcn_cidr_block": "10.10.0.0/16",
"node_subnet_cidr_block": "10.10.10.0/24",
"k8s_api_subnet_cidr_block": "10.10.20.0/24",
"service_lb_subnet_cidr_block": "10.10.30.0/24",
"admin_group_id": "YOUR_ADMIN_GROUP_OCID"
},
"os": {
"availability_domain": "YOUR_OSAKA_AD",
"service_cidr": "all-kix-services-in-oracle-services-network",
"service_id": "YOUR_OSAKA_SERVICE_ID",
"image_id": "YOUR_OSAKA_IMAGE_ID",
"vcn_cidr_block": "10.30.0.0/16",
"node_subnet_cidr_block": "10.30.10.0/24",
"k8s_api_subnet_cidr_block": "10.30.20.0/24",
"service_lb_subnet_cidr_block": "10.30.30.0/24",
"admin_group_id": "YOUR_ADMIN_GROUP_OCID"
}
}
}
# ์ ์คํ ์์ฑ
pulumi stack init prod
# ์คํ ํ์ธ
pulumi stack ls -a
NAME LAST UPDATE RESOURCE COUNT URL
prod* n/a n/a https://app.pulumi.com/flexyzwork/oke-infra/prod
# ์คํ ์ ํ (์ฐธ๊ณ )
pulumi stack select prod
# ์ค์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
make preview
# ์ ์ฒด ์ธํ๋ผ์คํธ๋ญ์ฒ ๋ฐฐํฌ
make up
๋ฐฐํฌ๋ ์ฝ 10-15๋ถ ์์๋ฉ๋๋ค.
# Pulumi ์คํ ์ํ ํ์ธ
pulumi stack ls
# ๋ฆฌ์์ค ์ํ ํ์ธ
pulumi stack output
OKE ํด๋ฌ์คํฐ์ kubeconfig๋ ~/.kube/config-<region>
ํ์ผ์ ์ ์ฅ ๋์ด ์์
# ๊ฐ ํ๊ฒฝ๋ณ kubeconfig ๋ค์ด๋ก๋ (์ฐธ๊ณ )
oci ce cluster create-kubeconfig --cluster-id <cluster-id> --file ~/.kube/config-os
oci ce cluster create-kubeconfig --cluster-id <cluster-id> --file ~/.kube/config-se
# ์ปจํ
์คํธ ์ ํ
export KUBECONFIG=~/.kube/config-se
kubectl get nodes
export KUBECONFIG=~/.kube/config-os
kubectl get nodes
์์
Outputs:
os-public_ip_address : "146.56.141.88"
se-public_ip_address : "152.52.142.77"
Cloudflare DNS์์ ๋๋ฉ์ธ ์ฐ๊ฒฐ:
.
โโโ __main__.py # Pulumi ๋ฉ์ธ ์ง์
์
โโโ cluster/ # OKE ํด๋ฌ์คํฐ ๊ด๋ฆฌ
โโโ compartment/ # OCI Compartment ๊ด๋ฆฌ
โโโ config/ # ์ค์ ๊ด๋ฆฌ
โโโ iam/ # IAM ์ ์ฑ
๋ฐ ๊ทธ๋ฃน ๊ด๋ฆฌ
โโโ network/ # VCN, ์๋ธ๋ท, ๋ณด์ ๊ทธ๋ฃน ๊ด๋ฆฌ
โโโ utils/ # ์ ํธ๋ฆฌํฐ ํจ์
โโโ config.json # ์ค์ ํ๊ฒฝ ์ค์ (์์ฑ ํ์)
โโโ config.json.example # ์ค์ ์์ ํ์ผ
โโโ Makefile # ๋น๋ ๋ฐ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ
# ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
make install
# ์ค์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
make preview
# ์ธํ๋ผ์คํธ๋ญ์ฒ ๋ฐฐํฌ
make up
# ์ธํ๋ผ์คํธ๋ญ์ฒ ์ญ์
make destroy
# ๋ก๊ทธ ํ์ธ
tail -f app.log
- ๋น์ฉ: VM.Standard.A1.Flex ์ธ์คํด์ค๋ Always Free Tier์ ํฌํจ๋์ง๋ง, ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํ์ธ์
- ๋ฆฌ์ ์ ํ: ์ผ๋ถ ๋ฆฌ์ ์์๋ A1 ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ์ ์์ ์ ์์ต๋๋ค
- ๋ฆฌ์์ค ํ๋: OCI ๊ณ์ ์ ์๋น์ค ํ๋๋ฅผ ํ์ธํ์ธ์
- ๋คํธ์ํฌ: CIDR ๋ธ๋ก์ด ๊ฒน์น์ง ์๋๋ก ์ฃผ์ํ์ธ์
-
Authentication Error
# OCI CLI ์ค์ ์ฌํ์ธ oci setup config
-
Capacity Issue
- ๋ค๋ฅธ ๊ฐ์ฉ์ฑ ๋๋ฉ์ธ ์๋
- ๋ค๋ฅธ ์ธ์คํด์ค ํ์ ์๋
-
Network CIDR Conflict
- config.json์ CIDR ๋ธ๋ก ์์
-
Policy Errors
- IAM ์ ์ฑ ๋ฐ ๊ทธ๋ฃน ์ค์ ์ฌํ์ธ
# ์ ํ๋ฆฌ์ผ์ด์
๋ก๊ทธ
tail -f app.log
# Pulumi ๋ก๊ทธ
pulumi logs
์ด์๋ ๊ฐ์ ์ฌํญ์ด ์์ผ์๋ฉด GitHub Issues๋ฅผ ํตํด ์๋ ค์ฃผ์ธ์.
MIT License