再也不用担心学不会K8S!17个K8S初学者必须掌握的知识点


  • administrators

    Kubernetes是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,有助于声明式配置和自动化。目前,Kubernetes正在以强劲的势头持续发展,其相关的生态也在不断完善。本文中,我们列出了所有Kubernetes入门者对于部署和管理Kubernetes容器不得不关注的17个方面。

    1、 设置Kubernetes集群

    Kubernetes有多个开源组件组合而成,这些组件由不同的公司开发,这给使用Kubernetes增加了难度——因为难以找到所有相关的软件包,而且难以安装、配置。幸运的是,市场上有一些解决方案和工具可以让Kubernetes集群高效运行。因此,强烈推荐您使用类似的工具在您的环境中设置Kubernetes集群,如企业级的Kubernetes管理平台Rancher等。

    2、通过CLI或RESTful API使用K8S

    现在你可以开始在Kubernetes上创建不同类型的资源。为了在微服务架构中实现您的应用程序,深入了解Kubernetes命令行界面(CLI)将有助于理解Kubernetes资源并加以整合。当您在Kubernetes中部署应用程序之后,您可以进行可扩展且高效的容器管理,还可以完成微服务的DevOps交付过程。

    无论是使用CLI还是API(RESTful),都能让使用Kubernetes变得轻松。当您安装了Kubernetes master之后,您可以运行一个kubectl 命令行来查看系统版本或进行其他交互。Kubectl是Kubernetes唯一的命令行工具,它可以控制Kubernetes集群管理器。任何集群或Kubernetes集群的操作都能够通过kubectl命令行执行。此外,kubectl允许通过命令行的可选参数或文件(使用-f选项)输入信息。

    关于kubectl的基础介绍以及详细教程,可参见以下文章:

    使用Kubectl管理Kubernetes的全解教程

    你一定会用到的7条kubectl命令

    3、 链接Pod和容器

    Pod是一组包含一个或多个容器,还是Kubernetes中最小的部署单元。Pod始终位于同一位置、统一调度,并在共享上下文中运行。每个Pod都被以下Linux命名空间隔离:进程 ID(PID)命名空间、网络命名空间、进程间通信(IPC)命名空间、Unix时间共享(UTS)命名空间。在容器出现之前,它们将在同一物理机或虚拟机上执行。构建混合了不同Docker镜像的应用程序堆栈pod(如,web服务器和数据库)十分有用。

    为了能够提升资源的利用率,Kubernetes提供了一个强大的功能,它能在运行的服务上进行编码并配置弹性伸缩,这一功能称为Pod水平自动扩展(HPA)。在Rancher 2.3中,已经集成了HPA功能,用户可以通过Rancher UI使用。关于HPA的详细内容,可参见以下文章:

    如何为Kubernetes配置Pod水平自动扩展

    kubectl+HPA!提升K8S容器资源利用的关键解决方案

    4、 使用ReplicaSets管理Pod

    ReplicaSet是Kubernetes中用于引用Pod副本的API对象的术语。它主要的目的是控制一组Pod的行为。ReplicaSet可以保证运行用户所指定的数量Pod。如果ReplicaSet中的某些Pod崩溃并终止,系统将在运行状况良好的节点上自动使用初始配置重新创建Pod,并且保持一定数量的进程在持续运行。在更改一组Pod规模时,用户可以轻松地伸缩应用程序。根据这一特性,无论是否需要Pod的副本,都可以始终依靠ReplicaSet来实现自动恢复和弹性伸缩。

    5、 Deployment API

    早在Kubernetes 1.2版本的时候就引入了Deployment API,它可以更加方便地管理Pod和ReplicaSet。通过Replication Controller进行滚动更新和回滚的功能是通过客户端(kubectl命令和REST API)实现的,kubectl在更新replication controller时需要保持连接。另一方面,deployment负责服务器端的滚动更新和回滚过程。接受该请求后,客户端可以立即断开连接。因此,Deployment API被设计为管理ReplicaSet对象的高级API。

    6、 使用服务

    网络服务用于接收请求并提供解决方案,客户端通过网络连接访问服务,他们不必知道服务的架构或其运行方式。客户端唯一需要验证的是是否可以访问服务的端点,然后遵循其使用策略来获取服务器的响应。Kubernetes服务也与其类似,它是一种为一组功能相同的pod提供单一不变的接入点的资源。当服务存在时,它的IP地址和端口不会改变。客户端通过IP地址和端口号建立连接,这些连接会被路由到提供该服务的任意一个pod上。通过这种方式,客户端不需要知道每个单独的提供服务的pod的地址,这样这些pod就可以在集群中随时被创建或移除。

    7、 使用volumes

    容器中的文件是临时文件,当容器终止时,文件就会消失。Docker引入了数据volume来帮助我们持久化存储数据。然而,当涉及到多个主机时,作为一个容器集群,很难管理所有容器和主机之间的分享文件和动态配置volume。因此Kubernetes也引入了volume,它与Pod的生命周期相同,但与容器的生命周期无关。换言之,当容器终止或重启时,volume中的数据也不会丢失。Kubernetes中提供了十分丰富的volume类型,如emptyDir等。

    如果你想了解更多关于Volume的内容,欢迎参考以下文章:

    超长干货讲透3种K8S存储:emptyDir、hostPath、local

    深入浅出聊聊Kubernetes存储(一):详解Kubernetes存储关键概念

    深入浅出聊聊Kubernetes存储(二):搞定持久化存储

    8、 使用Storage Class

    在云计算领域中,人们动态地配置存储或数据volume。虽然PersistentVolumeClaim是基于管理员提供的现有静态PersistentVolume,但如果可以在需要时动态请求cloud volume,则也许会有帮助。Storage Class可以解决这一问题。想要让Storage Class可以在集群中使用,需要满足3个条件。首先,必须启动DefaultStorageClass准入控制器;然后,PersistentVolumeClaim需要请求一个存储类;最后,管理员必须配置Storage Class才能使动态配置工作。

    如果你想了解关于Storage Class的更多内容,请参考以下文章:

    深入浅出聊聊Kubernetes存储(一):详解Kubernetes存储关键概念

    9、 使用Secret

    Kubernetes Secret使用key-value格式编码的值来管理信息,这些信息可以是密码、访问密钥或token。使用Secret,用户无需担心会在配置文件中公开敏感数据,它可以降低凭据泄露的风险,并使我们的资源配置更加井井有条。目前,有三种类型的Secret:

    • Generic/Opaque
    • Docker registry
    • TLS

    Generic/Opaque是在应用程序中默认使用的secret类型。Docker registry类型可用于存储私密Docker registry的凭据。TLS secret用于存储CA证书以进行集群管理。Kubernetes为用于访问API服务器的凭据创建内置的Secret。

    在使用Secret之前,我们必须牢记,应在依赖于它的任何Pod之前创建secret,以便pod能够正确引用它。此外,Secret大小限制为1MB。因此Secret不是为存储大量数据而设计的。对于配置数据,请考虑使用ConfigMaps;对于大量非敏感数据,请考虑使用Volume。

    10、 使用名称

    创建任何Kubernetes对象(例如Pod、Deployment和Service)时,可以为其分配名称。在Kubernetes中,每个空间的名称是唯一的,也就是说您不能在Pod中分配相同的名称。Kubernetes的命名规则如下:

    最多253个字符
    小写字母和数字字符
    中间可以包含特殊字符,但只能包含破折号(-)和点(.)

    11、 使用命名空间

    在Kubernetes集群中,资源名称是命名空间中唯一标识符。使用Kubernetes命名空间可以为同一集群中的不同环境分隔用户空间。它使您可以灵活地创建隔离环境并将资源分配给不同的项目和团队。您可以将命名空间视为虚拟集群。Pod、服务和Deployment都可以包含在某个命名空间中。某些低级资源(如节点、persistentVolumes)则不属于任何命名空间。在深入研究资源命名空间之前,让我们先了解kubeconfig和一些关键概念。

    • Kubeconfig用于调用配置Kubernetes集群访问权限的文件。作为系统的初始配置,Kubernetes将$HOME/.kube/config作为kubeconfig文件。
    • Kubeconfig定义了用户、集群和上下文:kubeconfig列出了多个用于定义身份认证的用户,以及多个用于指示Kubernetes API服务器的集群。另外,kubeconfig中的上下文由一个用户和一个集群组合而成:使用某种身份认证可以访问特定的Kubernetes集群。
    • 用户和集群可以在上下文之间共享,但是每个上下文只能有一个用户和一个集群。
    • 命名空间可以附加到上下文:可以将每个上下文分配给现有的命名空间,如果不存在,它将与默认命名空间一起使用。
    • 当前上下文是客户端的默认环境:kubeconfig中可能有多个上下文,但当前上下文只有1个。当前上下文和附加的命名空间将为用户构建默认的计算环境。

    现在你应该了解,因为命名空间可以与kubeconfig一起使用,所以用户可以通过切换kubeconfig中的当前上下文轻松切换默认资源。但是,用户仍可以使用指定资源启动其他命名空间中的任何资源。

    关于命名空间的更多内容,欢迎参考以下文章:

    超长干货 | Kubernetes命名空间详解

    12、 使用标签(label)和selector

    标签是一组键/值对,它们会附加到对象元数据。我们可以使用标签来选择、组织和分组对象,例如Pod、ReplicaSets和服务。标签不一定是唯一的,对象可以带有相同的标签集。Label selector用于查询具有以下类型标签的对象:

    • 基于等式(Equality-based):
      使用等于(=或==)或非等于(!=)运算符
    • 基于集合(Set-based):
      使用或不使用运算符

    13、 弹性伸缩您的容器

    根据预定义的标准来伸缩应用程序或服务是一种最有效地最大程度利用计算资源地常用方法。在Kubernetes中,您可以手动伸缩,也可以使用HPA进行自动弹性伸缩。

    关于弹性伸缩的更多内容,欢迎查阅以下文章:

    6个与弹性伸缩、调度相关的Kubernetes附加组件

    14、 更新运行中的容器

    为了让容器运行良好,我们可以通过执行最新的镜像轻松发布新程序,并减轻环境设置的麻烦。但是,如何在正在运行的容器上发布程序呢?在本地管理容器时,我们必须先停止正在运行的容器,然后再启动具有最新镜像和相同配置的新容器。此外,还有一些简单有效的方法可以在Kubernetes中更新程序。一种称为滚动更新,这意味着Deployment可以更新其Pod,而不会导致客户端停机。另一种方法称为recreate,它只是终止所有Pod,然后创建一个新的集合。

    15、 转发容器端口

    您应该学习如何与Kubernetes服务一起在内部和外部转发容器端口。另外,您需要了解Kubernetes处理内部和外部通信的方法,在Kubernetes中有4种网络模型:

    • 容器到容器的通信
    • Pod到Pod的通信
    • Pod到服务的通信
    • 外部到内部的通信

    如果你想了解更多关于Kubernetes通信或网络模型的内容,欢迎参考以下文章:

    四大模型,搞定Kubernetes网络!

    如何在Kubernetes中Pod间共享内存以实现高性能通信?

    在Kubernetes环境中,容器间如何进行网络通信?

    16、 在Kubernetes上提交Job

    您的容器应用程序不仅适用于诸如nginx之类的守护进程,还适用于某些批处理job,这些job最终会在任务完成时退出。Kubernetes支持这种情况:您可以提交一个容器作为job,而Kubernetes将分派到适当的节点并执行您的job。

    17、 使用配置文件

    Kubernetes支持两种不同的文件格式,YAML和JSON。每种格式都可以描述Kubernetes的相同功能。

    在这篇文章中,我们列出了对于Kubernetes初学者来说,17个十分重要的方面。并尽可能地给出更详细的教程链接,希望可以帮助你梳理Kubernetes的整体学习架构,也希望能够让你可以系统地入门Kubernetes。

    Enjoy your sail!

    文章来源:RancherLabs