클라우드 초기화
cloud-init는 클라우드 인스턴스 초기화를 위한 업계 표준 도구로, 처음 부팅할 때 시스템 구성을 자동으로 완료합니다. Ubuntu 26.04 Server는 cloud-init가 사전 설치되어 제공되며 AWS, Azure, GCP 등과 같은 주요 클라우드 플랫폼을 지원합니다.
작동 방식
cloud-init는 인스턴스 시작 중에 다음 단계를 통해 실행됩니다.
- 생성기 - 인스턴스가 클라우드 환경에서 실행 중인지 감지합니다.
- 로컬 - 로컬 데이터 소스에서 네트워크 구성을 가져옵니다.
- 네트워크 - 메타데이터 및 사용자 데이터를 가져옵니다.
- 구성 - 구성 모듈을 실행합니다.
- 최종 - 최종 모듈을 실행합니다(예: 스크립트 실행).
# Check cloud-init version
cloud-init --version
# Check cloud-init status
cloud-init status
# View detailed status
cloud-init status --long데이터 소스
메타데이터
인스턴스 ID, IP 주소, 호스트 이름 등을 포함하여 클라우드 플랫폼에서 제공하는 인스턴스 메타데이터:
# Retrieve metadata on AWS EC2 (IMDSv2)
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
# Retrieve metadata on GCP
curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/
# Retrieve metadata on Azure
curl -H "Metadata: true" "http://169.254.169.254/metadata/instance?api-version=2021-02-01"사용자 데이터
다양한 형식을 지원하는 사용자 정의 초기화 구성입니다.
사용자 데이터 구성
클라우드 구성 형식(가장 일반적)
#cloud-config으로 시작하는 YAML 파일:
#cloud-config
# Set hostname
hostname: web-server-01
fqdn: web-server-01.example.com
# Create users
users:
- name: deploy
groups: sudo, docker
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAA... deploy@workstation
- name: monitor
groups: []
shell: /bin/bash
ssh_authorized_keys:
- ssh-ed25519 AAAA... monitor@management
# Set timezone
timezone: America/New_York
# NTP configuration
ntp:
enabled: true
servers:
- pool.ntp.org
- time.google.com
# Locale
locale: en_US.UTF-8
# Change APT mirror
apt:
primary:
- arches: [default]
uri: http://archive.ubuntu.com/ubuntu
# Install packages
packages:
- nginx
- docker.io
- fail2ban
- htop
- curl
- vim
# Upgrade all packages
package_update: true
package_upgrade: true
package_reboot_if_required: true
# Write files
write_files:
- path: /etc/nginx/sites-available/default
content: |
server {
listen 80;
server_name _;
root /var/www/html;
index index.html;
}
owner: root:root
permissions: '0644'
- path: /etc/sysctl.d/99-custom.conf
content: |
net.ipv4.ip_forward = 1
net.core.somaxconn = 65535
owner: root:root
permissions: '0644'
# Run commands (executed during cloud-init config stage)
runcmd:
- sysctl -p /etc/sysctl.d/99-custom.conf
- systemctl enable --now nginx
- systemctl enable --now fail2ban
- ufw allow ssh
- ufw allow 80/tcp
- ufw allow 443/tcp
- ufw --force enable
# Enable/disable SSH password login
ssh_pwauth: false
# SSH key configuration
ssh_keys:
ed25519_private: |
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
ed25519_public: ssh-ed25519 AAAA...
# Set passwords (hashed)
chpasswd:
expire: false
users:
- name: deploy
type: RANDOM
# Final message
final_message: "Cloud-init complete! Took $UPTIME seconds."
# Post-boot action
power_state:
mode: reboot
message: "cloud-init configuration complete, rebooting..."
timeout: 30
condition: true쉘 스크립트 형식
#!/bin/bash으로 시작:
#!/bin/bash
set -euxo pipefail
# Update the system
apt update && apt upgrade -y
# Install base tools
apt install -y nginx docker.io
# Configure the firewall
ufw allow ssh
ufw allow 80/tcp
ufw --force enable
# Custom script
echo "Setup complete at $(date)" > /var/log/cloud-init-custom.log다중 부분 형식(MIME 다중 부분)
여러 형식 결합:
# Use the cloud-init tool to create a multi-part message
cloud-init devel make-mime \
--attach script.sh:text/x-shellscript \
--attach config.yaml:text/cloud-config \
> combined-userdata.txt일반적인 사용 사례
Docker 환경 초기화
#cloud-config
packages:
- docker.io
- docker-compose-v2
groups:
- docker
users:
- name: deploy
groups: sudo, docker
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAA...
write_files:
- path: /etc/docker/daemon.json
content: |
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
runcmd:
- systemctl enable --now docker
- docker pull nginx:alpine디스크 초기화
#cloud-config
disk_setup:
/dev/vdb:
table_type: gpt
layout: true
overwrite: false
fs_setup:
- label: data
filesystem: ext4
device: /dev/vdb1
overwrite: false
mounts:
- ["/dev/vdb1", "/data", "ext4", "defaults,noatime", "0", "2"]
runcmd:
- mkdir -p /data클러스터에 가입
#cloud-config
runcmd:
- curl -sfL https://get.k3s.io | K3S_URL=https://master:6443 K3S_TOKEN=mytoken sh -로컬 테스트
멀티패스 사용
# Install Multipass
sudo snap install multipass
# Launch an instance with cloud-config
multipass launch 26.04 --name test --cloud-init cloud-config.yaml
# Enter the instance
multipass shell test
# View cloud-init logs
multipass exec test -- cat /var/log/cloud-init-output.logLXD 사용
# Test cloud-init via LXD
lxc launch ubuntu:26.04 test --config=user.user-data="$(cat cloud-config.yaml)"
lxc exec test -- cloud-init status --wait
lxc exec test -- cat /var/log/cloud-init-output.log로컬에서 구성 검증
# Validate cloud-config syntax
cloud-init schema --config-file cloud-config.yaml
# Use the devel subcommand for debugging
cloud-init devel render /path/to/userdata.yaml로그 및 디버깅
# Main log file
sudo cat /var/log/cloud-init.log
# Output log
sudo cat /var/log/cloud-init-output.log
# View executed modules
sudo cat /run/cloud-init/result.json
# View user data
sudo cat /var/lib/cloud/instance/user-data.txt
# View instance data
sudo cloud-init query --all
# Query specific fields
sudo cloud-init query instance_id
sudo cloud-init query region
sudo cloud-init query local_hostnamecloud-init 다시 실행
# Clear cloud-init state (for testing)
sudo cloud-init clean
# Clear and reboot to re-execute
sudo cloud-init clean --reboot
# Clear logs only
sudo cloud-init clean --logs
# Manually trigger specific stages
sudo cloud-init init
sudo cloud-init modules --mode config
sudo cloud-init modules --mode final클라우드 초기화 비활성화
클라우드가 아닌 환경에서는 cloud-init를 비활성화할 수 있습니다.
# Method 1: Create a disable marker file
sudo touch /etc/cloud/cloud-init.disabled
# Method 2: Via GRUB kernel parameter
# Add the following to GRUB_CMDLINE_LINUX in /etc/default/grub:
# cloud-init=disabled
# Method 3: Uninstall
sudo apt remove cloud-init -y
sudo rm -rf /etc/cloud /var/lib/cloud