Helm์˜ ๋น„๋ฐ€ ์ž๋™ ์ƒ์„ฑ

Helm์˜ ๋น„๋ฐ€ ์ž๋™ ์ƒ์„ฑ

ํŒ€ Mail.ru์˜ Kubernetes aaS ์งง์€ ๋ฉ”๋ชจ๋ฅผ ๋ฒˆ์—ญํ–ˆ์Šต๋‹ˆ๋‹ค ์—…๋ฐ์ดํŠธ ์‹œ Helm ๋น„๋ฐ€์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์„ธ์š”. ๋‹ค์Œ์€ SaaS ์†”๋ฃจ์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ํšŒ์‚ฌ์ธ Intoware์˜ ๊ธฐ์ˆ  ์ด์‚ฌ์ธ ๊ธฐ์‚ฌ ์ž‘์„ฑ์ž์˜ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฉ‹์ง€๋‹ค. ์ฒ˜์Œ์—๋Š” ๋ฐ˜์ปจํ…Œ์ด๋„ˆ(์ธ์ •ํ•˜๊ธฐ๊ฐ€ ๋ถ€๋„๋Ÿฝ์ง€๋งŒ)์˜€์ง€๋งŒ ์ด์ œ๋Š” ์ด ๊ธฐ์ˆ ์˜ ์‚ฌ์šฉ์„ ์ „์ ์œผ๋กœ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ์ฝ๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด Docker์˜ ๋ฐ”๋‹ค๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ณ  Kubernetes์˜ ์ด์ ์„ ๊นจ๋‹ซ๊ณ  Helm์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ถ์„ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“œ์…จ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ๊ฒƒ๋“ค์€ ๋ถ„๋ช…ํžˆ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธํ•  ๋•Œ ๋น„๋ฐ€์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

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

๋น„๋ฐ€ ๋งŒ๋“ค๊ธฐ

์ผ๋ฐ˜์ ์œผ๋กœ Helm์—์„œ ๋น„๋ฐ€์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ’ ํŒŒ์ผ์— ๋น„๋ฐ€์„ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค.
  • ๋ฐฐํฌ ์ค‘์— ์žฌ์ •์˜ํ•˜์„ธ์š”.
  • ๋ฐฐํฌ/ํฌ๋“œ ๋‚ด๋ถ€์—์„œ ์ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ... ์ด์ต!

์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ .Values.MyApiKeySecret | quote }}

value.yml์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ Kubernetes ๋น„๋ฐ€

ํ•˜์ง€๋งŒ ๊ฐ’ ํŒŒ์ผ์— ๋น„๋ฐ€์„ ์ง€์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐฐํฌ์— ์„ค์น˜ ์ค‘์— ์ƒ์„ฑ๋˜์–ด์•ผ ํ•˜๋Š” ๊ณต์œ  ํ‚ค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์–‘ํ•œ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ›„ํฌ

ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ค์น˜ ํ”„๋กœ์„ธ์Šค ์ค‘ ํŠน์ • ์œ„์น˜์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์„ค์น˜ ํ›„์— ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์„ฑ ์ž‘์—…์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ •๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜ ์ค‘์— ์ƒ์„ฑ๋œ ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์‚ฌ์ „ ์„ค์น˜ ํ›„ํฌ๊ฐ€ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ์‹œ ๋น„๋ฐ€์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. Hooks๋Š” ๋ชจ๋“  ์—…๋ฐ์ดํŠธ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋น„๋ฐ€๊ธ€์„ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ ์•„์ง ์ฒซ ๋ฒˆ์งธ ์„ค์น˜๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด ์ฝ๊ธฐ๋ฅผ ์ค‘๋‹จํ•˜์„ธ์š”. ์‚ฌ์ „ ์„ค์น˜ ํ›„ํฌ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋น„๋ฐ€์ด ์—…๋ฐ์ดํŠธ์˜ ์ผ๋ถ€์ธ ๊ฒฝ์šฐ(์„ค์น˜ ๋‹น์‹œ์—๋Š” ์—†์—ˆ๋˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ผ ์ˆ˜๋„ ์žˆ์Œ) ํ•œ ๋ฒˆ๋งŒ ์ž‘๋™ํ•˜๋Š” ์‚ฌ์ „ ์„ค์น˜ ํ›„ํฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์œ ๊ฐ์Šค๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ

Helm ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ์— ๋‹ค์–‘ํ•œ ์Šคํฌ๋ฆฝํŒ… ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Generate a new UUID and quote it

์ด ์˜ˆ์—์„œ๋Š” apiKey ๋น„๋ฐ€ ๊ฐ’์ด ์„ค์น˜ ์ค‘์— ์ƒ์„ฑ๋œ ์ƒˆ UUID๊ฐ€ ๋จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Helm์—๋Š” ๋†€๋ผ์šด GO ํ…œํ”Œ๋ฆฟ ๊ธฐ๋Šฅ๊ณผ Sprig์˜ ๊ธฐ๋Šฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐฐํฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋งค์šฐ ๊ด‘๋ฒ”์œ„ํ•œ ๊ธฐ๋Šฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐํšŒ ๊ธฐ๋Šฅ

ํ—ฌ๋ฆ„ 3.1์— ์ถ”๊ฐ€๋จ ์กฐํšŒ ๊ธฐ๋Šฅ, ๊ธฐ์กด ๋ฐฐํฌ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž์›์˜ ์กด์žฌ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • ๋‚˜์ค‘์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ๋ฆฌ์†Œ์Šค์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์ผํšŒ์„ฑ ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

# 1. ะ—ะฐะฟั€ะพัะธั‚ัŒ ััƒั‰ะตัั‚ะฒะพะฒะฐะฝะธะต ัะตะบั€ะตั‚ะฐ ะธ ะฒะตั€ะฝัƒั‚ัŒ ะฒ ะฟะตั€ะตะผะตะฝะฝะพะน $secret
{{- $secret := (lookup "v1" "Secret" .Release.Namespace "some-awesome-secret" -}}
apiVersion: v1
kind: Secret
metadata:
  name: some-awesome-secret
type: Opaque

# 2. ะ•ัะปะธ ัะตะบั€ะตั‚ ััƒั‰ะตัั‚ะฒัƒะตั‚, ะฒะทัั‚ัŒ ะตะณะพ ะทะฝะฐั‡ะตะฝะธะต ะบะฐะบ apiKey (ัะตะบั€ะตั‚ ะธัะฟะพะปัŒะทัƒะตั‚ ะบะพะดะธั€ะพะฒะฐะฝะธะต Base64, ั‚ะฐะบ ั‡ั‚ะพ ะธัะฟะพะปัŒะทัƒะนั‚ะต ะบะปัŽั‡ "data")
{{ if $secret -}}
data:
  apiKey: {{ $secret.data.apiKey }}

# 3. ะ•ัะปะธ ัะตะบั€ะตั‚ ะฝะต ััƒั‰ะตัั‚ะฒัƒะตั‚ โ€” ัะพะทะดะฐั‚ัŒ ะตะณะพ (ะฒ ัั‚ะพั‚ ั€ะฐะท ะธัะฟะพะปัŒะทัƒะนั‚ะต "stringData", ั‚ะฐะบ ะบะฐะบ ะฑัƒะดะตั‚ ะพะฑั‹ั‡ะฝะพะต ะทะฝะฐั‡ะตะฝะธะต)!
{{ else -}}
stringData:
  apiKey: {{ uuidv4 | quote }}
{{ end }}

์ƒˆ ์—…๋ฐ์ดํŠธ๊ฐ€ ์„œ๋ฒ„์— ์ ์šฉ๋  ๋•Œ๋งˆ๋‹ค Helm์€ ์ƒˆ ๋น„๋ฐ€ ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜(์•„์ง ๋น„๋ฐ€์ด ์—†๋Š” ๊ฒฝ์šฐ) ๊ธฐ์กด ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค!

์ฃผ์ œ์— ๋Œ€ํ•ด ๋” ์ฝ์„ ๋‚ด์šฉ:

  1. Kubernetes์˜ ์„ธ ๊ฐ€์ง€ ์ˆ˜์ค€์˜ ์ž๋™ ํ™•์žฅ ๋ฐ ์ด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•.
  2. ๊ตฌํ˜„์„ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์„ ๊ฐ–์ถ˜ ๋ถˆ๋ฒ• ๋ณต์ œ ์ •์‹ ์˜ Kubernetes.
  3. Telegram์˜ Kubernetes ์ฃผ๋ณ€ ์ฑ„๋„.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€