[关闭]
@levinzhang 2019-08-10T14:36:31.000000Z 字数 2583 阅读 502

Kubernetes:核心概念

摘要

入门Kubernetes是非常困难的,因为这会涉及到许多的概念和新理念,本文以图文并茂的形式总结了Kubernetes中的核心概念。


本文最初发表于云原生计算基金会官方博客,由InfoQ中文站翻译分享。

它本不必如此困难?

掌握Kubernetes是非常困难的,因为互联网上有如此多的信息,有时候很难找到理解Kubernetes的“核心”信息,当我们看到kubernetes.io站点上概念页面和文档如此密集时更会如此。在本文中,我们将会探索Kubernetes的核心概念,以便于获取关于它的基础知识,这样我们就可以一起揭开Kubernetes的神秘面纱。

什么是Kubernetes?

Kubernetes提供了基础设置和构造,帮助我们的团队构建适用于开发和部署的可用平台。用户可以通过图形化的用户界面以及命令式和声明式命令行接口管理Kubernetes集群,Kubernetes旨在管理容器化应用程序和服务的整个生命周期。

借助Kubernetes,我们可以扩展和收缩应用程序、执行滚动部署并管理由哪些服务处理特定的请求。它还提供了一个可扩展的开发框架,允许我们的团队扩展核心的Kubernetes原语(primitive)以满足个性化的需求。同时,它还支持创建自己的概念。

但是,与大多数框架一样,它的缺点之一是缺少许多现成的功能,无法被视为交钥匙(turn-key)解决方案。在标准发行版中,它不包含服务如何相互通信的方法(甚至不包含网络组件!),因此存在其他的发行版,另外我们也可以构建自己的版本。

容器

容器是独立、可执行的软件,它包含了运行所需的所有内容,比如代码、库和所有的外部依赖。它会确保运行的内容是完全相同的,即便是位于不同的环境中也是如此。这是通过将要运行的代码与它的运行上下文隔离开实现的。

在Linux中,这是通过使用名为cgroups的API来分割Linux内核的一个子集来实现的。这种方式提供了与操作系统的高度隔离,但不会带来像虚拟化环境(如VMWare、KVM等)那样的性能损耗。

Pod

pod是Kubernetes中最基本的对象。
pod是容器的集合,它们共享存储和网络,并且具备如何运行它们的规范。每个pod会分配自己的IP地址。pod中的容器会共享这个IP地址、端口空间,并且能够使用localhost实现彼此查找。
pod应该被视为短暂存活的原子单元。

Replicaset

根据给定的模板,replicaset可以运行n个pod。

replicaset并不会直接使用,但是需要理解这种资源,因为在Kubernetes构建应用的时候,它是基础的构建块。

(按照指令)replicaset可以按需扩展和收缩pod的数量。

Service

因为pod是短期存活的(replicaset通过扩展和收缩pod的数量实现这一点),那么这就带来了一个问题,现在,除非使用非常复杂的逻辑,否则我们几乎不可能引用单个pod以便于跟踪拓扑结构的变化。

Service通过在pod之上提供抽象来解决这个问题,它提供了一个可寻址的方法来与pod进行通信。

Service操作的是OSI模型之中的“第4层”(IP之上的TCP/UDP)。

Deployment

Deployment管理replicaset,可以在应用的不同版本间执行滚动更新。

这是最常用的资源类型,它通过一个接口提供了对replicaset和pod的抽象。

在更新Deployment的时候,换句话说,也就是部署应用的新版本,Deployment控制器会创建一个新的replicaset,并管理新版本替换旧版本的滚动更新。

在Kubernetes 1.11版本中,Deployment目前不会自动处理回滚。

ConfigMap

设计良好的应用应该遵循十二要素应用宣言,应用的配置应该保存到“环境”中。尽管现在通用的安全实践指出,在环境中存储配置可能会导致私密的意外泄漏,因为一些应用程序在失败时会暴露了它们的环境信息,但是无论如何,如果配置随环境(开发、staging、生产)而变化的话,那么就应该将它们与要构建的应用分开进行存储。

ConfigMaps允许将配置文件作为环境变量或文件系统挂载到Pod中,从而解决了这个问题。

Secret

Secret与ConfigMap非常类似,顾名思义,它们对应的是“Secret”信息[3][4]。

Daemonset

Daemonset会确保所有的节点都运行特定的Pod。如果要在所有节点上运行像日志代理(如fluentd)这样的内容的话,这是非常有用的。

它还能够通过使用Taints忽略特定的节点。

Ingress

在大多数情况下,Service和Pod的IP地址只能在Kubernetes集群中进行访问。Service是与互联网流量隔离的。

“Ingress是一组规则集合,它允许入站的连接访问集群Service。”

它可以用于负载平衡、终止TLS、为外部提供可路由的URL等等。Ingress只是另外一种Kubernetes资源,但是,在大多数情况下,它需要有一个Ingress控制器,如NginxTræfik等。

Kubernetes是一个自动化容器编排平台,能够允许应用程序在大型平台上大规模运行,这些平台可以包含不同处理器体系结构和操作系统的组合,这完全由实现者决定。

借助这些核心概念,Kubernetes可以将Pod安排到适当的节点上,以确保Pod的最大密度,这会由Kubernetes实现的多种算法来控制,比如Bin Packing,从而实现更高的硬件利用率。

参考资料:

[1] https://medium.com/google-cloud/kubernetes-configmaps-and-secrets-68d061f7ab5b

[2] https://medium.com/google-cloud/kubernetes-configmaps-and-secrets-part-2-3dc37111f0dc

[3] https://kubernetes.io/docs/concepts/configuration/secret/

[4] https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注