Cloud-init 이란?

ohyujeong·2023년 12월 11일
0

linux

목록 보기
8/9

Cloud-init

Cloud-init 는 클라우드 인스턴스 초기화 도구로 시스템을 부팅하는 동안 클라우드 인스턴스/VM 또는 네트워크 구성을 자동화한다. Canonical에서 구축한 오픈소스 솔루션이며 다양한 클라우드 제공자들이 이 Cloud-init 을 사용하고 있고, 업계 표준이라고 말할 수 있다.

클라우드 인스턴스가 Cloud-init 으로 시작되면 cloud-config 형식으로 된 Cloud-init configuration 파일에 지정된 구성이 자동으로 적용된다. 이로써 다수의 클라우드 인스턴스를 생성할 때 설정 프로세스를 간소화하고 모든 인스턴스가 정확하고 안전하게 구성되었는지 쉽게 확인할 수 있다.

사용 예시로 AWS의 EC2 인스턴스를 들 수 있다. AWS EC2가 처음 가동될때 네트워크, SSH, 스토리지 관련 초기 설정을 가능하게 해주는 기능이 EC2의 UserData이다. 그리고 이 AWS EC2의 UserData는 Cloud-init 을 통해 적용된다.

패키지 설치 및 동작 확인

Cloud-init 은 일반적인 클라우드 인스턴스 이미지(예: AMI)에 미리 설치되어 있어 사용자가 별도로 설치할 필요가 없다. 만약 설치를 원한다면 아래 명령어를 입력하여 설치한다.

apt install cloud-init

cloud-init 상태 확인

아래 명령어로 Cloud-init 상태와 패키지의 서비스 상태를 확인할 수 있다.

cloud-init status


done 은 cloud-init 이 초기화를 성공적으로 완료했음을 나타낸다. 이 외에도 아래와 같은 status 값들이 있다.
unknown : cloud-init의 상태를 알 수 없음
error : 실행 중 오류가 발생
running : 현재 실행 중
disabled : cloud-init이 비활성화 됌

option

  • --long : 상세한 status 정보를 보여준다.

  • --format [yaml|json|tabular] : 지정한 format으로 status 정보를 보여준다.

cloud-init 서비스 활성 상태 확인

systemctl status cloud-init-local.service
systemctl status cloud-init.service
systemctl status cloud-config.service
systemctl status cloud-final.service

active (exited) 로 표시되고 있고 정상적으로 활성화된 것을 확인할 수 있다.

작동방법

작동 방법을 설명하기에 앞서 알아야 할 것은 Configuration 소스이다. Cloud-init 은 내부적으로 단일 configuration(이하 config로 줄임)을 생성하고, 이를 참조하여 인스턴스를 초기화한다. 이 config을 생성하기 위해 다양한 Configuration 소스로부터 config 데이터를 수집하고 이를 종합한다.

Configuration 소스

Configuration 소스들은 우선순위가 정해져 있고 만약 하나의 설정이 여러 소스에 걸쳐 정의된 경우, 우선순위가 높은 소스가 우선순위가 낮은 소스를 덮어쓰는 방식으로 단일 config가 생성된다.

Configuration 소스로는 아래 항목들이 있다.

  • 1. Base Configuration
  • 2. 데이터소스 - Vendor 와 User data
  • 3. Network Configuration

Base Configuration을 기반으로 cloud-init 도구를 사용하여 추가 설정을 적용할 수 있다. 이러한 추가 설정은 데이터소스를 통해 제공된다. 하나씩 살펴보면서 config의 구성절차를 알아보자.

1. Base Configuration

사용되는 운영 체제와 클라우드 서비스 제공자에 따른 기본적으로 제공되는 초기 설정이다. 클라우드 인스턴스 이미지에 미리 정의되어 있으며, 인스턴스 시작 시 Base Configuration은 자동으로 적용된다.
아래의 총 4가지 소스로부터 Base Configuration을 생성한다.
우선순위가 낮은 것부터 높은 것까지 나열하자면 다음과 같다.

1-1. 하드코딩된 config
cloud-init 프로그램의 소스 내에 존재하고 변경할 수 없다. 환경변수, config파일 경로, 기타 기본 설정 등이 작성되어 있다.
여기 에서 확인할 수 있다.

1-2. Configuration 디렉토리
Cloud-init 의 Configuration 디렉토리인 /etc/cloud 에 들어있는 configuration file들을 소스로 사용한다. 이 configuration file들은 .cfg 확장자를 가지며 cloud-config 형식이다. 공식문서에서 cloud-config 형식의 파일 예제를 확인할 수 있다. 이 cloud-config 형식은 아래 예시와 같이 YAML 로 되어있다.

# 사용자 계정 생성 예시

# cloud-config
users:
  - name: yourusername
    ssh-authorized-keys:
      - ssh-rsa YOUR_PUBLIC_KEY_HERE
    sudo: ALL=(ALL) NOPASSWD:ALL

configuration file은 두 가지 경로로 나뉘어 제공된다.

  • /etc/cloud/cloud.cfg
    - cloud.cfg 파일은 default 파일이 제공되는 것이 아니고, 템플릿화되어 있어 Cloud-init 이 지원하는 배포판에 맞게 커스터마이즈 되는 것이다.
    - > 템플릿 보기
  • /etc/cloud/cloud.cfg.d/*.cfg
    - /etc/cloud/cloud.cfg.d 디렉토리는 아래와 같이 여러 개의 configuration file을 가지고 있다.

1-3. 런타임 config
/run/cloud-init/cloud.cfg 를 소스로 사용한다.

  • /run 디렉토리는 휘발성 런타임 데이터를 저장하는 임시 파일 시스템(tmpfs)으로, 실행되고 있는 서비스와 관련된 파일이 저장되고 재부팅 시 데이터가 사라진다.

1-4. Kernel command line
시스템 부팅 시 Kernel에 전달되는 Kernel command line을 통해 Cloud-init config를 할 수 있다. 아래 예시와 같이 cc:end_cc 사이에 cloud-config 형식으로 작성하면 config로 인식된다.

cc: | # 여러 줄에 걸쳐 있는 문자열 데이터를 하나의 연속된 텍스트 블록으로 처리하는 데 사용
  #cloud-config
  users:
    - name: yujeong  # yujeong 이름의 사용자 계정 생성
      sudo: ['ALL=(ALL) NOPASSWD:ALL'] # sudo 권한 부여
      groups: users, admin # 사용자 그룹 지정
      shell: /bin/bash # 기본 쉘 설정
end_cc

Kernel command line이란?

Kernel command line은 시스템 부팅 시점에 부트 로더를 통해 운영체제의 커널에 전달되는 매개변수들(parameters)의 집합이다. kernel command linekernel command line parameters 는 엄연히 다르지만 실제 사용에서는 같은 의미로 사용되는 경우가 있다.
이 Kernel command line을 통해 루트 파티션 지정, 디버그 메세지 활성화 등과 같은 다양한 방면에서의 커널 동작 방식을 컨트롤할 수 있다.
아래는 일반적으로 사용되는 kernel command line parameter들이다.

init – kernel의 초기화 후 실행되어야 하는 첫 번째 프로세스를 지정한다.
root – 부팅 시 마운트해야 하는 root file system을 지정한다.
quiet – 부팅 시 심각한 오류를 제외한 모든 kernel 메세지를 억제한다.
debug – kernel 디버깅을 활성화한다.
ro - root file system을 읽기 전용 모드로 마운트한다.

dmesggrep 명령어로 Kernel command line을 확인할 수 있다.

# dmesg 결과에서 "Command line" 찾기
dmesg | grep "Command line"

2. 데이터소스 - Vendor 와 User data

Base Configuration이 이미지에 미리 정의되어 있다면, 데이터소스는 클라우드 인스턴스에 config 데이터를 제공하는 외부 소스이다. 이 소스들로 Base configuration을 덮어쓸 수 있다.
아래와 같이 3가지 범주로 나눌 수 있다.

2-1. Vendor data
클라우드 서비스 제공자가 제공하는 데이터로, 클라우드 환경의 기본 설정이나 정책을 반영하고 인스턴스에 적용될 스크립트와 설정정보가 있다.

2-2. User data
클라우드 인스턴스 생성 시 사용자가 제공하는 정보로, 인스턴스의 초기 설정을 정의한다.
User data는 아래 데이터 형식으로 작성되어야 한다.

  • cloud-config
  • Gzip
  • MIME multipart
  • Base64 decoding
  • User-Data script
  • Include file
  • Upstart job
  • Cloud Boothook

2-3. Meta data
클라우드 서비스 제공자가 제공하는 데이터로, 서버 이름이나 인스턴스 ID와 같은 인스턴스에 관한 정보이다.

3. Network Configuration

아래의 총 3가지 소스로부터 Network Configuration을 생성한다.
앞서 소개한 Base Configuration과 마찬가지로 우선순위가 높은 소스가 설정을 재정의한다.
우선순위가 낮은 것부터 높은 것까지 나열하자면 다음과 같다.

3-1. 데이터소스
Vendor data, User data, Metadata

3-2. Configuration 디렉토리
/etc/cloud/cloud.cfg.d/*.cfg 에 해당하는 configuration file에서 network: 로 시작하는 부분이 소스로 사용된다.

3-3. Kernel command line
Kernel command line parameter인 ip= 를 통해 시스템 부팅 시 인터페이스에 대한 기본적인 IP설정(IP주소, 서브넷 마스크, 기본 게이트웨이)을 제공한다.

Kernel command line 예제

ip=192.0.2.10::192.0.2.1:255.255.255.0::eth0:off
 # -- 1 ---- 2 --- 3 ------- 4 ------ 5 -6--- 7
  1. IP 주소 : 네트워크 인터페이스에 할당할 정적 IP 주소
  2. 넷마스크 : IP 주소 뒤에 : 과 함께 나타낸다. 예제에서는 생략되었다.
  3. 게이트웨이 : 로컬 네트워크 밖으로 나가는 트래픽을 보내는 데 사용되는 라우터의 IP 주소
  4. 서브넷 마스크 : 네트워크 주소의 범위와 네트워크 호스트 부분을 결정한다. 네트워크의 크기를 정의한다.
  5. 네트워크 인터페이스 이름 : 설정을 적용할 네트워크 인터페이스의 이름이다. eth0 은 첫번째 이더넷 인터페이스를 나타낸다.
  6. DHCP 설정 : DHCP를 사용하여 IP주소를 자동으로 받을지 여부를 결정한다. off로 설정 시 DHCP를 사용하지 않고, 이전에 지정된 정적 IP 설정을 사용함을 의미한다.

이러한 Configuration 소스들을 종합하여 네트워크 설정을 나타내는 /run/cloud-init/network-config.json 파일을 생성한다. YAML String을 Base64로 인코딩한 network-config 형식으로 되어있다.

이렇게 Cloud-init 의 작동방법에서 중요한 부분을 차지하는 Configuration 소스에 대해 알아보았다. 이를 바탕으로 Cloud-init 의 작동 방법을 알아보자.

Cloud-init 은 시스템 부팅 시 실행되고 두 가지 phase(early boot, late boot)로 나뉜다. early boot 는 네트워크가 활성화되기 전의 단계이고 late boot 는 네트워크 설정을 마친 이후의 단계이다.

Early boot 단계

  1. 데이터소스 식별하기 : Cloud-init 은 먼저 실행 중인 인스턴스가 어떤 클라우드 환경에 있는지(어떤 클라우드 서비스 제공자인지)를 식별하고 그에 맞는 방법으로 메타데이터에 접근하여 데이터소스를 식별한다.
  2. Configuration 정보 수집 : 데이터소스가 식별되면 Cloud-init 은 이 데이터를 수집하고, 어떤 작업을 수행해야하는지 알게된다.
  3. 네트워크 Configuration 정보를 작성한다.

Late boot 단계

  1. Configuration 관리 : Puppet, Ansible, Chef와 같은 configuration 관리 도구와 결합하여 더 복잡한 Configuration을 설정할 수 있다.
    이어서 생성된 단일 Configuration을 참조하여 아래 작업들을 수행한다.
  2. 소프트웨어 설치 및 업데이트
  3. 사용자 계정 생성
  4. 사용자 스크립트 실행

참고

kernel command line
https://www.baeldung.com/linux/get-kernel-command-line-parameters
https://www.kernel.org/doc/html/v4.14/admin-guide/kernel-parameters.html

cloud-init (공식문서)
https://cloudinit.readthedocs.io/en/latest/explanation/configuration.html#configuration-sources

데이터소스 (공식문서)
https://cloudinit.readthedocs.io/en/23.4/reference/datasources.html

/run 디렉토리
https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s15.html

cloud-init status
https://github.com/canonical/cloud-init/blob/main/cloudinit/cmd/status.py
https://www.ibm.com/docs/ko/powervc-cloud/2.0.0?topic=linux-installing-configuring-cloud-init-ubuntu
https://cloudinit.readthedocs.io/en/latest/reference/cli.html#cli-status

user data format
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/amazon-linux-ami-basics.html#amazon-linux-cloud-init

profile
거친 돌이 다듬어져 조각이 되듯

0개의 댓글