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

2019 年 2 月 10 日

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

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/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 旅程中的哪个位置。


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



2019 年 2 月 10 日 08:0012500
用户头像

发布了 731 篇内容, 共 359.6 次阅读, 收获喜欢 1824 次。

关注

评论 1 条评论

发布
用户头像
看起来很炫酷
2020 年 10 月 30 日 13:25
回复
没有更多评论了
发现更多内容

大话设计模式 | 0 面向对象基础

Puran

C# 设计模式

SpringCloud-OpenFeign源码

云淡风轻

Spring Cloud

ArrayList浅析

章小传

Java collection 原理 ArrayList

原创 | TDD工具集:JUnit、AssertJ和Mockito (十六)编写测试-有条件执行测试

编程道与术

Java 编程 TDD 单元测试 JUnit

MyBatis之启动分析(一)

ytao

mybatis Java 面试

OFD版式技术解析系列(一):开篇

华宇法律科技

分布式事务 - 三种常见的解决方案

Java收录阁

分布式事务

Mobaxterm (安装 、汉化、使用)入门教程

Geek_Offset

Kafka的生产者优秀架构设计

奈学教育

kafka 分布式

JDK 15 都发布了,可 Java 8 依然是最爱

古时的风筝

Java Java 25 周年 Java版本

Sula - 可能是西湖区最好用的antd配置框架

开远

前端开发 antd sula 配置化开发 前端框架

GitHub上10个不可错过的另类有趣项目

码农神说

GitHub 程序员人生 开源项目

JAVA后端学习路线

敖丙

Java 学习 程序员 Java25周年

计算机超全核心技术知识

cxuan

后端 计算机基础

JUC整理笔记五之梳理Varhandle(下)

JFound

Java

科学提升认知方法之贝叶斯公式

奈学教育

贝叶斯公式

【译文】为什么说Rust是机器人技术的未来

袁承兴

rust 机器人 嵌入式

自定义 SpringBootStarter

lee

普通二本,毕业三年,北漂之后,我是怎么成为程序猿的。

why技术

个人成长 程序人生 随笔杂谈 北漂

读懂才会用 : 带你见识 Redis 的 zset

小眼睛聊技术

redis 学习 程序员 架构 redis6.0.0

一周信创舆情观察(5.25~5.31)

统小信uos

基础软件 操作系统 新基建

产品的本质,知道却看不到

Neco.W

产品 产品经理 需求 产品开发

如何更好的交谈(以英语为例)

七镜花园-董一凡

学习 生活

女朋友跟我吐槽Java中ArrayList遍历时删除元素的各种姿势

NotFound9

Java 架构 面试 编程语言 后端

2020年6月3日 对象与类

瑞克与莫迪

我的个人知识管理方法

lidaobing

个人成长 知识管理 PKM

CSS Tricks网站创始人作序推荐,这本书助你成为Web开发高手

图灵社区

CSS Web 开发 设计思维

一文让你快速上手 Mockito 单元测试框架

mghio

Java spring 单元测试 Mockito

如何挑选一份工作

池建强

求职 找工作

浅谈敏捷开发中的设计

czjczk

敏捷开发

分享一份阿里架构师 651 多个技术分支的脑图

奈学教育

大数据

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