์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ์ ๊ฒ€ ๊ตฌ์„ฑ

Cloud Run ์ƒํƒœ ์ ๊ฒ€์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰๋˜๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Cloud Run ์ƒํƒœ ์ ๊ฒ€์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์š”์ฒญ์„ ์ˆ˜์‹ ํ•  ์ค€๋น„๊ฐ€ ๋œ ์‹œ์ ๊ณผ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋น„์ •์ƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ์‹œ์ ์„ ๋งž์ถค์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€

๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœ๋ธŒ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜๋ฝํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ์„œ๋น„์Šค ์‹œ์ž‘์„ ๊ฐ„์„ญํ•˜์ง€ ์•Š๋„๋ก ์‹œ์ž‘ ํ”„๋กœ๋ธŒ์—์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ๋•Œ๊นŒ์ง€ ํ™œ์„ฑ ํ™•์ธ์ด ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.
    • ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ€๋™ ๋ฐ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์กฐ๊ธฐ ์ข…๋ฃŒ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฏ€๋กœ ๋А๋ฆฌ๊ฒŒ ์‹œ์ž‘๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์— ํ™œ์„ฑ ํ™•์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ™œ์„ฑ ์—ฌ๋ถ€ ํ”„๋กœ๋ธŒ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

    • ์ด ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉด ๋ฒ„๊ทธ ๋ฐœ์ƒ ์‹œ ์„œ๋น„์Šค ๊ฐ€์šฉ์„ฑ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ๊ฐœ๋ณ„ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ด์ง€๋งŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ์ธ์Šคํ„ด์Šค ์žฅ์• ์— ์ฃผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ์กฐ์ง ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๋ฅผ ํ•„์ˆ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค์—์„œ ์‹œ์ž‘ ๋˜๋Š” ํ™œ์„ฑ ํ”„๋กœ๋ธŒ ์‹คํŒจ๊ฐ€ ๋ฐ˜๋ณต๋˜๋ฉด Cloud Run์€ ์ œ์–ด๋˜์ง€ ์•Š๋Š” ๋น„์ •์ƒ ์ข…๋ฃŒ ๋ฃจํ”„๊ฐ€ ๋ฐฉ์ง€๋˜๋„๋ก ์ธ์Šคํ„ด์Šค ๋‹ค์‹œ ์‹œ์ž‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๋ธŒ ๊ตฌ์„ฑ

๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ƒˆ ๋ฒ„์ „์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…์‹œ์  ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์œผ๋ฉด ์ดํ›„ ๋ฒ„์ „์—๋„ ์ด ๊ตฌ์„ฑ ์„ค์ •์ด ์ž๋™์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ ํ”„๋กœ๋ธŒ ๊ตฌ์„ฑ

Google Cloud ์ฝ˜์†”, YAML ๋˜๋Š” Terraform์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP, TCP, gRPC ํ”„๋กœ๋ธŒ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ Cloud Run ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Cloud Run์œผ๋กœ ์ด๋™

  2. ์ƒˆ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ, ๋ณผ๋ฅจ, ๋„คํŠธ์›Œํ‚น, ๋ณด์•ˆ์„ ํ™•์žฅํ•˜์—ฌ ์ƒํƒœ ์ ๊ฒ€ ์˜ต์…˜์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ ๊ตฌ์„ฑํ•˜๋ ค๋Š” ์„œ๋น„์Šค๋ฅผ ํด๋ฆญํ•œ ํ›„ ์ˆ˜์ • ๋ฐ ๋ฐฐํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ƒํƒœ ์ ๊ฒ€ ์˜ต์…˜์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

  3. ์ปจํ…Œ์ด๋„ˆ ์„น์…˜์—์„œ์ƒํƒœ ์ ๊ฒ€์œผ๋กœ ์ด๋™ํ•˜๊ณ  ์ƒํƒœ ์ ๊ฒ€ ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ƒํƒœ ์ ๊ฒ€ ์ถ”๊ฐ€ ๊ตฌ์„ฑ ํŒจ๋„์„ ์—ฝ๋‹ˆ๋‹ค.

  4. ์ƒํƒœ ์ ๊ฒ€ ์œ ํ˜• ์„ ํƒ ๋ฉ”๋‰ด์—์„œ ์ถ”๊ฐ€ํ•  ์ƒํƒœ ์ ๊ฒ€ ์œ ํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  5. ํ”„๋กœ๋ธŒ ์œ ํ˜• ์„ ํƒ ๋ฉ”๋‰ด์—์„œ ์‚ฌ์šฉํ•  ํ”„๋กœ๋ธŒ ์œ ํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: HTTP ๋˜๋Š” gRPC). ๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœ๋ธŒ ๊ตฌ์„ฑ ์–‘์‹์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  6. ํ”„๋กœ๋ธŒ ๊ตฌ์„ฑ์€ ํ”„๋กœ๋ธŒ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ”„๋กœ๋ธŒ ์„ค์ •์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • HTTP ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      • ์„œ๋น„์Šค๊ฐ€ HTTP/2๊ฐ€ ์•„๋‹Œ HTTP/1(Cloud Run ๊ธฐ๋ณธ๊ฐ’)์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      • ๊ฒฝ๋กœ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”๋“œํฌ์ธํŠธ์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: /).

      • HTTP ํ—ค๋” ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•˜์—ฌ ์„ ํƒ์  ์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„ ํ•„๋“œ์— ํ—ค๋” ์ด๋ฆ„์„, ๊ฐ’ ํ•„๋“œ์— ํ—ค๋” ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. HTTP ํ—ค๋” ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•˜์—ฌ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    • gRPC ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ gRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

    • ํฌํŠธ์˜ ๊ฒฝ์šฐ ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    • ์ดˆ๊ธฐ ์ง€์—ฐ์˜ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. 0~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.

    • ๊ธฐ๊ฐ„์— ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์‹œ๊ฐ„(์ดˆ)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 2์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ 2๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. 1~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 10์ดˆ์ž…๋‹ˆ๋‹ค.

    • ์‹คํŒจ ๊ธฐ์ค€์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋กœ๋ธŒ๋ฅผ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.

    • ์ œํ•œ ์‹œ๊ฐ„์— ํ”„๋กœ๋ธŒ๊ฐ€ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์‹œ๊ฐ„(์ดˆ)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ periodSeconds์— ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 1~240 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.

  7. ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ƒˆ ๊ธฐ์ค€์ ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

gcloud

TCP ์‹œ์ž‘

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  gcloud run deploy SERVICE \
      --image=IMAGE_URL \
      --startup-probe tcpSocket.port=CONTAINER_PORT,initialDelaySeconds=DELAY,failureThreshold=THRESHOLD,timeoutSeconds=TIMEOUT,periodSeconds=PERIOD

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • SERVICE๋ฅผ Cloud Run ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • IMAGE_URL์„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ˆ: us-docker.pkg.dev/cloudrun/container/hello:latest)๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ REPO_NAME ์ €์žฅ์†Œ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL์˜ ํ˜•์‹์€ LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) CONTAINER_PORT: ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • DELAY: ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ). 0~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) TIMEOUT: ํ”„๋กœ๋ธŒ๊ฐ€ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ). ์ด ๊ฐ’์€ periodSeconds์— ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 1~240 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
  • THRESHOLD: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋กœ๋ธŒ๋ฅผ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.
  • PERIOD: ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์‹œ๊ฐ„(์ดˆ). ์˜ˆ๋ฅผ ๋“ค์–ด 2์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ 2๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. 1~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 10์ดˆ์ž…๋‹ˆ๋‹ค.

HTTP ์‹œ์ž‘

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  gcloud run deploy SERVICE \
      --image=IMAGE_URL \
      --startup-probe httpGet.path=PATH,httpGet.port=CONTAINER_PORT,initialDelaySeconds=DELAY,failureThreshold=THRESHOLD,timeoutSeconds=TIMEOUT,periodSeconds=PERIOD

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • SERVICE๋ฅผ Cloud Run ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • IMAGE_URL์„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ˆ: us-docker.pkg.dev/cloudrun/container/hello:latest)๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ REPO_NAME ์ €์žฅ์†Œ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL์˜ ํ˜•์‹์€ LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG์ž…๋‹ˆ๋‹ค.
  • PATH: HTTP ์—”๋“œํฌ์ธํŠธ์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ(์˜ˆ: /ready)
  • (์„ ํƒ์‚ฌํ•ญ) CONTAINER_PORT: ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) DELAY: ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ). 0~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) THRESHOLD: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋กœ๋ธŒ๋ฅผ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) TIMEOUT: ํ”„๋กœ๋ธŒ๊ฐ€ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ). ์ด ๊ฐ’์€ periodSeconds์— ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 1~240 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) PERIOD: ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์‹œ๊ฐ„(์ดˆ). ์˜ˆ๋ฅผ ๋“ค์–ด 2์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ 2๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. 1~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 10์ดˆ์ž…๋‹ˆ๋‹ค.

gRPC ์‹œ์ž‘

gRPC ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ gRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  gcloud run deploy SERVICE \
      --image=IMAGE_URL \
      --startup-probe grpc.port=CONTAINER_PORT,grpc.service=GRPC_SERVICE,initialDelaySeconds=DELAY,failureThreshold=THRESHOLD,timeoutSeconds=TIMEOUT,periodSeconds=PERIOD

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • SERVICE๋ฅผ Cloud Run ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • IMAGE_URL์„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ˆ: us-docker.pkg.dev/cloudrun/container/hello:latest)๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ REPO_NAME ์ €์žฅ์†Œ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL์˜ ํ˜•์‹์€ LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) GRPC_SERVICE. ์„ค์ •ํ•˜๋ฉด grpc.health.v1.Health.Check rpc๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ grpc.health.v1.HealthCheckRequest์˜ ์„œ๋น„์Šค ํ•„๋“œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) CONTAINER_PORT: ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) DELAY: ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ). 0~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) THRESHOLD: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋กœ๋ธŒ๋ฅผ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) TIMEOUT: ํ”„๋กœ๋ธŒ๊ฐ€ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ). ์ด ๊ฐ’์€ periodSeconds์— ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 1~240 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) PERIOD: ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์‹œ๊ฐ„(์ดˆ). ์˜ˆ๋ฅผ ๋“ค์–ด 2์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ 2๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. 1~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 10์ดˆ์ž…๋‹ˆ๋‹ค.

YAML

TCP ์‹œ์ž‘

  1. ์ƒˆ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋น„์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ YAML ๊ตฌ์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
    gcloud run services describe SERVICE --format export > service.yaml
  2. ๋‹ค์Œ๊ณผ ๊ฐ™์ด startupProbe ์†์„ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
     template:
       metadata:
       spec:
         containers:
         - image: IMAGE_URL
           startupProbe:
             tcpSocket:
               port: CONTAINER_PORT
             initialDelaySeconds: DELAY
             timeoutSeconds: TIMEOUT
             failureThreshold: THRESHOLD
             periodSeconds: PERIOD

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • SERVICE๋ฅผ Cloud Run ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
    • IMAGE_URL์„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ˆ: us-docker.pkg.dev/cloudrun/container/hello:latest)๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ REPO_NAME ์ €์žฅ์†Œ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL์˜ ํ˜•์‹์€ LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) CONTAINER_PORT: ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • DELAY: ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ). 0~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) TIMEOUT: ํ”„๋กœ๋ธŒ๊ฐ€ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ). ์ด ๊ฐ’์€ periodSeconds์— ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 1~240 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
    • THRESHOLD: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋กœ๋ธŒ๋ฅผ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.
    • PERIOD: ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์‹œ๊ฐ„(์ดˆ). ์˜ˆ๋ฅผ ๋“ค์–ด 2์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ 2๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. 1~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 10์ดˆ์ž…๋‹ˆ๋‹ค.
  3. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
    gcloud run services replace service.yaml

HTTP ์‹œ์ž‘

  1. ์ƒˆ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋น„์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ YAML ๊ตฌ์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
    gcloud run services describe SERVICE --format export > service.yaml
  2. ์„œ๋น„์Šค๊ฐ€ HTTP/2๊ฐ€ ์•„๋‹Œ HTTP/1(Cloud Run ๊ธฐ๋ณธ๊ฐ’)์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  3. ๋‹ค์Œ๊ณผ ๊ฐ™์ด startupProbe ์†์„ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
        spec:
          containers:
          - image: IMAGE_URL
            startupProbe:
              httpGet:
                path: PATH
                port: CONTAINER_PORT
                httpHeaders:
                  - name: HEADER_NAME
                    value: HEADER_VALUE
              initialDelaySeconds: DELAY
              timeoutSeconds: TIMEOUT
              failureThreshold: THRESHOLD
              periodSeconds: PERIOD

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • SERVICE๋ฅผ Cloud Run ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
    • IMAGE_URL์„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ˆ: us-docker.pkg.dev/cloudrun/container/hello:latest)๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ REPO_NAME ์ €์žฅ์†Œ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL์˜ ํ˜•์‹์€ LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG์ž…๋‹ˆ๋‹ค.
    • PATH: HTTP ์—”๋“œํฌ์ธํŠธ์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ(์˜ˆ: /ready)
    • (์„ ํƒ์‚ฌํ•ญ) CONTAINER_PORT: ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) DELAY: ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ). 0~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) THRESHOLD: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋กœ๋ธŒ๋ฅผ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) httpHeaders: ๋‹ค์Œ๊ณผ ๊ฐ™์ด HEADER_NAME ๋ฐ HEADER_VALUE ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋˜๋Š” ๋ฐ˜๋ณต๋˜๋Š” ์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) TIMEOUT: ํ”„๋กœ๋ธŒ๊ฐ€ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ). ์ด ๊ฐ’์€ periodSeconds์— ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 1~240 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) PERIOD: ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์‹œ๊ฐ„(์ดˆ). ์˜ˆ๋ฅผ ๋“ค์–ด 2์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ 2๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. 1~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 10์ดˆ์ž…๋‹ˆ๋‹ค.
  4. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
    gcloud run services replace service.yaml

gRPC ์‹œ์ž‘

gRPC ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ gRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  1. ์ƒˆ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋น„์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ YAML ๊ตฌ์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
    gcloud run services describe SERVICE --format export > service.yaml
  2. ๋‹ค์Œ๊ณผ ๊ฐ™์ด startupProbe ์†์„ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
        spec:
          containers:
          - image: IMAGE_URL
            startupProbe:
              grpc:
                service: GRPC_SERVICE
                port: CONTAINER_PORT
              initialDelaySeconds: DELAY
              timeoutSeconds: TIMEOUT
              failureThreshold: THRESHOLD
              periodSeconds: PERIOD

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • SERVICE๋ฅผ Cloud Run ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
    • IMAGE_URL์„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ˆ: us-docker.pkg.dev/cloudrun/container/hello:latest)๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ REPO_NAME ์ €์žฅ์†Œ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL์˜ ํ˜•์‹์€ LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) GRPC_SERVICE. ์„ค์ •ํ•˜๋ฉด grpc.health.v1.Health.Check rpc๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ grpc.health.v1.HealthCheckRequest์˜ ์„œ๋น„์Šค ํ•„๋“œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) CONTAINER_PORT: ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) DELAY: ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ). 0~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) THRESHOLD: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋กœ๋ธŒ๋ฅผ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) TIMEOUT: ํ”„๋กœ๋ธŒ๊ฐ€ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ). ์ด ๊ฐ’์€ periodSeconds์— ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 1~240 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) PERIOD: ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์‹œ๊ฐ„(์ดˆ). ์˜ˆ๋ฅผ ๋“ค์–ด 2์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ 2๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. 1~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 10์ดˆ์ž…๋‹ˆ๋‹ค.
  3. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
    gcloud run services replace service.yaml

Terraform

Terraform ๊ตฌ์„ฑ์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ Terraform ๋ช…๋ น์–ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

TCP ์‹œ์ž‘

๋‹ค์Œ๊ณผ ๊ฐ™์ด startup_probe ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Cloud Run ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service-healthcheck"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"

      startup_probe {
        failure_threshold     = 5
        initial_delay_seconds = 10
        timeout_seconds       = 3
        period_seconds        = 3

        tcp_socket {
          port = 8080
        }
      }
    }
  }
}

HTTP ์‹œ์ž‘

์„œ๋น„์Šค๊ฐ€ HTTP/2๊ฐ€ ์•„๋‹Œ HTTP/1(Cloud Run ๊ธฐ๋ณธ๊ฐ’)์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด startup_probe ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Cloud Run ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service-healthcheck"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"

      startup_probe {
        failure_threshold     = 5
        initial_delay_seconds = 10
        timeout_seconds       = 3
        period_seconds        = 3

        http_get {
          path = "/"
          # Custom headers to set in the request
          # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#http_headers
          http_headers {
            name  = "Access-Control-Allow-Origin"
            value = "*"
          }
        }
      }
    }
  }
}

gRPC ์‹œ์ž‘

gRPC ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ gRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ๊ณผ ๊ฐ™์ด startup_probe ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Cloud Run ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service-healthcheck"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      # Note: Change to the name of your image
      image = "us-docker.pkg.dev/cloudrun/container/hello"

      startup_probe {
        failure_threshold     = 5
        initial_delay_seconds = 10
        timeout_seconds       = 3
        period_seconds        = 3

        grpc {
          # Note: Change to the name of your pre-existing grpc health status service
          service = "grpc.health.v1.Health"
        }
      }
    }
  }
}

๊ธฐ๋ณธ TCP ์‹œ์ž‘ ํ”„๋กœ๋ธŒ

TCP ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ƒˆ Cloud Run ์„œ๋น„์Šค์— ์ž๋™ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ”„๋กœ๋ธŒ๋Š” ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

startupProbe:
  tcpSocket:
    port: CONTAINER_PORT
  timeoutSeconds: 1
  periodSeconds: 10
  failureThreshold: 3

CONTAINER_PORT๋ฅผ ์„œ๋น„์Šค์— ์„ค์ •๋œ ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€์— ์žˆ๋Š” ํ”„๋กœ๋ธŒ ๊ตฌ์„ฑ ์„น์…˜์˜ ์•ˆ๋‚ด์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ ํ”„๋กœ๋ธŒ ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ ๋™์ž‘

ํ”„๋กœ๋ธŒ ์œ ํ˜• ์š”๊ตฌ์‚ฌํ•ญ ๋™์ž‘
TCP ์‹œ์ž‘ ์—†์Œ ๊ธฐ๋ณธ์ ์œผ๋กœ Cloud Run์€ TCP ์—ฐ๊ฒฐ๋กœ ์ง€์ •๋œ ํฌํŠธ์—์„œ TCP ์†Œ์ผ“์„ ์—ฝ๋‹ˆ๋‹ค. Cloud Run์—์„œ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ์ˆ˜ ์—†์œผ๋ฉด ์‹คํŒจํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹œ์ž‘ ํ”„๋กœ๋ธŒ๊ฐ€ 240์ดˆ๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†๋Š” ์ง€์ •๋œ ์‹œ๊ฐ„(failureThreshold * periodSeconds) ๋‚ด์— ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. TCP ๊ธฐ๋ณธ๊ฐ’๋„ ์ฐธ์กฐํ•˜์„ธ์š”.
HTTP ์‹œ์ž‘ HTTP ์ƒํƒœ ์ ๊ฒ€ ์—”๋“œํฌ์ธํŠธ ๋งŒ๋“ค๊ธฐ
HTTP/1 ์‚ฌ์šฉ
ํ”„๋กœ๋ธŒ ๊ตฌ์„ฑ ํ›„ Cloud Run์€ ์„œ๋น„์Šค ์ƒํƒœ ์ ๊ฒ€ ์—”๋“œํฌ์ธํŠธ(์˜ˆ: /ready)์— HTTP GET ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 200๊ณผ 400 ์‚ฌ์ด์˜ ์‘๋‹ต์€ ์„ฑ๊ณต์ด๊ณ , ๋‹ค๋ฅธ ๋ชจ๋“  ์‘๋‹ต์€ ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์‹œ์ž‘ ํ”„๋กœ๋ธŒ๊ฐ€ ์ง€์ •๋œ ์‹œ๊ฐ„(failureThreshold * periodSeconds), ์ฆ‰ 240์ดˆ ์ด๋‚ด์— ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

HTTP ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๋ฅผ ๊ตฌ์„ฑํ•œ ๊ฒฝ์šฐ ์ง€์ •๋œ ์‹œ๊ฐ„ ๋‚ด์— HTTP ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด HTTP ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
gRPC ์‹œ์ž‘ Cloud Run ์„œ๋น„์Šค์—์„œ gRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„ํ•˜๊ธฐ ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๊ฐ€ ์ง€์ •๋œ ์‹œ๊ฐ„(failureThreshold * periodSeconds), ์ฆ‰ 240์ดˆ ์ด๋‚ด์— ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

ํ™œ์„ฑ ํ”„๋กœ๋ธŒ ๊ตฌ์„ฑ

Google Cloud ์ฝ˜์†”, YAML ๋˜๋Š” Terraform์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP, ๋ฐ gRPC ํ”„๋กœ๋ธŒ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜์†”

gRPC ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ gRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  1. Google Cloud ์ฝ˜์†”์—์„œ Cloud Run ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Cloud Run์œผ๋กœ ์ด๋™

  2. ์ƒˆ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ, ๋ณผ๋ฅจ, ๋„คํŠธ์›Œํ‚น, ๋ณด์•ˆ์„ ํ™•์žฅํ•˜์—ฌ ์ƒํƒœ ์ ๊ฒ€ ์˜ต์…˜์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ ๊ตฌ์„ฑํ•˜๋ ค๋Š” ์„œ๋น„์Šค๋ฅผ ํด๋ฆญํ•œ ํ›„ ์ˆ˜์ • ๋ฐ ๋ฐฐํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ƒํƒœ ์ ๊ฒ€ ์˜ต์…˜์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

  3. ์ปจํ…Œ์ด๋„ˆ ์„น์…˜์—์„œ์ƒํƒœ ์ ๊ฒ€์œผ๋กœ ์ด๋™ํ•˜๊ณ  ์ƒํƒœ ์ ๊ฒ€ ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ƒํƒœ ์ ๊ฒ€ ์ถ”๊ฐ€ ๊ตฌ์„ฑ ํŒจ๋„์„ ์—ฝ๋‹ˆ๋‹ค.

  4. ์ƒํƒœ ์ ๊ฒ€ ์œ ํ˜• ์„ ํƒ ๋ฉ”๋‰ด์—์„œ ์ถ”๊ฐ€ํ•  ์ƒํƒœ ์ ๊ฒ€ ์œ ํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  5. ํ”„๋กœ๋ธŒ ์œ ํ˜• ์„ ํƒ ๋ฉ”๋‰ด์—์„œ ์‚ฌ์šฉํ•  ํ”„๋กœ๋ธŒ ์œ ํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: HTTP ๋˜๋Š” gRPC). ๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœ๋ธŒ ๊ตฌ์„ฑ ์–‘์‹์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  6. ํ”„๋กœ๋ธŒ ๊ตฌ์„ฑ์€ ํ”„๋กœ๋ธŒ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ”„๋กœ๋ธŒ ์„ค์ •์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • HTTP ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      • ์„œ๋น„์Šค๊ฐ€ HTTP/2๊ฐ€ ์•„๋‹Œ HTTP/1(Cloud Run ๊ธฐ๋ณธ๊ฐ’)์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      • ๊ฒฝ๋กœ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”๋“œํฌ์ธํŠธ์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: /).

      • HTTP ํ—ค๋” ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•˜์—ฌ ์„ ํƒ์  ์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„ ํ•„๋“œ์— ํ—ค๋” ์ด๋ฆ„์„, ๊ฐ’ ํ•„๋“œ์— ํ—ค๋” ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. HTTP ํ—ค๋” ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•˜์—ฌ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    • gRPC ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ gRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

    • ํฌํŠธ์˜ ๊ฒฝ์šฐ ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    • ์ดˆ๊ธฐ ์ง€์—ฐ์˜ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. 0~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.

    • ๊ธฐ๊ฐ„์— ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์‹œ๊ฐ„(์ดˆ)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 2์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ 2๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. 1~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 10์ดˆ์ž…๋‹ˆ๋‹ค.

    • ์‹คํŒจ ๊ธฐ์ค€์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋กœ๋ธŒ๋ฅผ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.

    • ์ œํ•œ ์‹œ๊ฐ„์— ํ”„๋กœ๋ธŒ๊ฐ€ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์‹œ๊ฐ„(์ดˆ)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ periodSeconds์— ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 1~240 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.

  7. ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ƒˆ ๊ธฐ์ค€์ ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

gcloud

HTTP ํ™œ์„ฑ

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  gcloud run deploy SERVICE \
      --image=IMAGE_URL \
      --liveness-probe httpGet.path=PATH,httpGet.port=CONTAINER_PORT,initialDelaySeconds=DELAY,failureThreshold=THRESHOLD,timeoutSeconds=TIMEOUT,periodSeconds=PERIOD

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • SERVICE๋ฅผ Cloud Run ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • IMAGE_URL์„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ˆ: us-docker.pkg.dev/cloudrun/container/hello:latest)๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ REPO_NAME ์ €์žฅ์†Œ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL์˜ ํ˜•์‹์€ LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG์ž…๋‹ˆ๋‹ค.
  • PATH: HTTP ์—”๋“œํฌ์ธํŠธ์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ(์˜ˆ: /ready)
  • (์„ ํƒ์‚ฌํ•ญ) CONTAINER_PORT: ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) DELAY: ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ). 0~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) THRESHOLD: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋กœ๋ธŒ๋ฅผ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) TIMEOUT: ํ”„๋กœ๋ธŒ๊ฐ€ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ). ์ด ๊ฐ’์€ periodSeconds์— ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 1~3,600 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) PERIOD: ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์‹œ๊ฐ„(์ดˆ). ์˜ˆ๋ฅผ ๋“ค์–ด 2๋ฅผ ์ง€์ •ํ•˜๋ฉด 2์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. 1~3,600์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 10์ดˆ์ž…๋‹ˆ๋‹ค.

gRPC ํ™œ์„ฑ

gRPC ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ gRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  gcloud run deploy SERVICE \
      --image=IMAGE_URL \
      --liveness-probe grpc.port=CONTAINER_PORT,grpc.service=GRPC_SERVICE,initialDelaySeconds=DELAY,failureThreshold=THRESHOLD,timeoutSeconds=TIMEOUT,periodSeconds=PERIOD

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • SERVICE๋ฅผ Cloud Run ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • IMAGE_URL์„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ˆ: us-docker.pkg.dev/cloudrun/container/hello:latest)๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ REPO_NAME ์ €์žฅ์†Œ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL์˜ ํ˜•์‹์€ LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) GRPC_SERVICE. ์„ค์ •ํ•˜๋ฉด grpc.health.v1.Health.Check rpc๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ grpc.health.v1.HealthCheckRequest์˜ ์„œ๋น„์Šค ํ•„๋“œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) CONTAINER_PORT: ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) DELAY: ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ). 0~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) THRESHOLD: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋กœ๋ธŒ๋ฅผ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) TIMEOUT: ํ”„๋กœ๋ธŒ๊ฐ€ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ). ์ด ๊ฐ’์€ periodSeconds์— ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 1~3,600 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
  • (์„ ํƒ์‚ฌํ•ญ) PERIOD: ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์‹œ๊ฐ„(์ดˆ). ์˜ˆ๋ฅผ ๋“ค์–ด 2๋ฅผ ์ง€์ •ํ•˜๋ฉด 2์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. 1~3,600์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 10์ดˆ์ž…๋‹ˆ๋‹ค.

YAML

HTTP ํ™œ์„ฑ

  1. ์ƒˆ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋น„์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ YAML ๊ตฌ์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
    gcloud run services describe SERVICE --format export > service.yaml
  2. ์„œ๋น„์Šค๊ฐ€ HTTP/2๊ฐ€ ์•„๋‹Œ HTTP/1(Cloud Run ๊ธฐ๋ณธ๊ฐ’)์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  3. ๋‹ค์Œ๊ณผ ๊ฐ™์ด livenessProbe ์†์„ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
        spec:
          containers:
          - image: IMAGE_URL
            livenessProbe:
              httpGet:
                path: PATH
                port: CONTAINER_PORT
                httpHeaders:
                  - name: HEADER_NAME
                    value: HEADER_VALUE
              initialDelaySeconds: DELAY
              timeoutSeconds: TIMEOUT
              failureThreshold: THRESHOLD
              periodSeconds: PERIOD

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • SERVICE๋ฅผ Cloud Run ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
    • IMAGE_URL์„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ˆ: us-docker.pkg.dev/cloudrun/container/hello:latest)๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ REPO_NAME ์ €์žฅ์†Œ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL์˜ ํ˜•์‹์€ LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG์ž…๋‹ˆ๋‹ค.
    • PATH: HTTP ์—”๋“œํฌ์ธํŠธ์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ(์˜ˆ: /ready)
    • (์„ ํƒ์‚ฌํ•ญ) CONTAINER_PORT: ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) DELAY: ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ). 0~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) THRESHOLD: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋กœ๋ธŒ๋ฅผ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) httpHeaders: ๋‹ค์Œ๊ณผ ๊ฐ™์ด HEADER_NAME ๋ฐ HEADER_VALUE ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋˜๋Š” ๋ฐ˜๋ณต๋˜๋Š” ์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) TIMEOUT: ํ”„๋กœ๋ธŒ๊ฐ€ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ). ์ด ๊ฐ’์€ periodSeconds์— ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 1~3,600 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) PERIOD: ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์‹œ๊ฐ„(์ดˆ). ์˜ˆ๋ฅผ ๋“ค์–ด 2๋ฅผ ์ง€์ •ํ•˜๋ฉด 2์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. 1~3,600์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 10์ดˆ์ž…๋‹ˆ๋‹ค.
  4. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
    gcloud run services replace service.yaml

gRPC ํ™œ์„ฑ

gRPC ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ gRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  1. ์ƒˆ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋น„์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ YAML ๊ตฌ์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
    gcloud run services describe SERVICE --format export > service.yaml
  2. ๋‹ค์Œ๊ณผ ๊ฐ™์ด livenessProbe ์†์„ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
        spec:
          containers:
          - image: IMAGE_URL
            livenessProbe:
              grpc:
                port: CONTAINER_PORT
                service: GRPC_SERVICE
              initialDelaySeconds: DELAY
              timeoutSeconds: TIMEOUT
              failureThreshold: THRESHOLD
              periodSeconds: PERIOD

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • SERVICE๋ฅผ Cloud Run ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
    • IMAGE_URL์„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ˆ: us-docker.pkg.dev/cloudrun/container/hello:latest)๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ REPO_NAME ์ €์žฅ์†Œ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL์˜ ํ˜•์‹์€ LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) GRPC_SERVICE. ์„ค์ •ํ•˜๋ฉด grpc.health.v1.Health.Check rpc๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ grpc.health.v1.HealthCheckRequest์˜ ์„œ๋น„์Šค ํ•„๋“œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) CONTAINER_PORT: ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) DELAY: ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ). 0~240์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 0์ดˆ์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) THRESHOLD: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋กœ๋ธŒ๋ฅผ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) TIMEOUT: ํ”„๋กœ๋ธŒ๊ฐ€ ํƒ€์ž„์•„์›ƒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ). ์ด ๊ฐ’์€ periodSeconds์— ์ง€์ •๋œ ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 1~3,600 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.
    • (์„ ํƒ์‚ฌํ•ญ) PERIOD: ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์‹œ๊ฐ„(์ดˆ). ์˜ˆ๋ฅผ ๋“ค์–ด 2๋ฅผ ์ง€์ •ํ•˜๋ฉด 2์ดˆ๋งˆ๋‹ค ํ”„๋กœ๋ธŒ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. 1~3,600์ดˆ ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 10์ดˆ์ž…๋‹ˆ๋‹ค.

  3. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
    gcloud run services replace service.yaml

Terraform

Terraform ๊ตฌ์„ฑ์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ Terraform ๋ช…๋ น์–ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

HTTP ํ™œ์„ฑ

์„œ๋น„์Šค๊ฐ€ HTTP/2๊ฐ€ ์•„๋‹Œ HTTP/1(Cloud Run ๊ธฐ๋ณธ๊ฐ’)์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด liveness_probe ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Cloud Run ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service-healthcheck"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"

      liveness_probe {
        failure_threshold     = 5
        initial_delay_seconds = 10
        timeout_seconds       = 3
        period_seconds        = 3

        http_get {
          path = "/"
          # Custom headers to set in the request
          # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#http_headers
          http_headers {
            name  = "Access-Control-Allow-Origin"
            value = "*"
          }
        }
      }
    }
  }
}

gRPC ํ™œ์„ฑ

gRPC ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ gRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ๊ณผ ๊ฐ™์ด liveness_probe ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Cloud Run ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service-healthcheck"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      # Note: Change to the name of your image
      image = "us-docker.pkg.dev/cloudrun/container/hello"

      liveness_probe {
        failure_threshold     = 5
        initial_delay_seconds = 10
        timeout_seconds       = 3
        period_seconds        = 3

        # Note: Change to the name of your pre-existing grpc health status service
        grpc {
          service = "grpc.health.v1.Health"
        }
      }
    }
  }
}

ํ™œ์„ฑ ํ”„๋กœ๋ธŒ ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ ๋™์ž‘

ํ”„๋กœ๋ธŒ ์œ ํ˜• ์š”๊ตฌ์‚ฌํ•ญ ๋™์ž‘
HTTP ํ™œ์„ฑ HTTP ์ƒํƒœ ์ ๊ฒ€ ์—”๋“œํฌ์ธํŠธ ๋งŒ๋“ค๊ธฐ
HTTP/1 ์‚ฌ์šฉ
ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๋Š” ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๊ฐ€ ์„ฑ๊ณตํ•œ ํ›„์—๋งŒ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋ธŒ๊ฐ€ ๊ตฌ์„ฑ๋˜๊ณ  ๋ชจ๋“  ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด Cloud Run์ด ์„œ๋น„์Šค ์ƒํƒœ ์ ๊ฒ€ ์—”๋“œํฌ์ธํŠธ(์˜ˆ: /health)์— HTTP GET ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 200๊ณผ 400 ์‚ฌ์ด์˜ ์‘๋‹ต์€ ์„ฑ๊ณต์ด๊ณ , ๋‹ค๋ฅธ ๋ชจ๋“  ์‘๋‹ต์€ ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๊ฐ€ ์ง€์ •๋œ ์‹œ๊ฐ„(failureThreshold * periodSeconds) ๋‚ด์— ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ SIGKILL ์‹ ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์—์„œ ์•„์ง ์ฒ˜๋ฆฌ ์ค‘์ธ ๋‚˜๋จธ์ง€ ์š”์ฒญ์€ HTTP ์ƒํƒœ ์ฝ”๋“œ 503์œผ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด Cloud Run ์ž๋™ ํ™•์žฅ์ด ์ƒˆ ์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
gRPC ํ™œ์„ฑ Cloud Run ์„œ๋น„์Šค์—์„œ gRPC ์ƒํƒœ ์ ๊ฒ€ ํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„ํ•˜๊ธฐ gRPC ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๊ฐ€ ์„ฑ๊ณตํ•œ ํ›„์—๋งŒ ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๊ฐ€ ๊ตฌ์„ฑ๋˜๊ณ  ๋ชจ๋“  ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด Cloud Run์ด ์„œ๋น„์Šค์— ์ƒํƒœ ์ ๊ฒ€ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๊ฐ€ ์ง€์ •๋œ ์‹œ๊ฐ„(failureThreshold * periodSeconds) ๋‚ด์— ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ SIGKILL ์‹ ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด Cloud Run ์ž๋™ ํ™•์žฅ์ด ์ƒˆ ์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

HTTP ์ƒํƒœ ์ ๊ฒ€ ์—”๋“œํฌ์ธํŠธ ๋งŒ๋“ค๊ธฐ

HTTP ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๋ฅผ ์œ„ํ•œ Cloud Run ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ํ”„๋กœ๋ธŒ์— ์‘๋‹ตํ•˜๋„๋ก ์—”๋“œํฌ์ธํŠธ๋ฅผ ์„œ๋น„์Šค ์ฝ”๋“œ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—”๋“œํฌ์ธํŠธ์˜ ์ด๋ฆ„์€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(์˜ˆ: /startup ๋˜๋Š” /ready) ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋กœ๋ธŒ ๊ตฌ์„ฑ์˜ path์— ์ง€์ •ํ•œ ๊ฐ’๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

startupProbe:
    httpGet:
      path: /ready

/health์™€ ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๋ฅผ ์œ„ํ•œ Cloud Run ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋กœ๋ธŒ ๊ตฌ์„ฑ์—์„œ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

livenessProbe:
    httpGet:
      path: /health

HTTP ์ƒํƒœ ์ ๊ฒ€ ์—”๋“œํฌ์ธํŠธ๋Š” ์™ธ๋ถ€์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์™ธ๋ถ€์— ๋…ธ์ถœ๋œ ๋‹ค๋ฅธ HTTP ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ์™€ ๋™์ผํ•œ ์›์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

CPU ํ• ๋‹น

  • ํ”„๋กœ๋ธŒ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํ•ญ์ƒ CPU๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ํ”„๋กœ๋ธŒ์—๋Š” CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์†Œ๋น„ ์š”๊ธˆ์ด ์ฒญ๊ตฌ๋˜์ง€๋งŒ ์š”์ฒญ ๊ธฐ๋ฐ˜ ์š”๊ธˆ์€ ์ฒญ๊ตฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.