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

阅读数:10927 2019 年 2 月 10 日 08:00

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

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

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

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

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

终端

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

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

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

其次,我的~/.zshrc 文件有一行:

复制代码
source <(kubectl completion zsh)

这样可以为 kubectl 命令启用 tab 键自动完成功能,所以不需要再复制粘贴 pod 名字了!

切换集群

我每天几乎都会在三个集群之间来回切换。你可能也会这样!每次都要打开 kubeconfig 文件,你会觉得烦吗?我想肯定会的!所幸的是,kubectx 可以解决这个问题:

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

kubectx 可让你轻松地在集群上下文之间切换。我最喜欢的是运行 kubectx -,它将连接到上一次使用的集群。

增强的 kubectl

现在我们已经有一个集群可以使用了,让我们开始做点什么吧。

也许你觉得 kubectl 命令会变得很长,有太多的命令行标志。我发现 kubectl 的 tab 键自动完成功能和一组别名(命令快捷方式)非常有用。

这里有一组很棒的 kubectl 别名,你可以像下面这样运行命令:

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

获得 pod

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

描述 pod

最后,我使用了一些 kubectl 插件。但手动设置这些可能会很烦人,所以我使用了 krew,一个开源的 kubectl 插件管理器:

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

你可以用 krew 来浏览、安装和使用 kubectl 插件,这样你就可以运行自定义命令。

编辑 YAML

现在我们已经准备好了一个集群,接下来让我们来部署一些东西。

Kubernetes 开发涉及编写、管理、更新和部署大量的 YAML 文件。我把所有的 YAML 文件都提交到 Git 上。尽早使用 GitOps(而不是在本地保存文件)可以让我看到修订历史记录,当我开始为正在开发的应用程序正式化管道时,这些可以帮我获得成功。

我将 VSCode 作为文本编辑器,并使用了 Moonlight 主题。尽管 VSCode 已经提供了很多很棒的功能,Red Hat 的 YAML 插件为验证、自动完成和格式化提供了很多便利。

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

目前,我编写 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,推送新的镜像,并重新部署到集群中。

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

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 镜像的神奇工具。

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

我们可以使用 dive 来检查不同镜像层之间文件系统的变更。如果在 Docker 构建过程中某些内容出现了问题,这个工具会非常有用。

调试

现在我们已经有了运行 Kubernetes 的 pod。接下来该做些什么?

每隔一段时间,我的规范文件或应用程序代码就会出问题。

我的 kubernetes 调试工作流程通常是这样的:

  1. 描述 pod(使用 kdpo 别名)。是我的规范文件出错了吗?(例如:Deployment 是否试图挂载一个我不小心放入另一个命名空间的 Secret?)如果不是……

  2. 获取 pod 日志。skaffold dev 命令将每个部署的容器的所有日志组合起来,将它们流式传输到 stdout。但是我发现,当我有两个或多个 pod 在运行时,格式会变得很乱。同时,通常的 kubectl logs 命令可能导致无限复制粘贴新 pod 的名称。

stern 是一种非常棒的替代方案,以更定制化的方式查看日志尾部。stern 使用正则表达式在 pod 上选择日志——并且假设所有 pod 都以部署名称作为开头,你可以跟踪所有部署中的 pod 日志,而无需知道确切的 pod 名称。超级有用:

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

如果日志没有给我提供有用的线索,通常我会…

  1. 进入 pod(带有 tab 键自动完成功能的 kex 别名):

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

总结

Kubernetes 是一款庞大而复杂的软件,拥有大型的配置模型。我希望通过分享这些工具给你带来一些帮助,无论你处在 k8s 旅程中的哪个位置。

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

收藏

评论

微博

用户头像
发表评论

注册/登录 InfoQ 发表评论