Shinyproxy: [๊ธฐ๋Šฅ ์š”์ฒญ] Kubernetes์˜ Pod์— ์ฃผ์„ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

์— ๋งŒ๋“  2019๋…„ 05์›” 22์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: openanalytics/shinyproxy

์–˜๋“ค ์•„,

Kubernetes์—์„œ Shinyproxy๊ฐ€ ์‹คํ–‰ํ•œ ํฌ๋“œ์— ์ฃผ์„ ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด AWS IAM ์—ญํ• ์„ ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐํ•˜๊ณ  ๋น›๋‚˜๋Š” ์•ฑ์—์„œ AWS ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ํ›Œ๋ฅญํ•œ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ฑด๋ฐฐ,

์—๋ฉœ๋ฆฌ์—

enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

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

(๋ฐฐํฌ์˜ spec ์„น์…˜์—์„œ):

- name: shiny-role-spammer
  image: zlabjp/kubernetes-resource
  command:
  - "/bin/bash"
  - "-c"
  - |
    while [ 1 ]; do
      # Add annotation for kube2iam
      kubectl -n external annotate pods --all iam.amazonaws.com/role="arn:aws:iam::123456654321:role/shiny-external";
      # Add tolerations
      kubectl -n external get pods -o jsonpath='{.items[*].metadata.name}' | grep sp- | \
        xargs kubectl -n external patch -p \
        '{"spec":{"tolerations":[{"key":"purpose", "operator": "Equal", "value": "external", "effect": "NoSchedule"}]}}' \
        pod
      sleep 2;
    done

๋ชจ๋“  5 ๋Œ“๊ธ€

๋‚˜๋Š” ๋˜ํ•œ ๋˜‘๊ฐ™์€ ์ด์œ ๋กœ ๋ฐ˜์ง์ด ํ”„๋ก์‹œ์— ์˜ํ•ด ์‹œ์ž‘๋œ ํฌ๋“œ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ Java ๊ธฐ์ˆ ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์—ฌ์ „ํžˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ์€ ์ •๋ง ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

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

(๋ฐฐํฌ์˜ spec ์„น์…˜์—์„œ):

- name: shiny-role-spammer
  image: zlabjp/kubernetes-resource
  command:
  - "/bin/bash"
  - "-c"
  - |
    while [ 1 ]; do
      # Add annotation for kube2iam
      kubectl -n external annotate pods --all iam.amazonaws.com/role="arn:aws:iam::123456654321:role/shiny-external";
      # Add tolerations
      kubectl -n external get pods -o jsonpath='{.items[*].metadata.name}' | grep sp- | \
        xargs kubectl -n external patch -p \
        '{"spec":{"tolerations":[{"key":"purpose", "operator": "Equal", "value": "external", "effect": "NoSchedule"}]}}' \
        pod
      sleep 2;
    done

์ข‹์€ ์ƒ๊ฐ! ์™„๋ฒฝํ•œ!

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„

ํ™๋ณดํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
ContainerProxy์—์„œ ๋ชจ๋“  Kubernetes ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ContainerProxy ์•ฑ์— Kubernetes ํŠน์ • ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ kubernetes-pod-patches ๋ผ๊ณ  ํ•˜๋ฉฐ ContainerProxy์—์„œ ์ƒ์„ฑ๋˜๊ธฐ ์ „์— ํฌ๋“œ ์‚ฌ์–‘์„ ํŒจ์น˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ์—ฌ๊ธฐ ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์•ฝ๊ฐ„ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•ด์•ผ ํ•จ).
์ด๊ฒƒ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ธ์ œ๋“ ์ง€ ๋ฌธ์ œ๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค.
๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ShinyProxy 2.4.0 ์—๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@LEDfan ๋•๋ถ„์— ์ด ์†”๋ฃจ์…˜์€ ์ •๋ง ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฐ”๋กœ ํ™•์ธํ•˜์„ธ์š”!

๋ช‡ ๋ฒˆ์˜ ์‹œํ–‰์ฐฉ์˜ค ๋์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ IAM ์—ญํ•  ์ฃผ์„์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  - id: 01_hello
    displayName: Hello Application
    description: Application which demonstrates the basics of a Shiny app
    containerCmd: ["R", "-e", "shinyproxy::run_01_hello()"]
    containerImage: openanalytics/shinyproxy-demo
    kubernetes-pod-patches: |
     - op: add
       path: /metadata/annotations
       value: { "iam.amazonaws.com/role": "<YOUR-IAM-ROLE>" }
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰