- 《架构师》2019年3月
- InfoQ中文站
- 2008字
- 2020-06-26 06:07:51
一套适用于MacOS的Kubernetes开发工作流
Kubernetes开发没有一刀切的解决方案。你可能在本地机器上通过Minikube学习Kubernetes,你也可能是一个拥有众多集群的大型组织的一员;你的集群可能就部署在本地实验室中,也可能部署在云端。
无论你是需要管理策略的集群管理员,还是需要开发新服务的应用程序开发人员,或者是运行Kubeflow的数据科学家,你可能正在做这些(或全部)事情:连接集群、检查集群状态、创建资源以及调试这些资源。
作为Kubernetes开发者关系工程师,我经常与演示代码、示例和沙箱集群打交道。在这篇文章中,我将展示一些工具,这些工具可以帮助我更好地管理Kubernetes。
无论你正在运行什么样的Kubernetes,都可以使用这个环境,而且这些工具都可以从开源社区获得。
终端
我使用了带有palenight配色主题的iterm2,还使用默认的robby-russell主题运行zsh和oh_my_zsh。
这个主题有基本的Git支持,如果你希望在shell提示符中显示当前的Kubernetes上下文,可以看看kube-ps1或spaceship提示符。
其次,我的~/.zshrc文件有一行:
source <(kubectl completion zsh)
这样可以为kubectl命令启用tab键自动完成功能,所以不需要再复制粘贴pod名字了!
切换集群
我每天几乎都会在三个集群之间来回切换。你可能也会这样!每次都要打开kubeconfig文件,你会觉得烦吗?我想肯定会的!所幸的是,kubectx可以解决这个问题:kubectx可让你轻松地在集群上下文之间切换。我最喜欢的是运行kubectx -,它将连接到上一次使用的集群。
增强的kubectl
现在我们已经有一个集群可以使用了,让我们开始做点什么吧。
也许你觉得kubectl命令会变得很长,有太多的命令行标志。我发现kubectl的tab键自动完成功能和一组别名(命令快捷方式)非常有用。
这里有一组很棒的kubectl别名,你可以像下面这样运行命令:
获得pod
描述pod
最后,我使用了一些kubectl插件。但手动设置这些可能会很烦人,所以我使用了krew,一个开源的kubectl插件管理器。
你可以用krew来浏览、安装和使用kubectl插件,这样你就可以运行自定义命令。
编辑YAML
现在我们已经准备好了一个集群,接下来让我们来部署一些东西。
Kubernetes开发涉及编写、管理、更新和部署大量的YAML文件。我把所有的YAML文件都提交到Git上。尽早使用GitOps(而不是在本地保存文件)可以让我看到修订历史记录,当我开始为正在开发的应用程序正式化管道时,这些可以帮我获得成功。
我将VSCode作为文本编辑器,并使用了Moonlight主题。尽管VSCode已经提供了很多很棒的功能,Red Hat的YAML插件为验证、自动完成和格式化提供了很多便利。
目前,我编写Kubernetes YAML的过程仍然是手动的。通常,对于每个新项目,我都需要编写相同的Kubernetes规范文件:ConfigMap、Secret、Volume、Deployment、Service。
我正在努力寻找简化这个过程的方法,不管是通过使用文本编辑器插件、模板还是其他工具。如果你使用了有助于编写和管理YAML的工具,请让我知道!
部署
有了YAML文件之后就可以开始部署资源了!因为我的kubectl环境已经得到了增强,我迫不及待地想要开始手动部署资源。
但这可能是一条艰难的道路,你将会陷入到docker build、docker push、kubectl apply和kubectl delete pod命令的沼泽中。这一点都不好玩。
不过,有一个叫作skaffold的工具可以自动消除这种痛苦。skaffold非常神奇:它会监听代码库发生的变更。当你在本地保存变更时,skaffold将自动进行docker build,推送新的镜像,并重新部署到集群中。
skaffold会自动生成镜像标签,这点非常酷。因此,在你的YAML文件中,你只需要列出镜像仓库,而不是标签,skaffold将在部署时填充新标签。
spec: containers: - name: helloworld image: gcr.io/megangcp/helloworld imagePullPolicy: Always ports: - containerPort: 8080
skaffold需要的只是一个YAML配置文件:
apiVersion: skaffold/v1beta3 kind: Config build: artifacts: - image: gcr.io/megangcp/helloworld deploy: kubectl: manifests: - kubernetes/*
这是一个最小化的配置,我指定了镜像仓库(在这里是谷歌容器注册表,但其他镜像注册表也可以,如DockerHub)。我还指定了清单文件所在的目录。
skaffold是高度可定制的,除了kubectl之外,还可以与Helm等部署工具一起使用。
检查docker镜像
skaffold抽象了docker的构建过程,但有时候我想查看新构建镜像的这些内容:与以前的版本相比,镜像大小有怎样的变化?每个镜像层的内容是什么?
dive是一个用于检查Docker镜像的神奇工具。
我们可以使用dive来检查不同镜像层之间文件系统的变更。如果在Docker构建过程中某些内容出现了问题,这个工具会非常有用。
调试
现在我们已经有了运行Kubernetes的pod。接下来该做些什么?
每隔一段时间,我的规范文件或应用程序代码就会出问题。
我的kubernetes调试工作流程通常是这样的:
• 描述pod(使用kdpo别名)。是我的规范文件出错了吗?(例如:Deployment是否试图挂载一个我不小心放入另一个命名空间的Secret?)如果不是……
• 获取pod日志。skaffold dev命令将每个部署的容器的所有日志组合起来,将它们流式传输到stdout。但是我发现,当我有两个或多个pod在运行时,格式会变得很乱。同时,通常的kubectl logs命令可能导致无限复制粘贴新pod的名称。
stern是一种非常棒的替代方案,以更定制化的方式查看日志尾部。stern使用正则表达式在pod上选择日志——并且假设所有pod都以部署名称作为开头,你可以跟踪所有部署中的pod日志,而无需知道确切的pod名称。超级有用:
如果日志没有给我提供有用的线索,通常我会…
进入pod(带有tab键自动完成功能的kex别名):
总结
Kubernetes是一款庞大而复杂的软件,拥有大型的配置模型。我希望通过分享这些工具给你带来一些帮助,无论你处在k8s旅程中的哪个位置。
以下是本文中提到的工具和插件的完整清单:
• iterm2 • palenight • oh-my-zsh • kubectl tab自动完成 • kubectx • kubectl aliases • krew • VSCode • GitLens • skaffold • dive • stern