Linux VM에서 VM 인스턴스와 함께 시작 스크립트 사용

시작 스크립트는 가상 머신(VM)의 시작 프로세스 동안 작업을 실행합니다. 이 페이지에서는 VM 인스턴스에서 시작 스크립트를 사용하는 단계를 설명합니다.

시작하기 전에

gdcloud 명령줄 인터페이스 (CLI) 명령어를 사용하려면 gdcloud CLI를 다운로드, 설치, 구성해야 합니다. GDC 오프라인 어플라이언스의 모든 명령어는 gdcloud 또는 kubectl CLI를 사용하며 운영체제 (OS) 환경이 필요합니다.

kubeconfig 파일 경로 가져오기

관리 API 서버에 대해 명령어를 실행하려면 다음 리소스가 있어야 합니다.

  1. 관리 API 서버 이름을 찾거나 플랫폼 관리자 (PA)에게 서버 이름을 문의합니다.

  2. 관리 API 서버의 kubeconfig 파일이 없는 경우 로그인 및 생성합니다.

  3. 이 안내에서 경로를 사용하여 MANAGEMENT_API_SERVER{"</var>"}}을 바꿉니다.

권한 및 액세스 요청

이 페이지에 나열된 작업을 수행하려면 프로젝트 VirtualMachine 관리자 역할이 있어야 합니다. 액세스 권한을 확인하거나 프로젝트 IAM 관리자가 VM이 있는 프로젝트의 네임스페이스에서 프로젝트 VirtualMachine 관리자 (project-vm-admin) 역할을 할당하도록 단계를 따르세요.

시작 스크립트 전달

bash 또는 비bash 스크립트를 시작 스크립트로 사용할 수 있습니다. 이렇게 하려면 스크립트 인터프리터를 나타내기 위해 스크립트 시작 부분에 #!/bin/…을 포함합니다. 예를 들어 Python 3 시작 스크립트를 사용하려면 스크립트 시작 부분에 #! /usr/bin/python3를 추가합니다.

Google Distributed Cloud (GDC) 에어 갭 어플라이언스는 각 시작 스크립트의 이름을 기준으로 시작 스크립트를 알파벳순으로 실행합니다.

다음 표에는 스크립트 크기에 따라 사용할 스크립트 형식이 나와 있습니다.

스크립트 크기 스크립트 형식
최대 2,048바이트 스크립트 텍스트 삭제
2,048바이트를 초과하는 스크립트 Kubernetes 보안 비밀

시작 스크립트 정의

시작 스크립트를 사용하려면 VM spec 필드에 startupScripts 필드를 추가해야 합니다. 이 필드 내에서 여러 시작 스크립트를 일반 텍스트 또는 Kubernetes 보안 비밀로 지정할 수 있습니다.

다음 예시에서는 시작 스크립트를 일반 텍스트와 Kubernetes 보안 비밀로 지정합니다.

apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  
  startupScripts:
  - name: hello-world
    script: |
      #!/bin/bash
      echo hello
  - name: add-user
    scriptSecretRef:
      name: add-user
---

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: add-user
data: 
  script:
    IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==

다음 사항을 검토하세요.

  • 시작 스크립트는 부팅할 때마다 실행됩니다.
  • 시작 스크립트에는 기본 루트 권한이 있습니다.
  • Kubernetes 보안 비밀에서 VM specscriptSecretRef 이름은 metadata.name 필드와 일치해야 합니다.
  • Kubernetes 보안 비밀에서 data 필드에 script 키를 추가하여 시작 스크립트 콘텐츠를 지정합니다.

시작 스크립트로 새 VM 만들기

이 안내는 VM을 만드는 데 사용하는 이미지와 관계없이 적용됩니다. 다음을 완료합니다.

  1. 시작 스크립트를 Kubernetes 보안 비밀로 만들려면 다음을 실행하세요.

    cat <<EOF >>FILE_NAME
    STARTUP_SCRIPT_CONTENT
    EOF
    
    kubectl --kubeconfig MANAGEMENT_API_SERVER create secret -n PROJECT generic SECRET_NAME --from-file=script=FILE_NAME
    
    rm FILE_NAME
    
  2. VM 만들기 페이지에 설명된 대로 VM을 만드는 단계를 참고하세요. 1단계에서 VM을 만드는 명령어를 실행하기 전에 spec 필드에 시작 스크립트를 추가합니다.

    이 예시에서는 일반 텍스트와 Kubernetes 보안 비밀을 모두 사용하여 시작 스크립트를 정의합니다.

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
    name: VM_NAME
    namespace: PROJECT
    spec:
    
    startupScripts:
    - name: CLEAR_TEXT_SCRIPT_NAME
      script: |
        #!/bin/bash
        CLEAR_TEXT_SCRIPT
    - name: SECRET_SCRIPT_NAME
      scriptSecretRef:
        name: SECRET_NAME
    

    이러한 변수는 다음과 같이 정의됩니다.

    변수정의
    MANAGEMENT_API_SERVER 관리 API 서버 kubeconfig 파일입니다.
    PROJECT VM을 만들려는 GDC 에어갭 어플라이언스 프로젝트입니다.
    VM_NAME VM의 이름입니다.
    FILE_NAME 시작 스크립트를 저장할 파일의 이름입니다.
    STARTUP_SCRIPT_CONTENT 시작 스크립트의 일부로 실행할 명령어
    CLEAR_TEXT_SCRIPT_NAME 일반 텍스트 시작 스크립트의 이름입니다.
    CLEAR_TEXT_SCRIPT 정의한 일반 텍스트 스크립트입니다.
    SECRET_NAME Kubernetes 보안 비밀의 이름입니다.
    SECRET_SCRIPT_NAME 시작 스크립트의 이름(Kubernetes 보안 비밀)입니다.
  3. 다음 단계에 따라 VM을 만듭니다.

    다음은 Kubernetes 보안 비밀과 일반 텍스트를 사용하여 새 사용자를 추가하는 시작 스크립트로 VM을 만드는 방법의 예입니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
        apply -n PROJECT -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_BOOT_DISK_NAME
    spec:
      source:
        image:
          name: BOOT_DISK_IMAGE_NAME
          namespace: vm-system
      size: BOOT_DISK_SIZE
    ---
    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: add-user
    data: 
      script:
        IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==
    ---
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      compute:
        virtualMachineType: MACHINE_TYPE
      disks:
      - virtualMachineDiskRef:
          name: VM_BOOT_DISK_NAME
        boot: true
        autoDelete: BOOT_DISK_AUTO_DELETE
      startupScripts:
      - name: add-user
        scriptSecretRef:
          name: add-user
      - name: add-to-sudoers
        script: |
          #!/bin/bash
          usermod -aG sudo user
    EOF
    

    이 예에서 변수는 다음과 같이 정의됩니다.

    변수정의
    MANAGEMENT_API_SERVER 관리 API 서버 kubeconfig 파일입니다.
    PROJECT VM을 만들려는 GDC 에어갭 어플라이언스 프로젝트입니다.
    VM_NAME 새 VM의 이름입니다.
    VM_BOOT_DISK_NAME 새 VM 부팅 디스크의 이름입니다.
    BOOT_DISK_IMAGE_NAME 새 VM 부팅 디스크에 사용할 이미지의 이름입니다.
    BOOT_DISK_SIZE 부팅 디스크의 크기입니다(예: 20G).
    이 값은 항상 부팅 디스크 이미지의 minimumDiskSize보다 크거나 같아야 합니다.
    BOOT_DISK_AUTO_DELETE true 또는 false입니다. VM 인스턴스가 삭제될 때 부팅 디스크가 자동으로 삭제되는지 여부를 나타냅니다.
    MACHINE_TYPE 새 VM의 사전 정의된 머신 유형입니다. 사용 가능한 머신 유형을 선택하려면 다음 명령어를 실행하세요.
    kubectl --kubeconfig MANAGEMENT_API_SERVER get virtualmachinetype.virtualmachine.gdc.goog --namespace vm-system

시작 스크립트로 기존 VM 업데이트

시작 스크립트로 기존 VM을 업데이트할 수도 있습니다. 업데이트를 실행하기 전에 VM을 종료해야 합니다.

VM 속성을 업데이트하는 단계를 따라 실행할 시작 스크립트로 spec 필드를 업데이트합니다.

시작 스크립트의 출력 보기

  1. 단계에 따라 VM에 연결합니다.
  2. 게스트 VM 내에서 다음 명령어를 실행하여 실행한 시작 스크립트의 로그를 가져옵니다.

    sudo journalctl -u cloud-final
    

    시작 스크립트 로그는 다음으로 시작합니다.

    Started to run the command: /var/lib/google/startup-scripts/<script-name> ...