서비스 사양 참조

Snowpark Container Services 사양은 YAML(https://yaml.org/spec/)에 있습니다. 이는 Snowflake에 서비스나 작업을 구성하고 실행하는 데 필요한 정보를 제공합니다.

일반적인 구문은 다음과 같습니다.

spec:
  containers:                           # container list
  - name: <name>
    image: <image-name>
    command:                            # optional list of strings
      - <cmd>
      - <arg1>
    args:                               # optional list of strings
      - <arg2>
      - <arg3>
      - ...
    env:                                # optional
        <key>: <value>
        <key>: <value>
        ...
    readinessProbe:                     # optional
        port: <TCP port-num>
        path: <http-path>
    volumeMounts:                       # optional list
      - name: <volume-name>
        mountPath: <mount-path>
      - name: <volume-name>
        ...
    resources:                          # optional
        requests:
          memory: <memory-reserved>
          nvidia.com/gpu: <count>
          cpu: <cpu-units>
        limits:
          memory: <memory-reserved>
          nvidia.com/gpu: <count>
          cpu: <cpu-units>
    secrets:                            # optional list
      - snowflakeSecret:
        secretKeyRef:
        envVarName:                      # specify this or directoryPath
        directoryPath:                   # specify this or envVarName
  endpoints:                             # optional endpoint list
    - name: <name>
      port: <TCP port-num>
      public: <true / false>
      protocol : < TCP / HTTP / HTTPS >
    - name: <name>
      ...
  volumes:                               # optional volume list
    - name: <name>
      source: local | @<stagename> | memory
      size: <amount-of-memory>           # specify if memory is the volume source
    - name: <name>
      source: local | @<stagename> | memory
      size: <amount-of-memory>           # specify if memory is the volume source
      ...
  logExporters:
    eventTableConfig:
      logLevel: <INFO | ERROR | NONE>
Copy

일반 지침

서비스/작업 사양에는 다음과 같은 최상위 spec 필드가 있습니다.

  • spec.containers (필수 사항): 하나 이상의 애플리케이션 컨테이너 목록입니다. 컨테이너화된 애플리케이션에는 컨테이너가 하나 이상 있어야 합니다.

  • spec.endpoints (선택 사항): 서비스에서 노출하는 엔드포인트의 목록입니다. 서비스에 대한 네트워크 수신 액세스를 허용하는 공용 엔드포인트를 선택할 수 있습니다.

  • spec.volumes (선택 사항): 컨테이너에서 사용할 저장소 볼륨 목록입니다.

  • spec.logExporters (선택 사항): 이 필드는 계정의 이벤트 테이블로 내보낸 컨테이너 로그 수준을 관리합니다.

name 필드(컨테이너, 엔드포인트 및 볼륨 이름)에는 다음 형식 지침이 적용됩니다.

  • 최대 63자까지 가능

  • 일련의 소문자 영숫자 또는 〈-〈 문자를 포함할 수 있음

  • 알파벳 문자로 시작해야 함

  • 영숫자 문자로 끝나야 함

주의

고객은 사양 파일에 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 를 참조하십시오.

다음 섹션에서는 각 최상위 spec 필드를 설명합니다.

spec.containers 필드(필수 사항)

containers 필드는 애플리케이션의 OCI 컨테이너 목록입니다. 각 컨테이너에 대해 nameimage 만 필수 항목입니다. image 필드는 Snowflake 계정의 Snowflake 이미지 리포지토리에 업로드한 이미지의 이름을 나타냅니다. 예:

spec:
  containers:
    - name: echo
      image: /tutorial_db/data_schema/tutorial_repository/echo_service:dev
Copy

서비스(또는 작업)를 생성하면 Snowflake는 지정된 컴퓨팅 풀의 단일 노드에서 이러한 컨테이너를 실행하여 동일한 네트워크 인터페이스를 공유합니다. 여러 서비스 인스턴스를 실행할 수 있으며, 이 경우 실행 중인 이들 컨테이너 세트를 각각 서비스 인스턴스라고 합니다.

참고

현재, Snowpark Container Services에는 linux/amd64 플랫폼 이미지가 필요합니다.

다음 섹션에서는 containers 필드의 유형을 설명합니다.

containers.commandcontainers.args 필드

다음 선택적 필드를 사용하면 애플리케이션 이미지를 다시 만들지 않고도 Dockerfile (애플리케이션 이미지의 일부)에 정의된 컨테이너의 진입점(컨테이너가 매개 변수와 함께 실행하는 명령)을 재정의할 수 있습니다.

  • containers.commandDockerfile ENTRYPOINT 를 재정의합니다. 이를 통해 컨테이너에서 다른 실행 파일을 실행할 수 있습니다.

  • containers.argsDockerfile CMD 를 재정의합니다. 이를 통해 명령(실행 파일)에 다양한 인자를 제공할 수 있습니다.

Dockerfile 에는 다음 코드가 포함되어 있습니다.

ENTRYPOINT ["python3", "main.py"]
CMD ["Bob"]
Copy

이러한 Dockerfile 항목은 python3 명령을 실행하고 두 개의 인자(main.pyBob)를 전달합니다. 다음과 같이 사양 파일에서 이러한 값을 재정의할 수 있습니다.

  • ENTRYPOINT를 재정의하려면 사양 파일에 containers.command 필드를 추가하십시오.

    spec:
      containers:
      - name: echo
        image: <image_name>
        command:
        - python3.9
        - main.py
    
    Copy
  • 《Bob》 인자를 재정의하려면 사양 파일에 containers.args 필드를 추가하십시오.

    spec:
      containers:
      - name: echo
        image: <image_name>
        args:
          - Alice
    
    Copy

containers.env 필드

컨테이너의 모든 프로세스에 전달되는 환경 변수를 지정하려면 containers.env 필드를 사용하십시오.

spec:
  containers:
  - name: <name>
    image: <image_name>
    env:
      ENV_VARIABLE_1: <value1>
      ENV_VARIABLE_2: <value2>
      
      
Copy

자습서1 에서 애플리케이션 코드(echo_service.py)는 값이 명시적으로 설정되지 않은 경우 기본값을 사용하여 환경 변수를 읽습니다.

CHARACTER_NAME = os.getenv('CHARACTER_NAME', 'I')
SERVER_PORT = os.getenv('SERVER_PORT', 8080)
Copy
  • CHARACTER_NAME: Echo 서비스는 문자열(예: 《Hello》)이 포함된 HTTP POST 요청을 수신하면 《I said Hello》를 반환합니다. 사양 파일에서 이 기본값을 덮어쓸 수 있습니다. 예를 들어 값을 《Bob》으로 설정하면 Echo 서비스가 《Bob Said Hello》라는 응답을 반환합니다.

  • SERVER_PORT: 이 기본 구성에서 Echo 서비스는 포트 8080에서 수신 대기합니다. 기본값을 재정의하고 다른 포트를 지정할 수 있습니다.

다음 사양 파일은 이러한 환경 변수 값을 모두 재정의합니다.

spec:
  containers:
  - name: echo
    image: <image_name>
    env:
      CHARACTER_NAME: Bob
      SERVER_PORT: 8085
  endpoints:
  - name: echo-endpoint
    port: 8085
Copy

서비스가 수신 대기하는 포트 번호를 변경했으므로 사양에서는 엔드포인트(endpoints.port 필드 값)도 업데이트했습니다.

containers.readinessProbe 필드

애플리케이션에서 Snowflake에 준비 상태 프로브를 제공하려면 containers.readinessProbe 오브젝트를 사용합니다. Snowflake는 이 프로브를 호출하여 애플리케이션이 요청을 처리할 준비가 된 시기를 결정합니다.

Snowflake는 지정된 포트와 경로에서 지정된 준비 상태 프로브에 대해 HTTP GET 요청을 수행하고 서비스가 HTTP 200 OK 상태를 반환하여 정상적인 컨테이너만 트래픽을 제공하는지 확인합니다.

다음 필드를 사용하여 필수 정보를 제공합니다.

  • port: 서비스가 준비 상태 프로브 요청을 수신 대기하는 네트워크 포트입니다. 이 포트를 엔드포인트로 선언할 필요는 없습니다.

  • path: Snowflake는 이 경로를 사용하여 서비스에 HTTP GET 요청을 합니다.

자습서 1에서 애플리케이션 코드(echo_python.py)는 다음 준비 상태 프로브를 구현합니다.

@app.get("/healthcheck")
def readiness_probe():
Copy

따라서 사양 파일에는 containers.readinessProbe 필드가 포함됩니다.

spec:
  containers:
  - name: echo
    image: <image_name>
    env:
      SERVER_PORT: 8088
      CHARACTER_NAME: Bob
    readinessProbe:
      port: 8088
      path: /healthcheck
  endpoints:
  - name: echo-endpoint
    port: 8088
Copy

준비 상태 프로브에서 지정한 포트가 구성된 엔드포인트일 필요는 없습니다. 서비스는 준비 상태 프로브 목적으로만 다른 포트에서 수신 대기할 수 있습니다.

containers.volumeMounts 필드

spec.volumesspec.containers.volumeMounts 필드는 함께 작동하므로 하나의 섹션에서 함께 설명됩니다. 자세한 내용은 spec.volumes 필드(선택 사항) 섹션을 참조하십시오.

containers.resources 필드

Snowflake는 사용 가능한 컴퓨팅 풀 리소스를 사용하여 애플리케이션을 실행하는 방법을 결정합니다. 서비스 인스턴스에 대한 리소스 요구 사항을 명시적으로 표시하고 사양에 적절한 제한을 설정하는 것이 좋습니다. 지정하는 리소스는 컴퓨팅 풀에 있는 노드의 인스턴스 패밀리로 제한됩니다. 자세한 내용은 CREATE COMPUTE POOL 섹션을 참조하십시오.

Snowflake는 containers.resources.requests 에 지정된 리소스가 제공되는지 확인하고 서비스가 표시된 containers.resources.limits 보다 많은 리소스를 사용하지 못하도록 하기도 합니다. 다음 리소스에 대한 요청과 제한을 지정할 수 있습니다.

  • memory: 애플리케이션 컨테이너에 필요한 메모리입니다. 10진수 또는 2진수 단위를 사용하여 값을 표현할 수 있습니다. 예를 들어, 2G는 2,000,000,000바이트에 대한 요청을 나타냅니다. 자세한 내용은 단위 정보 섹션을 참조하십시오.

  • cpu: 가상 코어(vCPU) 단위를 나타냅니다. 예를 들어, 1 CPU 단위는 1 vCPU와 같습니다. 500m으로 표현될 수도 있는 0.5와 같은 분수 요청이 허용됩니다. 자세한 내용은 단위 정보 섹션을 참조하십시오.

  • nvidia.com/gpu: GPU가 필요한 경우 이를 요청해야 하며, 동일한 수량에 대해 지정된 limit 도 있어야 합니다. 컨테이너가 GPU 용량에 대한 요청과 제한을 지정하지 않으면 어떤 GPU에도 액세스할 수 없습니다. 요청할 수 있는 GPU 수는 컴퓨팅 풀을 생성할 때 선택한 INSTANCE_TYPE 에서 지원하는 최대 GPU로 제한됩니다. 자세한 내용은 CREATE COMPUTE POOL 섹션을 참조하십시오.

Snowflake가 사양 파일에 명시적으로 포함된 리소스를 할당할 수 없는 경우 (CREATE SERVICE를 사용하여) 서비스를 생성할 수 있지만, 서비스 상태에는 리소스 부족으로 인해 서비스를 예약할 수 없는 것으로 나타납니다.

예 1

다음 사양에서 containers.resources 필드는 컨테이너의 리소스 요구 사항을 설명합니다.

spec:
  containers:
  - name: resource-test-gpu
    image: ...
    resources:
      requests:
        memory: 2G
        cpu: 0.5
        nvidia.com/gpu: 1
      limits:
        memory: 4G
        nvidia.com/gpu: 1
Copy

이 예에서 Snowflake는 컨테이너에 대해 최소 2GB 메모리, GPU 1개, 하프 CPU 코어를 할당하라는 요청을 받습니다. 그와 동시에 컨테이너가 4GB 이상의 메모리와 하나의 GPU를 사용할 수는 없습니다.

예 2

  • 두 노드의 컴퓨팅 풀을 생성합니다. 각 노드에는 16GB의 메모리와 하나의 GPU가 있습니다.

    CREATE COMPUTE POOL tutorial_compute_pool
      MIN_NODES = 2
      MAX_NODES = 2
      INSTANCE_FAMILY = gpu_nv_s
    
    Copy
  • Snowflake에 두 개의 서비스 인스턴스를 실행하도록 요청하는 서비스를 만듭니다.

    CREATE SERVICE echo_service
      MIN_INSTANCES=2
      MAX_INSTANCES=2
      IN COMPUTE POOL tutorial_compute_pool
      FROM @<stage_path>
      SPEC=<spec-file-stage-path>;
    
    Copy

    MIN_INSTANCESMAX_INSTANCES 는 모두 2로 설정됩니다. 따라서 Snowflake는 두 개의 서비스 인스턴스를 실행합니다.

애플리케이션 사양에 리소스 요구 사항을 명시적으로 포함하지 않으면 Snowflake는 이러한 인스턴스를 컴퓨팅 풀의 동일한 노드에서 실행할지, 다른 노드에서 실행할지 결정합니다.

  • 리소스 요구 사항을 포함하고 컨테이너에 대한 메모리 10GB를 요청합니다.

    - name: resource-test
      image: ...
      resources:
        requests:
          memory: 10G
    
    Copy

    컴퓨팅 풀 노드에는 16GB의 메모리가 있으며 Snowflake는 동일한 노드에서 두 개의 컨테이너를 실행할 수 없습니다. Snowflake는 컴퓨팅 풀의 별개 노드에서 두 개의 서비스 인스턴스를 실행합니다.

  • 1GB의 메모리와 컨테이너용 GPU를 1개 요청합니다.

    spec:
      containers:
      - name: resource-test-gpu
        image: ...
        resources:
          requests:
            memory: 2G
            nvidia.com/gpu: 1
          limits:
            nvidia.com/gpu: 1
    
    Copy

    컨테이너당 GPU 1개를 요청하고 있으며 각 노드에는 GPU가 1개만 있습니다. 이 경우 메모리는 문제가 되지 않지만 Snowflake는 한 노드에서 두 서비스를 모두 예약할 수 없습니다. 이 요구 사항으로 인해 Snowflake는 두 개의 개별 컴퓨팅 풀 노드에서 두 개의 서비스 인스턴스를 실행해야 합니다.

containers.secrets 필드

secrets:                            # optional list
  - snowflakeSecret:
    secretKeyRef:
    envVarName:                      # specify this or directoryPath
    directoryPath:                   # specify this or envVarName
Copy

containers.secrets 를 사용하여 서비스나 작업이 외부 엔드포인트(Snowflake 외부)와 통신할 때 컨테이너가 인증하는 데 사용할 수 있는 시크릿 오브젝트를 Snowflake에 제공합니다. 자세한 내용은 Snowflake 시크릿을 사용하여 자격 증명을 컨테이너에 전달하기 섹션을 참조하십시오.

  • snowflakeSecret (필수 사항): Snowflake 시크릿 오브젝트 이름입니다.

  • secretKeyRef: 시크릿의 키 이름입니다. 이 필드가 제공되면 Snowflake는 이 키 참조와 연결된 값을 컨테이너에 전달합니다. 환경 변수로 탑재된 기본 인증 시크릿에 필요합니다. 컨테이너의 환경 변수에 시크릿을 전달할 때만 이 필드를 지정합니다.

  • envVarName: 시크릿을 보유하는 환경 변수의 이름입니다. 이 필드 또는 directoryPath 필드는 필수입니다.

  • directoryPath: 시크릿을 복사하려는 컨테이너의 디렉터리 경로입니다. Snowflake는 이 지정된 디렉터리의 각 시크릿 키에 대해 하나의 파일을 채웁니다. directoryPath 를 지정할 때 secretKeyRef 를 지정하지 마십시오. 이 필드 또는 envVarName 필드는 필수입니다.

자세한 내용은 Snowflake 시크릿을 컨테이너에 전달하기 를 참조하십시오.

spec.endpoints 필드(선택 사항)

애플리케이션이 노출하는 TCP 네트워크 포트의 이름 목록을 지정하려면 spec.endpoints 필드를 사용하십시오. Snowpark Container Services는 많은 엔드포인트에 0을 노출할 수 있습니다. 엔드포인트를 설명하려면 다음 필드를 사용하십시오.

  • name: 엔드포인트의 고유한 이름입니다. 서비스 함수에서 엔드포인트를 참조할 때 이 이름을 지정합니다.

  • port: 애플리케이션이 수신 대기 중인 네트워크 포트입니다.

  • protocol: 엔드포인트가 지원하는 프로토콜입니다. 지원되는 값은 TCP, HTTP, HTTPS입니다. 기본적으로 프로토콜은 HTTP입니다. 이 엔드포인트가 공용이거나 서비스 함수의 대상인 경우 프로토콜은 HTTP 또는 HTTPS이어야 합니다(서비스 사용하기 참조).

  • public: 이 엔드포인트를 인터넷에서 액세스할 수 있도록 하려면 이 필드를 true 로 설정하십시오.

참고

Snowflake는 서비스 사용 권한이 있는 Snowflake 사용자만 허용하는 공개 액세스에 대한 인증 및 권한 부여 확인을 수행합니다.

다음은 자습서 1 에서 사용되는 애플리케이션 사양입니다.

spec:
  container:
  - name: echo
    image: <image-name>
    env:
      SERVER_PORT: 8000
      CHARACTER_NAME: Bob
    readinessProbe:
      port: 8000
      path: /healthcheck
  endpoint:
  - name: echoendpoint
    port: 8000
    public: true
Copy

이 애플리케이션 컨테이너는 하나의 엔드포인트를 노출합니다. 또한 Snowflake 외부에서 엔드포인트에 대한 액세스(인터넷 액세스)를 활성화하는 선택적 public 필드도 포함되어 있습니다. 기본적으로 publicfalse 입니다.

spec.volumes 필드(선택 사항)

이 섹션에서는 spec.volumesspec.containers.volumeMounts 필드를 모두 설명합니다. volumes 는 공유 파일 시스템을 정의합니다. volumeMount 는 컨테이너에서 볼륨이 나타나는 위치를 정의합니다. 여러 컨테이너가 동일한 볼륨을 공유할 수 있습니다. 따라서 volumesspec 수준 필드이고 volumeMount 는 컨테이너 사양의 일부입니다.

이들 필드를 사용하여 볼륨과 볼륨 탑재를 모두 설명합니다.

  • spec.volumes 를 사용하여 컨테이너에 사용 가능한 볼륨을 지정합니다. volumes 는 목록입니다. 즉, 여러 볼륨이 있을 수 있습니다. 다음 필드를 사용하여 볼륨을 설명합니다.

    • name: 볼륨의 고유한 이름입니다. spec.containers.volumeMounts.name 에서 이를 참조합니다.

    • source: local, memory 또는 "@<stagename>" 일 수 있습니다.

    • uid: Snowflake 스테이지 볼륨의 경우 탑재된 파일의 uid입니다.

    • gid: Snowflake 스테이지 볼륨의 경우 탑재된 파일의 gid입니다.

    • size: 메모리 볼륨의 경우 볼륨의 크기입니다.

  • spec.containers.volumeMounts 를 사용하여 컨테이너의 파일 시스템에서 지정된 볼륨이 탑재되는 위치를 나타냅니다. containers.volumeMounts 역시 목록입니다. 즉, 각 컨테이너에 여러 개의 볼륨 탑재가 있을 수 있습니다. 다음 필드를 사용하여 볼륨 탑재를 설명합니다.

    • name: 탑재할 볼륨의 이름입니다. 단일 컨테이너가 동일한 볼륨을 여러 번 참조할 수 있습니다.

    • mountPath: 컨테이너 볼륨을 탑재해야 하는 파일 경로입니다.

Snowflake는 애플리케이션 컨테이너가 사용할 볼륨 유형(로컬 볼륨, 메모리, Snowflake 스테이지)을 지원합니다.

  • 로컬 볼륨: 서비스 인스턴스의 컨테이너는 로컬 디스크를 사용하여 파일을 공유할 수 있습니다. 예를 들어 애플리케이션에 두 개의 컨테이너(애플리케이션 컨테이너와 로그 분석기)가 있는 경우 애플리케이션은 로컬 볼륨에 로그를 쓸 수 있고 로그 분석기는 로그를 읽을 수 있습니다.

    서비스의 여러 인스턴스를 실행하는 경우 서비스 인스턴스에 속한 컨테이너만 볼륨을 공유할 수 있습니다. 서로 다른 서비스 인스턴스에 속하는 컨테이너는 볼륨을 공유하지 않습니다.

  • 메모리: 컨테이너 사용을 위해 RAM 지원 파일 시스템을 사용할 수 있습니다.

  • Snowflake 스테이지: Snowflake 스테이지를 생성하고 컨테이너가 스테이징된 파일에 편리하게 액세스할 수 있도록 할 수 있습니다. Snowflake 스테이지를 탑재할 때 다음 조건이 적용됩니다.

    • 외부 스테이지는 지원되지 않습니다. SSE 암호화를 사용하는 Snowflake 내부 스테이지만 지원됩니다. 다음과 같은 스테이지를 만들려면 CREATE STAGE 를 사용하십시오.

      CREATE STAGE my_stage ENCRYPTION = (type = 'SNOWFLAKE_SSE');
      
      Copy
    • 스테이지 또는 하위 디렉터리(예: @my_stage, @my_stage/folder)를 스테이지에 탑재할 수 있습니다. 스테이지에 파일(예: @my_stage/folder/file)을 탑재할 수 없습니다.

    • 서비스 역할에 따라 탑재된 스테이지에 액세스하기 위해 컨테이너에 부여되는 권한이 결정됩니다. 서비스 역할은 서비스/작업을 생성하는 데 사용되는 역할입니다. 또한 서비스/작업이 모든 Snowflake 상호 작용에 사용하는 역할이기도 합니다.

      예를 들어 서비스 역할에 스테이지에 대한 WRITE 권한이 없으면 해당 스테이지에 대한 탑재는 읽기 전용이 됩니다. 즉, 컨테이너는 스테이지의 파일만 읽을 수 있습니다. 서비스 역할에 스테이지에 대한 WRITE 권한이 있는 경우 해당 스테이지에 대한 탑재는 읽기 및 쓰기를 모두 지원합니다. Snowflake는 파일 업데이트를 비동기적으로 업로드합니다.

    • Snowflake 스테이지를 탑재하는 컨테이너는 일반적으로 루트 사용자로 실행됩니다. 그러나 때로는 컨테이너가 루트가 아닌 사용자로 실행될 수도 있습니다. 예:

      • 애플리케이션이 서드 파티 라이브러리를 사용하는 경우 라이브러리는 루트가 아닌 사용자를 사용하여 컨테이너 내에서 애플리케이션 코드를 실행합니다.

      • 보안과 같은 다른 이유로 인해 컨테이너 내부에서 루트가 아닌 사용자로 애플리케이션을 실행할 수도 있습니다.

        파일 사용자 권한과 관련된 잠재적인 오류를 방지하려면 컨테이너의 UID(사용자 ID) 및 GID(그룹 ID)를 사양의 일부로 설정하는 것이 중요합니다. 이는 특히 컨테이너 내에서 애플리케이션을 시작하거나 실행하기 위해 특정 사용자와 그룹을 사용하는 컨테이너와 관련이 있습니다. 적절한 UID 및 GID를 설정하면 루트가 아닌 사용자로 실행되는 컨테이너를 사용할 수 있습니다. 예:

        spec:
          ...
        
          volumes:
          - name: stagemount
            source: "@test"
            uid: <UID-value>
            gid: <GID-value>
        
        Copy

        Snowflake는 이 정보를 사용하여 적절한 권한으로 스테이지를 탑재합니다.

        컨테이너의 UID 및 GID를 얻는 방법은 다음과 같습니다.

        1. docker run 을 사용하여 로컬에서 컨테이너를 실행합니다.

        2. docker container list 명령을 사용하여 컨테이너 ID를 검색합니다. 다음은 샘플 출력 중 일부입니다.

          CONTAINER ID   IMAGE                       COMMAND
          —----------------------------------------------------------
          a6a1f1fe204d  tutorial-image         "/usr/local/bin/entr…"
          
        3. 컨테이너 내부에서 docker id 명령을 실행하여 UID와 GID를 가져옵니다.

          docker exec -it <container-id> id
          
          Copy

          샘플 출력:

          uid=0(root) gid=0(root) groups=0(root)
          

머신 러닝 애플리케이션에는 다음 두 가지 컨테이너가 포함되어 있습니다.

  • 주 애플리케이션용 app 컨테이너

  • 로그를 수집하여 Amazon S3에 업로드하는 logger-agent 컨테이너

이러한 컨테이너는 다음 두 볼륨을 사용합니다.

  • local 볼륨: 이 애플리케이션은 로그 에이전트가 읽는 로그를 작성합니다.

  • Snowflake 스테이지 @model_stage: 주 애플리케이션은 이 스테이지에서 파일을 읽습니다.

다음 예시 사양에서 app 컨테이너는 logsmodels 볼륨을 모두 탑재하고 logging-agent 컨테이너는 logs 볼륨만 탑재합니다.

spec:
  containers:
  - name: app
    image: <image1-name>
    volumeMounts:
    - name: logs
      mountPath: /opt/app/logs
    - name: models
      mountPath: /opt/models
  - name: logging-agent
    image: <image2-name>
    volumeMounts:
    - name: logs
      mountPath: /opt/logs
  volumes:
  - name: logs
    source: local
  - name: models
    source: "@model_stage"
Copy

서비스의 여러 인스턴스가 실행 중인 경우 서비스 인스턴스 내의 logging-agentapp 컨테이너는 logs 볼륨을 공유합니다. logs 볼륨은 서비스 인스턴스 간에 공유되지 않습니다.

이러한 볼륨 외에도 app 컨테이너가 2GB 메모리 볼륨도 사용하는 경우 사양을 수정하여 volumes 목록에 볼륨을 포함하고 app 컨테이너 volumeMounts 목록에 다른 볼륨 탑재도 추가하십시오.

spec:
  containers:
  - name: app
    image: <image1-name>
    volumeMounts:
    - name: logs
      mountPath: /opt/app/logs
    - name: models
      mountPath: /opt/models
    - name: my-mem-volume
      mountPath: /dev/shm
  - name: logging-agent
    image: <image2-name>
    volumeMounts:
    - name: logs
      mountPath: /opt/logs
  volumes:
  - name: logs
    source: local
  - name: models
    source: "@model_stage"
  - name: "my-mem-volume"
    source: memory
    size: 2G
Copy

memory 를 볼륨 source 로 지정할 때 메모리 크기를 나타내려면 volumes.size 필드도 지정해야 합니다. 지정할 수 있는 메모리 크기 단위에 대한 자세한 내용은 단위 정보 섹션을 참조하십시오.

spec.logExporters 필드(선택 사항)

spec.logExporters 를 사용하여 Snowflake가 애플리케이션 로그를 수집하는 방법을 구성합니다. Snowflake는 애플리케이션 컨테이너의 코드부터 표준 출력 또는 표준 오류까지 출력을 수집합니다.

Snowflake는 이러한 로그를 계정의 이벤트 테이블 로 내보냅니다. 자세한 내용은 로컬 컨테이너 로그에 액세스하기 섹션을 참조하십시오. spec.logExporters.eventTableConfig 를 사용하여 이벤트 테이블에 저장하려는 로그를 나타냅니다.

logExporters:
  eventTableConfig:
    logLevel: < INFO | ERROR | NONE >
Copy

지원되는 logLevel 값은 다음과 같습니다.

  • INFO: 모든 사용자 로그를 내보냅니다.

  • ERROR: 오류 로그만 내보냅니다. Snowflake는 stderr 스트림의 로그만 내보냅니다.

  • NONE (기본값): 로그를 이벤트 테이블로 내보내지 않습니다.

단위 정보

서비스 사양은 여러 위치에서 숫자 값을 사용합니다. Snowpark Container Services는 이러한 값을 표현하기 위해 다양한 단위를 지원합니다. 큰 값과 작은 값의 경우 표시된 대로 이진 및 십진 단위를 사용할 수 있습니다. 다음 목록에서 《#》는 정수 값을 나타냅니다.

  • 이진 단위:

    • numberKinumber*1024 를 의미합니다. 예를 들어, memory: 4Kimemory: 4096 과 같습니다.

    • numberMinumber*1024^2 을 의미합니다.

    • numberGinumber*1024^3 을 의미합니다.

  • 십진 단위:

    • numberknumber*10^3 을 의미합니다. 예를 들어, memory: 4kmemory: 4000 과 같습니다.

    • numberMnumber*10^6 을 의미합니다.

    • numberGnumber*10^9 을 의미합니다.

  • 분수 단위:

    • numbermnumber*0.001 을 의미합니다. 예를 들어, cpu: 500mcpu: 0.5 와 같습니다.