Google의 Container-Optimized OS를 실행하는 Compute Engine 인스턴스를 만들고 구성하는 방법은 두 가지가 있습니다.
VM 또는 관리형 인스턴스 그룹의 각 VM에서 단일 컨테이너를 실행하는 간단한 시나리오에서는 인스턴스 또는 인스턴스 템플릿을 정의할 때 컨테이너 이미지 및 선택적 구성 매개변수를 지정하면 됩니다. Compute Engine은 최신 버전의 Container-Optimized OS를 사용하여 인스턴스를 만들고 VM이 시작될 때 지정된 컨테이너를 실행합니다.
여러 컨테이너를 배포하고
Docker 옵션을 cloud-init를 사용하여 구성할 수 있는 고급 시나리오에서는 선택한 Container-Optimized OS 이미지로 Compute Engine 인스턴스를 만든 다음 필요에 따라 컨테이너를
구성할 수 있습니다.
간단한 인스턴스 만들기
최신 버전의 Container-Optimized OS를 사용하여 VM에 단일 컨테이너를 배포하려면 이 방법을 사용하세요. 콘솔 Google Cloud 또는 gcloud CLI 를 사용하여 이 태스크를 수행할 수 있습니다.
Console
VM 인스턴스 페이지로 이동합니다.
인스턴스 만들기를 클릭합니다.
인스턴스 이름을 지정합니다.
컨테이너 섹션에서 이 VM 인스턴스에 컨테이너 이미지를 배포합니다 체크박스를 선택합니다.
사용할 컨테이너 이미지를 지정합니다.
- 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로 지정합니다.
- Container Registry 또는 Artifact Registry에서 이미지를 지정할 수 있습니다.
예를 들면 다음과 같습니다.
선택적으로 고급 컨테이너 옵션을 클릭합니다. 자세한 내용은 컨테이너 실행을 위한 옵션 구성을 참조하세요.
만들기 를 클릭하여 인스턴스를 만들고, 인스턴스를 부팅하고, 컨테이너를 시작합니다.
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을 사용하세요.
사용 가능한 이미지 보기
Container-Optimized OS 이미지는 Google Cloud 콘솔의
이미지 목록에서 프리픽스 cos로 시작하는 이미지를 볼 수 있습니다.
이러한 이미지는 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
인스턴스 생성
콘솔, gcloud CLI 또는 API를 사용하여 인스턴스를 만들 수 있습니다. Google Cloud
Console
Container-Optimized OS 및 Docker가 설치된 Compute Engine 인스턴스를 실행하려면 다음을 수행하세요.
콘솔에서 Compute Engine 인스턴스 생성 페이지를 엽니다. Google Cloud
인스턴스 이름을 지정합니다.
컨테이너 섹션에서 이 VM 인스턴스에 컨테이너 이미지를 배포합니다 체크박스의 선택을 해제합니다. 이 옵션은 VM에서 단일 컨테이너를 배포하려는 경우에 유용합니다.
부팅 디스크 섹션에서 Container-Optimized OS 이미지를 선택합니다.
만들기를 클릭하여 인스턴스를 만들고 부팅합니다.
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
일회성 실험 인스턴스에 --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/image-name'
}
}
]
}
인스턴스 구성
경우에 따라 인스턴스가 부팅될 때 추가 구성을 수행하는 것이 좋습니다. 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 image-name \
--image-project cos-cloud \
--metadata-from-file user-data=filename
다음을 바꿉니다.
- instance-name: VM 인스턴스의 이름입니다.
- image-name: 인스턴스의 Container-Optimized OS 이미지 이름입니다. 예를 들면
--image=cos-113-18244-85-29입니다. - filename: 메타데이터 파일의 이름입니다.
Container-Optimized OS 인스턴스를 만들 때 다른 메타데이터 플래그를 설정할 수 있습니다. 이러한 속성은 간단한 키-값 쌍이기 때문에 gcloud compute instances create 명령어에 --metadata 플래그를 사용하여 속성을 만들 수 있습니다. 또한 마일스톤 97부터는 gcloud compute project-info add-metadata 명령어에서 --metadata 플래그를 사용하여 프로젝트 메타데이터에 메타데이터 플래그를 설정할 수 있습니다. 인스턴스 수준에 정의된 플래그가 프로젝트 수준에 정의된 플래그보다 우선적용됩니다.
다음 명령어를 사용하여 사용 통계 및 크래시 덤프 컬렉션을 수집하도록 이전 예시를 확장할 수 있습니다.
gcloud compute instances create instance-name \
--image image-name \
--image-project cos-cloud \
--metadata-from-file user-data=filename \
--metadata=cos-metrics-enabled=true
기타 메타데이터 플래그
| 메타데이터 키 | 설명 | 기본 동작 |
|---|---|---|
cos-update-strategy |
자동 업데이트 동작을 지정합니다. 값은 update_enabled, update_disabled이거나 설정되지 않을 수 있습니다.설정하지 않으면 마일스톤의 기본 자동 업데이트 동작이 사용됩니다. 사용 설정되면 동작은 출시 채널에 따라 달라집니다.
|
|
cos-metrics-enabled |
크래시 덤프 수집을 사용 설정합니다. 값은 다음과 같습니다.truefalse(기본값) |
기본적으로 사용 중지됩니다. |
인스턴스에 연결
다른 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는 systemd의 systemd-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 인스턴스 메타데이터 키를 각각 update_enabled 또는 update_disabled로 설정하는 것이 좋습니다. 예를 들면 다음과 같습니다.
gcloud compute instances create instance-name \
--image image-name \
--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