这是一篇菜鸟也能看懂的 K8S 漫画学习笔记
国外案例
作者:Julia Evans
译者:Ann Xu
2017-07-07 15:51

我对 Kubernetes 的一些了解

最近我一直在学习 Kubernetes。我在 6 个月前才开始认真考虑这是否可行 - 我的搭档 Kamal 已经对 Kubernetes 感兴趣好几年了(用他的话说:“Julia!你运行程序的时候不用担心程序运行用的是什么电脑!这太酷了!”,我:“我不明白,这怎么可能”),但我现在明白多了。 

这篇文章当然不是对 Kubernetes 进行全面的介绍,只是在我运用过程中学到的一些东西,这些东西能够帮助我了解当前的状况。 

这几天我实际上是设置一个集群,而不是在互联网上阅读资料,了解“这是什么”等问题,所以我学得更快:) 

我不会试图解释 Kubernetes 是什么。我喜欢 Kelsey Hightower 在 Strange Loop 的介绍性演讲,演讲名称为“采用 CoreOS 和 Kubernetes 进行规模化管理容器”,如果您想要了解,Kelsey  在这几年来已经做了为数众多的演讲。 

基本上,Kubernetes 是一个在计算机上运行程序(以及容器)的分布式系统。你告诉它运行什么,然后它能自动安排到你的机器上。

一组草图

今天我画了一组“ Kubernetes 场景”的草图,试着解释一些非常简单的部分,例如“添加新节点时会发生什么?”。


来自底层的 Kubernetes

最早帮助我了解 Kubernetes 的是 Kamal 的“来自底层的 Kubernetes”系列。 他基本上就是为你介绍每个 Kubernetes 组件之间如何相互影响——“看,你可以让 Kubelet 自动运行!如果你有一个 Kubelet,你可以添加 API 服务器,并且让它们两个自动运行!好的,真棒,现在让我们添加调度程序!”我发现这样呈现时,会更好理解。这是他的 3 个帖子: 

  • 第 1 部分:The Kubelet(英文原文链接:http://kamalmarhubi.com/blog/2015/08/27/what-even-is-a-kubelet/)
  • 第 2 部分: The API Server(英文原文链接:http://kamalmarhubi.com/blog/2015/09/06/kubernetes-from-the-ground-up-the-api-server/)
  • 第 3 部分: The Scheduler(英文原文链接:http://kamalmarhubi.com/blog/2015/11/17/kubernetes-from-the-ground-up-the-scheduler/)

这些帖子大体上教会了我: 

  • “Kubelet”是用来在节点上运行容器的
  • 如果你要求 API 服务器在节点上运行容器,API 服务器会要求 Kubelet 完成这一任务(非直接完成)
  • 调度程序会将“运行容器”转换为“在节点 X 上运行容器”

但是如果您想了解这些组件的相互作用,您应该仔细阅读它们。Kubernetes 相关的东西变化很快,但是我认为像“API 服务器与 Kubelet 的交互”等基础架构并没有太大变化,这可以作为起点。

Etcd: Kubernetes 的大脑

更好地理解 Etcd 也真正帮助了我理解 Kubernetes 如何工作。


Kubernetes 中的每个组件(API 服务器,调度程序,Kubelet,控制器管理器,等等)都是无状态的。所有状态都存储在名为 Etcd 的键值存储器中,而组件之间的通信通常通过 Etcd 进行。

例如!假设你想在机器 X 上运行一个容器,您不需要求机器X上的 Kubelet 运行容器,这不是 Kubernetes 的运行方式!相反,实际情况应该是: 

  1. 你给 Etcd 写入:“这个 Pod 应该在机器 X 上运行”。(从技术上来说,你永远不会直接写入 Etcd,而是通过 API 服务器来完成,后文中我们会谈到这点)
  2. 机器 X 上的 Kublet 现在就要看着 Etcd,并想着:“天呐!它表示 Pod 应该运行,但是我没有运行!我要马上运行它!”

同样,如果你想把一个容器放在某个地方,但你不在乎这个地方是哪,你可以: 

  1. 你给 Etcd 写入:“这个 Pod 应该运行在某个地方”
  2. 调度器看到这一切,并认为“天呐!有一个没有调度的 Pod!必须修复!”于是它给 Pod 分配一个机器(机器 Y)以运行。
  3. 像之前一样,机器 Y 上的 Kubelet 看到这一切,并认为“天呐!这是调度到我的机器上运行!最好现在做完!!”

在我通过观察 Etcd 必须做的任务、正在做的任务,并将新状态写入 Etcd,基本明白 Kubernetes 内所有工作之后,Kubernetes 这个词对我来说更有意义了。

API 服务器负责将内容放入 Etcd 中

了解 Etcd 也帮助我更多地了解了 API 服务器的作用!API 服务器有一些非常简单的任务: 

  1. 你告诉它放在 Etcd 的东西
  2. 如果你说的话没有意义(与正确的模式不符),它就会拒绝
  3. 否则它会执行

这其实非常简单! 它也管理身份验证(“谁被允许把什么东西放入 Etcd”),身份验证非常重要,但我不会在此深入地谈到它。Kubernetes 身份验证的这个页面非常有用,虽然它的形式有点像“你可以使用 9 个不同的认证策略”这种类型。不过据我所知,正常的方式是 X509 客户端证书。

控制管理器做了一些事情

我们讨论了调度程序会如何执行“这是一个应该在某个地方运行的 Pod”,并将其转换为“应该在机器 X 上运行的 Pod”。 有一些这样的转换必须发生: 

  • Kubernetes Daemonsets说:“在每个机器上运行”。然后就有一个“Daemonset 控制器”,每当它看到 Etcd 中有 Daemonset,它就会在每个机器上创建一个同样配置的 Pod。
  • 您可以创建一个副本集“运行其中的 5 个程序”。然后“副本集控制器”在 Etcd 中看到一个副本集时,将创建 5 个 Pod 供调度程序调度。

控制器管理员一般都会捆绑一堆不同的程序与不同的作业。

出现错误?找出哪个控制器负责并查看其日志

今天我的一个 Pods 并没有被调度。我想了一会儿,认为“嗯,调度器负责调度 Pod”,并且去看看调度程序的日志。原来,我重新配置调度器时出现错误,所以它不再运行了!我越多地使用 K8S,出现问题时,找出哪个组件可能会负责的就越容易! Kubernetes 组件可以在 Kubernetes 内部运行有一件让我觉得非常赞的事情就是 — 相对核心的 Kubernetes 组件(如 DNS 系统和覆盖的网络系统)可以在 Kubernetes 内部运行!可以说“呃,Kubernetes,请启动 DNS!” 这基本上是因为要在 Kubernetes 内部运行程序,你只需要运行 5 件事情: 

  • 调度程序
  • API 服务器
  • Etcd
  • 每个节点上的 Kubelets(实际执行容器)
  • 控制管理器(因为设置 Deamonsets 需要控制管理器)

一旦你拥有这 5 个东西,你就可以安排容器在节点上运行了!所以如果你想运行另一个 Kubernetes 组件(比如你的覆盖网络,或DNS服务器,或其他任何东西),你都可以直接让 API 服务器(利用 kubectl apply -f your-configuration-file.yaml)来调度它,然后 API 服务器就会运行它!

还有 Bootkube,您可以在 Kubernetes(甚至 API 服务器)中运行所有  Kubernetes 组件,但是它现在没有 100% 准备好生产。在 Kubernetes 中运行 DNS 服务器等似乎很正常。

Kubernetes网络:不是不可理解

这个页面很好地解释了“每个容器获得一个IP”的 Kubernetes 网络模型,但是了解如何真正实现这一点其实并不是太琐碎的要求! 

当我开始学习 Kubernetes 网络时,对于如何给每个容器一个 IP 地址这点,我感到非常困惑。回想起来,我认为这是因为我不了解一些基本的网络概念(要了解什么是“覆盖网络”,以及它的工作原理,你实际上需要了解一些关于计算机网络的事情!) 

现在我觉得能够建立一个容器网络系统,就像我知道足够的概念来调试我遇到的问题!我写了 一个容器的网络概述,试图总结一些我学到的东西。 

关于 Sophie 如何调试 Kube-DNS 问题的总结就是一个很好的例子,告诉我们了解了基础的额网络概念能如何帮助调试问题。

理解网络真的有帮助

现在我知道有些东西我从前(可能是 2 年前)并没有理解。理解网络概念真的有助于我调试我 Kubernetes 集群中的问题 — 如果我不得不在 Kubernetes 集群中调试网络问题,但没有了解很多网络基础知识,那么我认为我将只是在网上搜索错误消息,并尝试用随机的东西来解决问题,这将是悲惨的。

  • 覆盖网络(我在去年写了一个容器网络概述)
  • 网络命名空间(大体上理解命名空间对于使用容器非常有帮助)
  • DNS(因为 Kubernetes 有 DNS 服务器)
  • 路由表,如何运行 ip route list 和 ip link list
  • 网络交互
  • 封装(Vxlan / UDP)
  • 关于如何使用 Iptables 和读取 Iptables 配置的基础知识
  • TLS,服务器证书,客户端证书,证书颁发机构 

Kubernetes 源代码似乎很容易阅读

Kubernetes 源代码都在 Go 中,这是很强大的。该项目移动速度非常快,所以这些东西并不总是记录在案(最后你会发现你最后只是在看 github 上的问题去了解当前的状态),但是一般来说,我发现 Go 代码可以读取,而且知道我正在使用能够让我自己理解的语言工作,让我觉得很安心。

Kubernetes Slack小组是伟大的

你可以通过访问 http://slack.kubernetes.io 来加入 Slack 小组。我通常试图自己先解决出来,而不是去那里,但是当我提出问题时,那里的人超级有帮助。

502 comCount 0