Vim 为 Kubernetes 提供 YAML 支持

笔记。 翻译。:原文由 Josh Rosso 撰写,他是 VMware 的架构师,曾在 CoreOS 和 Heptio 等公司工作,也是 Kubernetes alb-ingress-controller 的合著者。 作者分享了一个小窍门,对于即使在云原生时代也更喜欢 vim 的“老派”运维工程师来说非常有用。

Vim 为 Kubernetes 提供 YAML 支持

在 vim 中为 Kubernetes 编写 YAML 清单? 花了无数时间试图弄清楚本规范中的下一个字段应该在哪里? 或者也许您会喜欢快速提醒差异 args и command? 有好消息! Vim 很容易链接到 yaml 语言服务器以获得自动完成、验证和其他便利。 在本文中,我们将讨论如何为此设置语言服务器客户端。

(原文还 有一个视频,作者在其中讲述并演示了材料的内容。)

语言服务器

语言服务器 (语言服务器) 向编辑器和 IDE 谈论编程语言的功能,它们使用特殊的协议相互交互 - 语言服务器协议 (LSP)。 这是一种很好的方法,因为它允许一个实现同时向多个编辑器/IDE 提供数据。 我已经 关于 戈普斯 - Golang 语言服务器 - 以及如何使用它 VIM。 在 Kubernetes 的 YAML 中获取自动完成功能的步骤类似。

Vim 为 Kubernetes 提供 YAML 支持

为了让 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-language-server)将需要安装 node.js:

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

何时 coc.vim 配置完毕,安装服务器扩展 coc-yaml 来自维姆:

:CocInstall coc-yaml

Vim 为 Kubernetes 提供 YAML 支持

最后,您很可能想从配置开始 coc-vim, 呈现 举个例子。 特别是,它激活了组合 +空格 调用自动完成功能。

设置 yaml 语言服务器检测

coc 可以使用 yaml-language-server,但在编辑 YAML 文件时需要要求从 Kubernetes 加载 schema。 这是通过编辑完成的 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 中配置的其他组合)应根据当前上下文显示可用字段和文档:

Vim 为 Kubernetes 提供 YAML 支持
在这里工作+空格因为我配置了 inoremap <silent><expr> <c-space> coc#refresh()。 如果您还没有这样做,请参阅 coc.nvim 自述文件 获取示例配置。

选择 Kubernetes API 版本

截至撰写本文时,yaml-language-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 代码中变量的位置可能会有所不同。 另请注意,我将存储库从 garethrinstrumenta. 看起来 garethr 切换到那里的支持电路。

要检查更改是否已生效,请查看是否出现以前 [在 Kubernetes 的早期版本中] 不存在的字段。 例如,在 K8s 1.14 的图中没有 启动探针:

Vim 为 Kubernetes 提供 YAML 支持

总结

我希望这个机会让您和我一样高兴。 YAML 快乐! 请务必检查这些存储库,以更好地了解本文中提到的实用程序:

译者PS

然后有 维库贝, vim-kubernetes и vimkubectl.

另请阅读我们的博客:

来源: habr.com

添加评论