Kubernetes์— ๋Œ€ํ•œ YAML์„ ์ง€์›ํ•˜๋Š” Vim

๋ฉ”๋ชจ. ๋ฒˆ์—ญ: ์›๋ณธ ๊ธฐ์‚ฌ๋Š” ์ด์ „์— CoreOS, Heptio ๋“ฑ์˜ ํšŒ์‚ฌ์—์„œ ๊ทผ๋ฌดํ–ˆ์œผ๋ฉฐ Kubernetes alb-ingress-controller์˜ ๊ณต๋™ ์ €์ž์ด๊ธฐ๋„ ํ•œ VMware์˜ ์„ค๊ณ„์ž Josh Rosso๊ฐ€ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €์ž๋Š” ์Šน๋ฆฌํ•˜๋Š” ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์‹œ๋Œ€์—๋„ vim์„ ์„ ํ˜ธํ•˜๋Š” "๊ตฌ์‹" ์šด์˜ ์—”์ง€๋‹ˆ์–ด์—๊ฒŒ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

Kubernetes์— ๋Œ€ํ•œ YAML์„ ์ง€์›ํ•˜๋Š” Vim

vim์—์„œ Kubernetes์šฉ YAML ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์‹œ๋‚˜์š”? ์ด ์‚ฌ์–‘์—์„œ ๋‹ค์Œ ํ•„๋“œ๊ฐ€ ์–ด๋””์— ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„๋‚ด๋ ค๊ณ  ์…€ ์ˆ˜ ์—†์ด ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜์…จ๋‚˜์š”? ์•„๋‹ˆ๋ฉด ์ฐจ์ด์ ์„ ๋น ๋ฅด๊ฒŒ ์ƒ๊ธฐ์‹œ์ผœ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. args ะธ command? ์ข‹์€ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค! Vim์€ ์—ฐ๊ฒฐํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. yaml ์–ธ์–ด ์„œ๋ฒ„์ž๋™ ์™„์„ฑ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ๊ธฐํƒ€ ํŽธ์˜๋ฅผ ์–ป์œผ๋ ค๋ฉด ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ด๋ฅผ ์œ„ํ•ด ์–ธ์–ด ์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

(์›๋ณธ ๊ธฐ์‚ฌ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ ๋น„๋””์˜ค ์žˆ๋‹ˆ?, ์ €์ž๊ฐ€ ์ž๋ฃŒ์˜ ๋‚ด์šฉ์„ ๋งํ•˜๊ณ  ์‹œ์—ฐํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.)

์–ธ์–ด ์„œ๋ฒ„

์–ธ์–ด ์„œ๋ฒ„ (์–ธ์–ด ์„œ๋ฒ„) ํŠน์ˆ˜ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ํŽธ์ง‘์ž ๋ฐ IDE์— ๋Œ€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด ์„œ๋ฒ„ ํ”„๋กœํ† ์ฝœ (LSP). ์ด๋Š” ํ•˜๋‚˜์˜ ๊ตฌํ˜„์œผ๋กœ ์—ฌ๋Ÿฌ ํŽธ์ง‘๊ธฐ/IDE์— ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ํ›Œ๋ฅญํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ๋‚ด๊ฐ€ ์“ด ์•ฝ ๊ณ ํ”Œ - Golang์„ ์œ„ํ•œ ์–ธ์–ด ์„œ๋ฒ„ - ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์ •๋ ฅ. Kubernetes์šฉ YAML์—์„œ ์ž๋™ ์™„์„ฑ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋‹จ๊ณ„๋Š” ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

Kubernetes์— ๋Œ€ํ•œ YAML์„ ์ง€์›ํ•˜๋Š” Vim

vim์ด ์„ค๋ช…๋œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด ์–ธ์–ด ์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์•„๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์–ธ์–ดํด๋ผ์ด์–ธํŠธ-neovim ะธ coc.vim. ๊ธฐ์‚ฌ์—์„œ ๋‚˜๋Š” ๊ณ ๋ คํ•  ๊ฒƒ์ด๋‹ค coc.vim - ํ˜„์žฌ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ํ†ตํ•ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. vim ํ”Œ๋Ÿฌ๊ทธ:

" Use release branch (Recommend)
Plug 'neoclide/coc.nvim', {'branch': 'release'}

" Or build from source code by use yarn: https://yarnpkg.com
Plug 'neoclide/coc.nvim', {'do': 'yarn install --frozen-lockfile'}

์‹œ์ž‘์„ ์œ„ํ•ด coc (๋”ฐ๋ผ์„œ yaml-์–ธ์–ด-์„œ๋ฒ„)์—๋Š” node.js๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

curl -sL install-node.now.sh/lts | bash

์–ธ์ œ coc.vim ๊ตฌ์„ฑ, ์„œ๋ฒ„ ํ™•์žฅ ์„ค์น˜ coc-yaml vim์—์„œ:

:CocInstall coc-yaml

Kubernetes์— ๋Œ€ํ•œ YAML์„ ์ง€์›ํ•˜๋Š” Vim

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ตฌ์„ฑ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. coc-vim, ์ œ์‹œ ์˜ˆ๋กœ์„œ. ํŠนํžˆ, ์กฐํ•ฉ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. +์ŠคํŽ˜์ด์Šค ์ž๋™ ์™„์„ฑ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

yaml-์–ธ์–ด-์„œ๋ฒ„ ๊ฐ์ง€ ์„ค์ •

๊ทธ coc yaml-์–ธ์–ด-์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด YAML ํŒŒ์ผ์„ ํŽธ์ง‘ํ•  ๋•Œ Kubernetes์—์„œ ์Šคํ‚ค๋งˆ๋ฅผ ๋กœ๋“œํ•˜๋„๋ก ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŽธ์ง‘์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. coc-config:

:CocConfig

๊ตฌ์„ฑ์—์„œ ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. kubernetes ๋ชจ๋“  ํŒŒ์ผ์— ๋Œ€ํ•ด yaml. ์ถ”๊ฐ€์ ์œผ๋กœ ์–ธ์–ด ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. golang๋‚ด ์ผ๋ฐ˜์ ์ธ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
  "languageserver": {
      "golang": {
        "command": "gopls",
        "rootPatterns": ["go.mod"],
        "filetypes": ["go"]
      }
  },

  "yaml.schemas": {
      "kubernetes": "/*.yaml"
  }
}

kubernetes โ€” ๋‹ค์Œ์— ์ •์˜๋œ URL์—์„œ Kubernetes ์Šคํ‚ค๋งˆ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ์–ธ์–ด ์„œ๋ฒ„์— ์ง€์‹œํ•˜๋Š” ์˜ˆ์•ฝ๋œ ํ•„๋“œ์ž…๋‹ˆ๋‹ค. ์ด ์ƒ์ˆ˜. yaml.schemas ์ถ”๊ฐ€ ๊ตฌ์„ฑํ‘œ๋ฅผ ์ง€์›ํ•˜๋„๋ก ํ™•์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ด€๋ จ ๋ฌธ์„œ.

์ด์ œ YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๋ฅด๊ธฐ +์ŠคํŽ˜์ด์Šค (๋˜๋Š” vim์— ๊ตฌ์„ฑ๋œ ๋‹ค๋ฅธ ์กฐํ•ฉ)์€ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•„๋“œ์™€ ๋ฌธ์„œ๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Kubernetes์— ๋Œ€ํ•œ YAML์„ ์ง€์›ํ•˜๋Š” Vim
์—ฌ๊ธฐ์„œ ์ผํ•จ +space๋ฅผ ๊ตฌ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๋ฐฑ inoremap <silent><expr> <c-space> coc#refresh(). ์•„์ง ํ•ด๋ณด์ง€ ์•Š์•˜๋‹ค๋ฉด ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”. coc.nvim ์ฝ์–ด๋ณด๊ธฐ ์˜ˆ์‹œ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Kubernetes API ๋ฒ„์ „ ์„ ํƒ

์ด ๊ธ€์„ ์“ฐ๋Š” ์‹œ์ ์—์„œ yaml-์–ธ์–ด-server๋Š” Kubernetes 1.14.0 ์Šคํ‚ค๋งˆ์™€ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๋ฅผ ๋™์ ์œผ๋กœ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ•ด ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น GitHub ๋ฌธ์ œ. ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ์–ธ์–ด ์„œ๋ฒ„๋Š” TypeScript๋กœ ์ž‘์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜๋™์œผ๋กœ ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ ค๋ฉด ํŒŒ์ผ์„ ์ฐพ์œผ์‹ญ์‹œ์˜ค. server.ts.

์ปดํ“จํ„ฐ์—์„œ ์ด๋ฅผ ๊ฐ์ง€ํ•˜๋ ค๋ฉด vim์œผ๋กœ YAML ํŒŒ์ผ์„ ์—ด๊ณ  ๋‹ค์Œ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฐพ์œผ์„ธ์š”. yaml-language-server.

ps aux | grep -i yaml-language-server

joshrosso         2380  45.9  0.2  5586084  69324   ??  S     9:32PM   0:00.43 /usr/local/Cellar/node/13.5.0/bin/node /Users/joshrosso/.config/coc/extensions/node_modules/coc-yaml/node_modules/yaml-language-server/out/server/src/server.js --node-ipc --node-ipc --clientProcessId=2379
joshrosso         2382   0.0  0.0  4399352    788 s001  S+    9:32PM   0:00.00 grep -i yaml-language-server

์šฐ๋ฆฌ์—๊ฒŒ ๊ด€๋ จ๋œ ํ”„๋กœ์„ธ์Šค๋Š” ํ”„๋กœ์„ธ์Šค 2380์ž…๋‹ˆ๋‹ค. vim์ด YAML ํŒŒ์ผ์„ ํŽธ์ง‘ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค.

๋ณด์‹œ๋‹ค์‹œํ”ผ ํŒŒ์ผ์€ ๋‹ค์Œ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค. /Users/joshrosso/.config/coc/extensions/node_modules/coc-yaml/node_modules/yaml-language-server/out/server/src/server.js. ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ํŽธ์ง‘ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. KUBERNETES_SCHEMA_URL, ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฒ„์ „ 1.17.0์˜ ๊ฒฝ์šฐ:

// old 1.14.0 schema
//exports.KUBERNETES_SCHEMA_URL = "https://raw.githubusercontent.com/garethr/kubernetes-json-schema/master/v1.14.0-standalone-strict/all.json";
// new 1.17.0 schema in instrumenta repo
exports.KUBERNETES_SCHEMA_URL = "https://raw.githubusercontent.com/instrumenta/kubernetes-json-schema/master/v1.17.0-standalone-strict/all.json";

์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „์— ๋”ฐ๋ผ coc-yaml ์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜์˜ ์œ„์น˜๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ €์žฅ์†Œ๋ฅผ ๋‹ค์Œ์—์„œ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. garethr ์— instrumenta. ๊ทธ๊ฒƒ์€ ๋ณด์ธ๋‹ค garethr ๊ฑฐ๊ธฐ์—์„œ ์ง€์› ํšŒ๋กœ๋กœ ์ „ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด [์ด์ „ ๋ฒ„์ „์˜ Kubernetes]์—๋Š” ์—†์—ˆ๋˜ ํ•„๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด K8s 1.14์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์—๋Š” ์‹œ์ž‘ํ”„๋กœ๋ธŒ:

Kubernetes์— ๋Œ€ํ•œ YAML์„ ์ง€์›ํ•˜๋Š” Vim

๊ฐœ์š”

์ด๋ฒˆ ๊ธฐํšŒ๊ฐ€ ๋‚˜๋งŒํผ ๋‹น์‹ ์„ ๊ธฐ์˜๊ฒŒ ํ•ด์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ–‰๋ณตํ•œ YAMLing! ๊ธฐ์‚ฌ์— ์–ธ๊ธ‰๋œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋ฒˆ์—ญ๊ฐ€์˜ ์ถ”์‹ 

๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๊ธฐ์—์žˆ๋‹ค. ๋น„์ฟ ๋ฒ , vim-kubernetes ะธ vimkubectl.

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

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