인스턴스 생성 및 구성

Google의 Container-Optimized OS를 실행하는 Compute Engine 인스턴스를 만들고 구성하는 방법은 두 가지가 있습니다.

VM 또는 관리형 인스턴스 그룹의 각 VM에서 단일 컨테이너를 실행하는 간단한 시나리오에서는 인스턴스 또는 인스턴스 템플릿을 정의할 때 컨테이너 이미지 및 선택적 구성 매개변수를 지정하면 됩니다. Compute Engine은 최신 버전의 Container-Optimized OS를 사용하여 인스턴스를 만들고 VM이 시작될 때 지정된 컨테이너를 실행합니다.

여러 컨테이너를 배포하고 cloud-init를 사용하여 Docker 옵션을 구성할 수 있는 고급 시나리오의 경우 선택한 Container-Optimized OS 이미지로 Compute Engine 인스턴스를 만든 다음 필요에 따라 구성을 진행할 수 있습니다.

간단한 인스턴스 만들기

최신 버전의 Container-Optimized OS를 사용하여 VM에 단일 컨테이너를 배포하려면 이 방법을 사용하세요. Google Cloud Console 또는 gcloud CLI를 사용하여 이 태스크를 수행할 수 있습니다.

Console

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기를 클릭합니다.

  3. 인스턴스 이름을 지정합니다.

  4. 컨테이너 섹션에서 이 VM 인스턴스에 컨테이너 이미지를 배포합니다 체크박스를 선택합니다.

  5. 사용할 컨테이너 이미지를 지정합니다.

    • Container Registry 또는 Artifact Registry에서 이미지를 지정할 수 있습니다. 예를 들면 다음과 같습니다.
      • gcr.io/cloud-marketplace/google/nginx1:1.15는 Google Cloud Marketplace에서 NGINX 1.15 컨테이너 이미지를 선택합니다.
      • us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0는 Artifact Registry에서 샘플 hello-app 이미지를 선택합니다.
    • Docker Hub의 컨테이너 이미지를 사용할 경우 항상 Docker 이미지 전체 이름을 지정합니다. 예를 들어 Apache 컨테이너 이미지를 배포하려면 이미지 이름을 docker.io/httpd:2.4로 지정합니다.
  6. 선택적으로 고급 컨테이너 옵션을 클릭합니다. 자세한 내용은 컨테이너 실행을 위한 옵션 구성을 참조하세요.

  7. 만들기를 클릭하여 인스턴스를 만들고, 인스턴스를 부팅하고, 컨테이너를 시작합니다.

gcloud

간단한 VM 인스턴스를 만들려면 다음 명령을 실행하세요.

gcloud compute instances create-with-container instance-name \
    --container-image image-name

다음을 바꿉니다.

  • instance-name: 새 인스턴스의 이름입니다.
  • image-name: 컨테이너 이미지의 이름입니다.

예를 들어, 다음 명령어는 gcr.io/cloud-marketplace/google/nginx1:1.15 컨테이너 이미지를 시작하고 실행할 nginx-vm이라는 새 VM 인스턴스를 만듭니다.

gcloud compute instances create-with-container nginx-vm \
    --container-image gcr.io/cloud-marketplace/google/nginx1:1.15

마찬가지로, Artifact Registry에서 샘플 컨테이너를 시작하고 실행하는 hello-app이라는 새 VM 인스턴스를 만들 수 있습니다.

gcloud compute instances create-with-container hello-app \
--container-image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

Docker Hub의 컨테이너 이미지를 사용하는 경우 항상 Docker 이미지의 전체 이름을 지정해야 합니다. 예를 들어 Apache 컨테이너 이미지를 배포하려면 이미지 이름을 다음과 같이 지정합니다.

docker.io/httpd:2.4

관리형 인스턴스 그룹의 각 VM에서 단일 컨테이너를 실행하려면 인스턴스 템플릿을 정의할 때 컨테이너 이미지 이름을 지정하세요. 자세한 내용은 컨테이너 이미지를 사용하여 인스턴스 템플릿 만들기를 참조하세요.

고급 시나리오용 인스턴스 만들기

이 방법을 사용하여 특정 Container-Optimized OS 이미지를 선택하고 여러 컨테이너를 배포하고 고급 구성에 cloud-init을 사용하세요.

사용 가능한 이미지 보기

Google Cloud Console의 이미지 목록에서 프리픽스 cos로 시작하는 Container-Optimized OS 이미지를 볼 수 있습니다. 이는 cos-cloud 프로젝트에서 호스팅됩니다. 다음 명령어를 실행하여 명령줄에서 현재 사용 가능한 모든 출시 버전을 볼 수도 있습니다.

gcloud compute images list --project cos-cloud --no-standard-images

출력은 다음과 비슷합니다.

NAME                       PROJECT    FAMILY      DEPRECATED  STATUS
cos-69-10895-385-0         cos-cloud  cos-69-lts              READY
cos-73-11647-534-0         cos-cloud  cos-73-lts              READY
cos-77-12371-251-0         cos-cloud  cos-77-lts              READY
cos-81-12871-103-0         cos-cloud  cos-81-lts              READY
cos-beta-81-12871-44-0     cos-cloud  cos-beta                READY
cos-dev-84-13078-0-0       cos-cloud  cos-dev                 READY
cos-stable-81-12871-103-0  cos-cloud  cos-stable              READY

인스턴스 생성

Google Cloud Console, gcloud CLI 또는 API를 사용하여 인스턴스를 만들 수 있습니다.

Console

Container-Optimized OS 및 Docker가 설치된 Compute Engine 인스턴스를 실행하려면 다음을 수행하세요.

  1. Google Cloud Console에서 Compute Engine 인스턴스 생성 페이지를 엽니다.

    새 Compute Engine 인스턴스 만들기

  2. 인스턴스 이름을 지정합니다.

  3. 컨테이너 섹션에서 이 VM 인스턴스에 컨테이너 이미지를 배포합니다 체크박스의 선택을 해제합니다. 이 옵션은 VM에서 단일 컨테이너를 배포하려는 경우에 유용합니다.

  4. 부팅 디스크 섹션에서 Container-Optimized OS 이미지를 선택합니다.

  5. 만들기를 클릭하여 인스턴스를 만들고 부팅합니다.

gcloud

현재 사용 가능한 이미지를 검토한 후 다음 명령어를 사용하여 cos 노드 이미지 인스턴스를 만듭니다.

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

다음을 바꿉니다.

  • instance-name: VM 인스턴스의 이름입니다.
  • image-name: 인스턴스의 Container-Optimized OS 이미지 이름으로, 사용할 수 있는 이미지의 목록에서 가져옵니다. 이전 예시에서 cos-beta-81-12871-44-0을 사용할 수 있습니다.
  • compute-zone: 인스턴스의 컴퓨팅 영역
  • machine-type-name: 새 인스턴스에 사용할 머신 유형입니다. 기본 유형은 n1-standard-1입니다.

예를 들어, 다음 명령어는 cos-beta-67-10575-13-0 이미지를 사용하여 cos-test이라는 인스턴스를 만듭니다.

gcloud compute instances create cos-test \
    --image cos-beta-67-10575-13-0 \
    --image-project cos-cloud \
    --zone us-east1-d \
    --machine-type n1-standard-1

사용 가능한 최신 dev, beta 또는 stable Container-Optimized OS를 원하는 경우 다음과 같이 --image-family 플래그를 사용하세요.

gcloud compute instances create instance-name \
    --image-family cos-beta \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

일회성 실험 인스턴스에 --preemptible 플래그를 추가할 수 있습니다.

API

API에서 인스턴스를 생성하되, Container-Optimized OS 소스 이미지를 포함하는 일반적인 요청을 구성합니다. 예를 들면 다음과 같습니다.

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/compute-zone/instances

{
  'machineType': 'zones/compute-zone/machineTypes/machine-type-name',
  'name': 'instance-name',
  'networkInterfaces': [
    {
      'accessConfigs': [
        {
          'type': 'ONE_TO_ONE_NAT',
          'name': 'External NAT'
        }
      ],
      'network': 'global/networks/default'
    }
  ],
  'disks': [
    {
      'type': 'PERSISTENT',
      'boot': true,
      'autoDelete': true,
      'initializeParams': {
        'sourceImage': 'projects/cos-cloud/global/images/family/cos-stable'
      }
    }
  ]
}

인스턴스 구성

경우에 따라 인스턴스가 부팅될 때 추가 구성을 수행하는 것이 좋습니다. Container-Optimized OS에서 cloud-init 도구를 사용하여 cloud-config 형식으로 제공하는 구성 정보를 적용할 수 있습니다.

Cloud config 형식으로 cloud-init 사용

Container-Optimized OS 이미지에는 부팅될 때 인스턴스를 구성하기 위한 방법으로 cloud-init가 포함되어 있습니다. cloud-init 도구는 인스턴스 메타데이터user-data 키 값에 해당 구성이 필요합니다. cloud-init 도구는 여러 형식을 이해합니다.

예를 들어 cloud-init 파일은 사용자 계정을 만드는 방법과 Docker busybox 컨테이너 관리를 제어하는 이 사용자가 소유한 systemd 서비스를 만드는 방법을 보여줍니다.

#cloud-config

users:
- name: cloudservice
  uid: 2000

write_files:
- path: /etc/systemd/system/cloudservice.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Start a simple docker container

    [Service]
    ExecStart=/usr/bin/docker run --rm -u 2000 --name=mycloudservice busybox:latest /bin/sleep 3600
    ExecStop=/usr/bin/docker stop mycloudservice
    ExecStopPost=/usr/bin/docker rm mycloudservice

runcmd:
- systemctl daemon-reload
- systemctl start cloudservice.service

# Optional once-per-boot setup. For example: mounting a PD.
bootcmd:
- fsck.ext4 -tvy /dev/[DEVICE_ID]
- mkdir -p /mnt/disks/[MNT_DIR]
- mount -t ext4 -O ... /dev/[DEVICE_ID] /mnt/disks/[MNT_DIR]

cloud-init 파일을 참조하는 Container-Optimized OS VM 인스턴스를 만들려면 --metadata-from-file 명령줄 플래그를 사용합니다. cloud-init 파일이 현재 디렉터리에서 filename으로 표시된다고 가정할 때, 다음 명령어는 파일 내용을 인스턴스 메타데이터의 user-data 키에 할당하여 Container-Optimized OS 인스턴스를 만들고 cloud-init를 트리거합니다.

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename

다음을 바꿉니다.

  • instance-name: VM 인스턴스의 이름입니다.
  • filename: 메타데이터 파일의 이름입니다.

Container-Optimized OS 인스턴스를 만들 때 다른 메타데이터 플래그를 설정할 수 있습니다. 이러한 속성은 간단한 키-값 쌍이기 때문에 gcloud compute instances create 명령어에 --metadata 플래그를 사용하여 속성을 만들 수 있습니다. 또한 마일스톤 97부터는 gcloud compute project-info add-metadata 명령어에서 --metadata 플래그를 사용하여 프로젝트 메타데이터에 메타데이터 플래그를 설정할 수 있습니다. 인스턴스 수준에 정의된 플래그가 프로젝트 수준에 정의된 플래그보다 우선적용됩니다.

다음 명령어를 사용하여 사용 통계 및 크래시 덤프 컬렉션을 수집하도록 이전 예시를 확장할 수 있습니다.

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename \
    --metadata=cos-metrics-enabled=true

기타 메타데이터 플래그

메타데이터 키 설명 기본 동작
cos-update-strategy 업데이트 동작을 지정합니다. 유일하게 허용되는 값은 update_disabled뿐입니다. 설정되지 않은 경우:
  • cos-dev 및 cos-beta: 해당 이미지 계열의 최신 OS 버전에서 업데이트
  • LTS 마일스톤 및 cos-stable: 동일한 마일스톤의 최신 OS 버전에서 업데이트
cos-metrics-enabled 크래시 덤프 수집을 사용 설정합니다. 값은 다음과 같습니다.
true
false(기본값)
기본적으로 사용 중지됩니다.

인스턴스에 연결

다른 Compute Engine 인스턴스에 연결하는 것과 동일한 방식으로 cos 노드 이미지를 실행 중인 VM 인스턴스에 SSH를 통해 연결할 수 있습니다.

예를 들면 다음과 같습니다.

gcloud compute ssh instance-name \
    --project project-id \
    --zone compute-zone

시작 스크립트 실행

startup-script 메타데이터 키를 사용하여 메타데이터 서버를 통해 시작 스크립트를 지정할 수 있습니다. Google Cloud CLI, API, Google Cloud 콘솔을 사용해서 시작 스크립트를 제공할 수 있습니다. 자세한 내용은 시작 스크립트 실행을 참조하세요.

시간 동기화

마일스톤 85 이전에 Container-Optimized OS는 systemdsystemd-timesyncd 서비스를 사용하여 SNTP 프로토콜을 통해 원격 네트워크 시간 프로토콜(NTP) 서버와 로컬 시스템 시계를 동기화합니다. /etc/systemd/timesyncd.conf 구성 파일의 다음 항목은 관리자가 원하는 항목을 변경할 수 있도록 주석 처리된 기본 구성 값을 보여줍니다.

cat /etc/systemd/timesyncd.conf
# comments omitted for brevity
[Time]
#NTP=
#FallbackNTP=metadata.google.internal
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

따라서 허용되는 최대 루트 거리는 5초이고, NTP 메시지의 최소 및 최대 폴링 간격은 각각 32초와 2,048초입니다.

마일스톤 85부터 Container-Optimized OS는 chronyd 서비스를 사용하여 NTP 프로토콜을 통해 원격 네트워크 시간 프로토콜(NTP) 서버와 로컬 시스템 시계를 동기화합니다. /etc/chrony/chrony.conf 구성 파일의 다음 항목은 관리자가 원하는 항목을 변경할 수 있도록 주석 처리된 기본 구성 값을 보여줍니다.

cat /etc/chrony/chrony.conf
# Use custom NTP servers
server metadata.google.internal prefer iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

NTP 서버는 일반적으로 Compute Engine의 메타데이터 서버인 eth0의 DHCP 응답으로부터 설정됩니다.

networkctl status eth0 | grep NTP
             NTP: 169.254.169.254

시간대 변경

Google의 Container-Optimized OS의 기본 시간대는 UTC0입니다. 다음 예와 같이 원하는 시간대에 대한 기호화된 링크를 만드세요.

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/US/Pacific /etc/localtime

/etc는 스테이트리스(Stateless)이므로 시스템이 재부팅될 때마다 시간대가 기본값(UTC0)으로 재설정됩니다.

자동 업데이트 사용 중지

자동 업데이트를 사용 중지하는 방법은 두 가지가 있습니다. cos-update-strategy 인스턴스 메타데이터 키를 사용하는 것이 좋습니다.

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata cos-update-strategy=update_disabled

마일스톤 97부터는 프로젝트 메타데이터에서 자동 업데이트를 사용 중지할 수도 있습니다.

gcloud compute project-info add-metadata \
    --metadata cos-update-strategy=update_disabled

systemctl을 사용하여 실행 중인 인스턴스에서 자동 업데이트를 사용 중지할 수도 있습니다.

sudo systemctl stop update-engine
sudo systemctl mask update-engine