컨테이너 상태 검사
상태 검사(Probe)는 Compute Module 컨테이너가 요청을 받을 준비가 되었는지, 계속 정상 실행 중인지를 확인합니다. 검사 방식이 같아도 readiness와 liveness는 실패 후 조치가 다릅니다.
| 종류 | 성공 | 실패 |
|---|---|---|
| Readiness probe | 요청을 받을 수 있는 상태 | Unresponsive로 표시하고 성공할 때까지 요청을 보내지 않음 |
| Liveness probe | 계속 실행 | 컨테이너 재시작 |
두 검사는 컨테이너 생명주기 동안 주기적으로 실행합니다. 초기 모델이나 데이터 로드가 끝나야 요청을 처리할 수 있다면 readiness로 그 조건을 검사합니다.
설정 위치
Configure > Containers에서 대상 컨테이너를 선택하고 Readiness probe 또는 Liveness probe의 Set/Edit를 엽니다.
Exec 또는 HTTP 검사 중 하나를 선택합니다.
Exec 검사
컨테이너 안에서 명령을 실행하여 종료 코드 0이면 성공, 0이 아니면 실패로 판단합니다. Command와 Timeout(seconds)을 설정하며 제한 시간 안에 끝나지 않아도 실패합니다.
기본 exec readiness 명령은 echo입니다. 컨테이너에서 명령을 실행할 수 있는지는 확인하지만 앱의 초기화나 데이터 준비 완료까지 검사하는 것은 아닙니다.
데이터셋을 준비하는 readiness 예제
다음 read_table_probe.py를 app.py와 같은 폴더에 두고 이미지에 복사합니다. Application permissions의 CLIENT_ID/CLIENT_SECRET과 Foundry 호스트에 접근하는 소스 네트워크 정책이 필요합니다. requests도 설치해야 합니다.
FOUNDRY_HOST에는 HTTPS 접두사를 제외한 실제 호스트, DATASET_RID에는 읽을 데이터셋, CACHE_FILE에는 쓰기 가능한 볼륨 안의 파일 경로를 설정합니다. DEFAULT_CA_PATH는 컨테이너에 제공된 인증서 경로입니다. 예제는 master 브랜치의 CSV 테이블을 준비합니다.
import os
from pathlib import Path
import tempfile
import requests
def prepare_table() -> None:
target = Path(os.environ["CACHE_FILE"])
if target.is_file():
return
target.parent.mkdir(parents=True, exist_ok=True)
host = os.environ["FOUNDRY_HOST"]
ca_path = os.environ["DEFAULT_CA_PATH"]
with requests.Session() as session:
session.verify = ca_path
token_response = session.post(
f"https://{host}/multipass/api/oauth2/token",
data={
"grant_type": "client_credentials",
"client_id": os.environ["CLIENT_ID"],
"client_secret": os.environ["CLIENT_SECRET"],
"scope": "api:datasets-read",
},
timeout=10,
)
token_response.raise_for_status()
token = token_response.json()["access_token"]
with session.get(
f"https://{host}/api/v1/datasets/{os.environ['DATASET_RID']}/readTable",
params={"branchId": "master", "format": "CSV"},
headers={"Authorization": f"Bearer {token}"},
timeout=30,
stream=True,
) as response:
response.raise_for_status()
temporary = None
try:
with tempfile.NamedTemporaryFile(dir=target.parent, delete=False) as output:
temporary = Path(output.name)
for chunk in response.iter_content(chunk_size=64 * 1024):
output.write(chunk)
os.replace(temporary, target)
finally:
if temporary is not None:
temporary.unlink(missing_ok=True)
if __name__ == "__main__":
prepare_table()
probe의 Command는 python read_table_probe.py로 지정합니다. 파일이 완성되기 전에 성공 표지가 생기지 않도록 임시 파일에 받은 뒤 같은 볼륨에서 이름을 바꿉니다. 이미 완성된 파일이 있으면 인증 요청과 다운로드를 반복하지 않습니다.
인증 또는 다운로드 실패는 프로세스의 0이 아닌 종료로 전파되어 readiness가 실패합니다. probe 제한 시간에는 토큰 요청과 파일 전송 시간을 포함해야 합니다. 이 검사는 초기 파일 준비 예이며 데이터셋이 이후 바뀔 때 자동으로 파일을 갱신하는 로직은 아닙니다.
HTTP 검사
컨테이너의 엔드포인트에 HTTP GET을 보냅니다. 상태 코드 200부터 399까지 성공이며 그 밖의 코드 또는 시간 초과는 실패입니다.
| 필드 | 조건 |
|---|---|
| Path | 검사할 URL 경로 |
| Port | 1024~65535. 8945와 8946 제외 |
| HTTP header | 선택 이름/값 쌍 |
| Timeout(seconds) | 응답을 기다릴 최대 시간 |
상태 변화와 재시작 이유는 복제본 진단에서 확인합니다.