具有针对Kubernetes的YAML支持的Vim

注意 佩雷夫。:原始文章由VMware的架构师Josh Rosso撰写,他曾在CoreOS和Heptio等公司工作,并且是Kubernetes alb-ingress-controller的合著者。作者分享了一个小秘诀,即使在胜利的云原生时代,对于喜欢vim的“老派”运营工程师来说,这也可能非常有用。



在vim中为Kubernetes编写YAML清单?已经花费了无数小时试图弄清楚下一个字段在此规范中应该在哪里?或者,也许你会发现差异的快速提醒argscommand有个好消息!Vim易于绑定到 yaml-language-server获得自动完成,验证和其他便利。在本文中,我们将讨论如何为此配置语言服务器客户端。

(原始文章还有一个录像带,作者在其中进行了交谈并演示了材料的内容。)

语言服务器


语言服务器(语言服务器)讨论了用于编辑器和IDE的编程语言的可能性,它们使用特殊协议- 语言服务器协议(LSP)进行交互。这是一个很好的方法:它允许单个实现一次向多个编辑器/ IDE提供数据。我已经写过关于gopls(Golang的语言服务器)的信息,以及如何在vim中使用它。在Kubernetes的YAML中获得自动完成的步骤是相似的。



为了使vim以上述方式工作,您需要安装语言服务器客户端。我知道两种方法是LanguageClient-neovimcoc.vim在本文中,我将考虑coc.vim-这是当前最受欢迎的插件。您可以通过vim-plug安装它

" 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



最后,您很可能希望从作为示例coc-vim介绍的配置开始特别是,它激活组合键<Ctrl> +空格以调用自动完成功能。

配置yaml语言服务器发现


coc使用yaml-language-server,您需要在编辑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文件并开始使用自动完成功能。<Ctrl> +空格(或在vim中配置的另一个组合)应根据当前上下文显示可用的字段和文档:


<Ctrl> +空格在这里有效,因为我已对其进行了配置inoremap <silent><expr> <c-space> coc#refresh()如果尚未这样做,请参阅coc.nvim自述文件以获取示例配置。

Kubernetes API版本选择


在撰写本文时,yaml-language-server附带了Kubernetes 1.14.0模式。我没有找到一种动态选择方案的方法,因此我打开了相应的GitHub问题幸运的是,由于语言服务器是用打字稿编写的,因此手动更改版本非常容易。为此,只需找到文件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与我们有关:在编辑YAML文件时使用vim是它。

如您所见,该文件位于中/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,电路中没有startupProbe



摘要


希望这个机会让您满意,至少让我满意。快乐的YAML'ing!请务必检查这些存储库以更好地了解本文中提到的实用程序:


译者的PS


还有vikubevim-kubernetesvimkubectl

另请参阅我们的博客:


All Articles