一套适用于MacOS的Kubernetes开发工作流

作者 Megan O'Keefe 译者 无明

Kubernetes开发没有一刀切的解决方案。你可能在本地机器上通过Minikube学习Kubernetes,你也可能是一个拥有众多集群的大型组织的一员;你的集群可能就部署在本地实验室中,也可能部署在云端。

无论你是需要管理策略的集群管理员,还是需要开发新服务的应用程序开发人员,或者是运行Kubeflow的数据科学家,你可能正在做这些(或全部)事情:连接集群、检查集群状态、创建资源以及调试这些资源。

作为Kubernetes开发者关系工程师,我经常与演示代码、示例和沙箱集群打交道。在这篇文章中,我将展示一些工具,这些工具可以帮助我更好地管理Kubernetes。

无论你正在运行什么样的Kubernetes,都可以使用这个环境,而且这些工具都可以从开源社区获得。

终端

我使用了带有palenight配色主题的iterm2,还使用默认的robby-russell主题运行zsh和oh_my_zsh。

这个主题有基本的Git支持,如果你希望在shell提示符中显示当前的Kubernetes上下文,可以看看kube-ps1spaceship提示符

其次,我的~/.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旅程中的哪个位置。

以下是本文中提到的工具和插件的完整清单:

iterm2palenightoh-my-zshkubectl tab自动完成kubectxkubectl aliaseskrewVSCodeGitLensskaffolddivestern