一套适用于 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
- 英文原文:https://medium.com/@mo_keefe/a-kubernetes-development-workflow-for-macos-8c41669a4518