Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์— ๋ฐ์ดํ„ฐ ์ €์žฅ

์ด ์ฃผ์ œ์—์„œ๋Š” Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  API ํ”„๋ก์‹œ ํ๋ฆ„์— ์žˆ๋Š” ํ๋ฆ„ ๋ณ€์ˆ˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์†Œ๊ฐœ

๋Ÿฐํƒ€์ž„ ์‹œ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋Š” API ํ”„๋ก์‹œ ๋กœ์ง์—์„œ ํ•˜๋“œ ์ฝ”๋”ฉํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๋งŒ๋ฃŒ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์˜ต์…˜์€ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ‚ค-๊ฐ’ ๋งต(KVM) ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ฏผ๊ฐํ•œ ์ •๋ณด์˜ ์ปค์Šคํ…€ Vault์— ์žˆ๋Š” ๋ณด์•ˆ ๋น„๋ฐ€ ๊ด€๋ฆฌ์— Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ์ฃผ์ œ์—์„œ ์„ค๋ช…ํ•˜๋Š” Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. KVM ๋ฐ์ดํ„ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ API ํ”„๋ก์‹œ ํ๋ฆ„ ๋ณ€์ˆ˜์— ์žˆ๋Š” Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜

Apigee Hybrid๋Š” Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋„๋ก ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ํ˜•์‹ ์ง€์›๋˜๋Š” ํŒŒ์ผ ํ™•์žฅ์ž
TLS ์ธ์ฆ์„œ ๋ฐ ํ‚ค ํŒŒ์ผ *.crt, *.key, *.pem
์†์„ฑ ํŒŒ์ผ *.properties

์†์„ฑ ํŒŒ์ผ์€ ํ‚ค-๊ฐ’ ์Œ์„ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

username=admin
password=1f2d1e2e7df

Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€ ๋งŒ๋“ค๊ธฐ

์ด ์„น์…˜์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  1. Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์— ์ €์žฅํ•˜๋ ค๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํŒŒ์ผ์€ Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ข…๋ฅ˜์— ๋‚˜์—ด๋œ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ์ง€์›๋˜๋Š” ํ˜•์‹ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. kubectl create secret generic ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    kubectl -n namespace create secret generic org-env-policy-secret \
      --from-file=filepath/prop-file.properties \
      --from-file=filepath/key-file.key \
      --from-file="filepath/cert-file.pem
    

    ๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • namespace: ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋ฐฐํฌ๋˜๋Š” Kubernetes ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
    • org: Apigee ์กฐ์ง ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • env: ์กฐ์ง์˜ ํ™˜๊ฒฝ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • filepath: ๋ณด์•ˆ ๋น„๋ฐ€์— ํฌํ•จํ•  ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋น„๋ฐ€์— ํฌํ•จํ•  ํŒŒ์ผ์„ ํ•˜๋‚˜ ์ด์ƒ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • prop-file: ๋ณด์•ˆ ๋น„๋ฐ€์— ํฌํ•จํ•  ์†์„ฑ ํŒŒ์ผ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • key-file: ๋ณด์•ˆ ๋น„๋ฐ€์— ํฌํ•จํ•  TLS ํ‚ค ํŒŒ์ผ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • cert-file: ๋ณด์•ˆ ๋น„๋ฐ€์— ํฌํ•จํ•  TLS ์ธ์ฆ์„œ ํŒŒ์ผ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

    ๋ณด์•ˆ ๋น„๋ฐ€์— ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ์ผ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    kubectl -n apigee create secret generic myorg-test-policy-secret \
      --from-file="$policy_secrets_path"/credential.properties \
      --from-file="$policy_secrets_path"/secrets.properties \
      --from-file="$policy_secrets_path"/public.key \
      --from-file="$policy_secrets_path"/fullchain.pem
  3. ์ƒ์„ฑ ํ›„ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐ˜์˜๋˜๋Š” ๋ฐ ์ตœ๋Œ€ 90์ดˆ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€ ํ”„๋กœ์„ธ์„œ๋Š” 30์ดˆ๋งˆ๋‹ค ๋ณด์•ˆ ๋น„๋ฐ€ ๋ณ€๊ฒฝ์„ ํด๋งํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๊ฐ์ง€๋˜๋ฉด ์บ์‹œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ๋น„๋ฐ€์—์„œ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰

๋ณด์•ˆ ๋น„๋ฐ€์„ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด(์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์„ฑ ํ›„ ์•ฝ 90์ดˆ) ๋ณด์•ˆ ๋น„๋ฐ€์ด ์ €์žฅ๋œ ์กฐ์ง/ํ™˜๊ฒฝ ๋‚ด API ํ”„๋ก์‹œ์˜ ํ๋ฆ„ ๋ณ€์ˆ˜์— ์žˆ๋Š” ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด์•ˆ ๋น„๋ฐ€์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด API ํ‚ค๊ฐ€ ํฌํ•จ๋œ credentials.properties๋ผ๋Š” *.properties ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

apikey=OrxYQptBMlY1TqmiGLTtyFiaLzzrD25Z

๊ทธ๋Ÿฌ๋ฉด ๋ฉ”์‹œ์ง€ ํ• ๋‹น๊ณผ ๊ฐ™์€ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜์—ฌ ํ๋ฆ„ ๋ณ€์ˆ˜์—์„œ API ํ‚ค๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>my-apikey</Name>
    <Ref>private.secret.credential.properties.apikey</Ref>
  </AssignVariable>
</AssignMessage>

Ref ์š”์†Œ private.secret.credential.properties.apikey์—์„œ ์ฐธ์กฐ๋˜๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ถ€๋ถ„ ์„ค๋ช…
private.secret ๋ณ€์ˆ˜์˜ ๊ณ ์ •๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํด๋Ÿฌ์Šคํ„ฐ์— ์ €์žฅ๋œ ๋ชจ๋“  Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์€ ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
credential.properties

Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์— ์ €์žฅ๋œ ํŒŒ์ผ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

apikey ์†์„ฑ ํŒŒ์ผ์— ์ €์žฅ๋œ ํ‚ค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์ด ์˜ˆ์‹œ์—์„œ ๋ฉ”์‹œ์ง€ ํ• ๋‹น ์ •์ฑ…์€ apikey ๊ฐ’ OrxYQptBMlY1TqmiGLTtyFiaLzzrD25Z๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ํ๋ฆ„ ๋ณ€์ˆ˜ my-apikey์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ๋น„๋ฐ€ ์—…๋ฐ์ดํŠธ

kubectl์€ Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋จผ์ € ๊ธฐ์กด ๋ณด์•ˆ ๋น„๋ฐ€์„ ์‚ญ์ œํ•˜๊ณ  Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€ ๋งŒ๋“ค๊ธฐ์˜ ๋‹จ๊ณ„์— ๋”ฐ๋ผ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.