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 的基础介绍以及详细教程,可参见以下文章:
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 的详细内容,可参见以下文章:
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存储关键概念
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 中的当前上下文轻松切换默认资源。但是,用户仍可以使用指定资源启动其他命名空间中的任何资源。
关于命名空间的更多内容,欢迎参考以下文章:
12、 使用标签(label)和 selector
标签是一组键/值对,它们会附加到对象元数据。我们可以使用标签来选择、组织和分组对象,例如 Pod、ReplicaSets 和服务。标签不一定是唯一的,对象可以带有相同的标签集。Label selector 用于查询具有以下类型标签的对象:
基于等式(Equality-based):
使用等于(=或==)或非等于(!=)运算符
基于集合(Set-based):
使用或不使用运算符
13、 弹性伸缩您的容器
根据预定义的标准来伸缩应用程序或服务是一种最有效地最大程度利用计算资源地常用方法。在 Kubernetes 中,您可以手动伸缩,也可以使用 HPA 进行自动弹性伸缩。
关于弹性伸缩的更多内容,欢迎查阅以下文章:
14、 更新运行中的容器
为了让容器运行良好,我们可以通过执行最新的镜像轻松发布新程序,并减轻环境设置的麻烦。但是,如何在正在运行的容器上发布程序呢?在本地管理容器时,我们必须先停止正在运行的容器,然后再启动具有最新镜像和相同配置的新容器。此外,还有一些简单有效的方法可以在 Kubernetes 中更新程序。一种称为滚动更新,这意味着 Deployment 可以更新其 Pod,而不会导致客户端停机。另一种方法称为 recreate,它只是终止所有 Pod,然后创建一个新的集合。
15、 转发容器端口
您应该学习如何与 Kubernetes 服务一起在内部和外部转发容器端口。另外,您需要了解 Kubernetes 处理内部和外部通信的方法,在 Kubernetes 中有 4 种网络模型:
容器到容器的通信
Pod 到 Pod 的通信
Pod 到服务的通信
外部到内部的通信
如果你想了解更多关于 Kubernetes 通信或网络模型的内容,欢迎参考以下文章:
如何在Kubernetes中Pod间共享内存以实现高性能通信?
16、 在 Kubernetes 上提交 Job
您的容器应用程序不仅适用于诸如 nginx 之类的守护进程,还适用于某些批处理 job,这些 job 最终会在任务完成时退出。Kubernetes 支持这种情况:您可以提交一个容器作为 job,而 Kubernetes 将分派到适当的节点并执行您的 job。
17、 使用配置文件
Kubernetes 支持两种不同的文件格式,YAML 和 JSON。每种格式都可以描述 Kubernetes 的相同功能。
在这篇文章中,我们列出了对于 Kubernetes 初学者来说,17 个十分重要的方面。并尽可能地给出更详细的教程链接,希望可以帮助你梳理 Kubernetes 的整体学习架构,也希望能够让你可以系统地入门 Kubernetes。
Enjoy your sail!
评论