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

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

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

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

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

终端

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

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

\"\"

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

source \u0026lt;(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/v1beta3kind: Configbuild:  artifacts:  - image: gcr.io/megangcp/helloworlddeploy:  kubectl:    manifests:      - kubernetes/*

这是一个最小化的配置,我指定了镜像仓库(在这里是谷歌容器注册表,但其他镜像注册表也可以,如DockerHub)。我还指定了清单文件所在的目录。

skaffold是高度可定制的,除了kubectl之外,还可以与Helm等部署工具一起使用。

检查docker镜像

skaffold抽象了docker的构建过程,但有时候我想查看新构建镜像的这些内容:与以前的版本相比,镜像大小有怎样的变化?每个镜像层的内容是什么?

dive是一个用于检查Docker镜像的神奇工具。

\"\"

我们可以使用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名称。超级有用:

\"\"

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

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

\"\"

总结

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值