我的编程空间,编程开发者的网络收藏夹
学习永远不晚

部署Kubernetes应用容易忽略的细节有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

部署Kubernetes应用容易忽略的细节有哪些

这篇文章主要介绍“部署Kubernetes应用容易忽略的细节有哪些”,在日常操作中,相信很多人在部署Kubernetes应用容易忽略的细节有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”部署Kubernetes应用容易忽略的细节有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1. 配置 Pod 请求与限制

我们从配置一套可以运行 Pod 的简单环境开始。Kubernetes 在处理 Pod 调度与故障状态方面确实表现出色,但我们也意识到,如果 Kubernetes 调度程序无法衡量 Pod 的成功运行究竟需要多少资源,那么有时候部署工作可能面临挑战。而这一挑战,也正是资源请求与限制机制的设计根源。目前,设置应用程序请求与限制方面的最佳实践仍然存在不少争议。实际上,这项工作更像是一门艺术,而非单纯的科学。下面,我们聊聊 GumGum 公司内部对这个问题的看法:

Pod 请求: 这是调度程序用于衡量 Pod 最佳部署方法的主要指标。

下面来看 Kubernetes 说明文档中的相关描述:

过滤步骤会在可行的情况下找到一组 Pod。例如,PodFitsResources 过滤器会检查候选节点是否具备充足的可用资源,以满足 Pod 提出的特定资源请求。

在内部,我们通过这样一种方式使用应用程序请求:通过设置,我们对应用程序正常运行实际工作负载时的资源需求做出估计。以此为基础,调度程序即可更合理地放置节点。最初,我们希望将请求设置得更高一些,保证各个 Pod 都拥有充足的资源。但我们很快发现,这种方式会大大增加调度时间,并导致部分 Pod 无法完全调度。这样的结果实际上与我们完全不指定资源请求时看到的情况类似:在后一种情况下,由于控制平面并不清楚应用程序需要多少资源,因此调度程序经常会“逐出”Pod 且不再重新加以调度。正是这一调度算法中的关键组成部分,导致我们无法得到符合预期的调度效果。

Pod 限制: 即对于 Pod 的直接限制,代表着集群允许各容器所使用的最大资源量。

同样来看官方说明文档中的描述:

如果您为容器设置了 4GiB 的内存限制,则 kubelet(与容器运行时)将强制执行此限制。运行时将防止容器使用超出所配置上限的资源容量。例如,当容器中的进程所消耗的内存量超过获准数量时,系统内核将终止该资源分配尝试,并提示内存不足(OOM)错误。

容器所使用的实际资源量可以高于其请求,但永远不能高于配置上限。很明显,对限制指标的正确设置相当困难,但也非常重要。在理想情况下,我们希望让 Pod 的资源需求在整个流程生命周期内发生变化,而又不致干扰到系统上的其他流程——这也正是限制机制的意义所在。遗憾的是,我们无法明确给出最合适的设置值,只能遵循以下过程进行调整:

  1. 使用负载测试工具,我们可以模拟基准流量水平,并观察 Pod 的资源使用情况(包括内存与 CPU)。

  2. 我们将 Pod 请求设置在极低水平,同时将 Pod 资源限制保持在请求值的约 5 倍,而后观察其行为。当请求过低时,进程将无法启动,并时常引发神秘的 Go 运行时错误。

这里需要强调的一点在于,资源限制越严格,Pod 的调度难度也就越大。这是因为 Pod 调度要求目标节点拥有充足的资源。例如,如果您的资源非常有限(内存只有 4GB),那么即使是运行轻量级 Web 服务器进程都很可能非常困难。在这种情况下,大家需要进行横向扩展,而且各个新容器也应运行在同样拥有至少 4GB 可用内存的节点之上。如果不存在这样的节点,您需要在集群中引入新节点以处理该 Pod,这无疑会令启动时间有所增加。总之,请务必在资源请求与限制之间找到最小“边界”,保证快速、平衡实现扩展。

2. 配置 Liveness 与 Readiness 探针

Kubernetes 社区中经常讨论的另一个有趣话题,就是如何配置 Linvess 与 Readiness 探针。合理使用这两种探针,能够为我们带来一种运行容错软件、并最大程度减少停机时间的机制。但如果配置不正确,它们也可能对应用程序造成严重的性能影响。下面来看这两种探针的基本情况,以及如何进行使用判断:

Liveness 探针:“用于指示容器是否正在运行。如果 Liveness 探针失败,则 kubelet 将关闭容器,且容器将开始执行重新启动策略。如果容器并不提供 Liveness 探针,则其默认状态被视为成功。”—Kubernetes说明文档

Liveness 探针的资源需求必须很低,因为它们需要频繁运行,并需要在应用程序运行时向 Kubernetes 发出通知。请注意,如果将其设置为每秒运行一次,则系统将需要承担每秒 1 次的额外请求处理量。因此,请务必认真考虑如何处理这些额外请求及相应资源。在 GumGum,我们将 Liveness 探针设置为在应用程序主组件运行时进行响应,且不考虑数据是否已经完全可用(例如来自远程数据库或缓存的数据)。举例来说,我们会在应用当中设置一个特定的“health”端点,单纯负责返回 200 响应代码。只要仍在返回响应,就表明该进程已经启动并可以处理请求(但尚未正式产生流量)。

Readiness 探针:“指示容器是否准备好处理请求。如果 Readiness 探针失败,则端点控制器将从与该 Pod 相匹配的所有服务端点中,删除该 Pod 的 IP 地址。”

Readiness 探针的运行成本要高得多,因为其作用在于持续告知后端,整个应用程序正处于运行状态且准备好接收请求。关于此探针是否应该访问数据库,社区中存在诸多争论。考虑到 Readiness 探针造成的开销(需要经常运行,但频繁可以灵活调整),我们决定在某些应用程序中只在从数据库返回记录后,才开始“提供流量”。通过对 Readiness 探针的精心设计,我们已经能够实现更高的可用性水平以及零停机时间部署。

但如果大家确实有必要通过应用程序的 Readiness 探针随时检查数据库请求的就绪状态,请尽可能控制查询操作的资源用量,例如……

SELECT small_item FROM table LIMIT 1

以下,是我们在 Kubernetes 中为这两种探针指定的配置值:

livenessProbe:httpGet:path: /api/livenessport: httpreadinessProbe:httpGet:path: /api/readinessport: http  periodSeconds: 2

您还可以添加其他一些配置选项:

  • initialDelaySeconds- 容器启动的多少秒后,探针开始实际运行

  • periodSeconds- 两次探测之间的等待间隔

  • timeoutSeconds- 需要经过多少秒,才能判定某一 Pod 处于故障状态。相当于传统意义上的超时指标

  • failureThreshold- 探针失败多少次后,才向 Pod 发出重启信号

  • successThreshold- 探针成功多少次后,才能判定 Pod 进入就绪状态(通常使用在 Pod 启动或者故障恢复之后)

3. 设置默认 Pod 网络策略

Kubernetes 使用一种“扁平”网络拓扑;在默认情况下,所有 Pod 之间都可以直接相互通信。但结合实际用例,这种通信能力往往不必要甚至不可接受。由此带来的一大潜在安全隐患在于,如果某一易受攻击的应用程序遭到利用,则攻击者即可由此获取完全访问权限,进而将流量发送至网络上的所有 Pod 当中。因此我们也有必要在 Pod 网络中应用最低访问原则,在理想情况下通过网络策略明确指定哪些容器之间允许建立相互连接。

以下列简单策略为例,可以看到其将拒绝特定命名空间中的所有入口流量:

---apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: default-deny-ingressspec:podSelector: {}policyTypes:- Ingress

4. 通过 Hooks 与 Init 容器执行自定义行为

我们希望在 Kubernetes 系统中实现的核心目标之一,在于尝试为现有开发人员提供近乎零停机时间的部署支持。但不同应用程序往往拥有不同的关闭方式与资源清理过程,因此整体零停机目标很难实现。首先横亘在我们面前的,就是 Nginx 这道难关。我们注意到在启动 Pod 的滚动部署时,活动连接在成功终止之前就会被丢弃。经过广泛的在线研究,事实证明 Kubernetes 在终止 Pod 之前,并不会等待 Nginx 用尽其连接资源。使用预停止 hook,我们得以注入此项功能,并由此实现了零停机时间。

lifecycle:preStop:exec:command: ["/usr/local/bin/nginx-killer.sh"]

isnginx-killer.sh:

#!/bin/bashsleep 3PID=$(cat /run/nginx.pid)nginx -s quitwhile [ -d /proc/$PID ]; doecho "Waiting while shutting down nginx..."sleep 10done

另一个实用范例,是通过 Init 容器处理特定应用程序的启动任务。部分高人气 Kubernetes 项目还会使用 Istio 等 init-containers 将 Envoy 处理代码注入 Pod 当中。如果您在应用程序启动之前,需要首先完成繁重的数据库迁移过程,那么 Init 容器特别适用。您也可以为此过程设定更高的资源上限,保证其不受主应用程序的限制设定影响。

另一种常见模式是向 init-conatiner 提供 secrets 访问权,并由该容器将这些凭证公布给主 Pod,从而防止通过主应用 Pod 本体对 secret 发出示授权访问。同样来看说明文档中的表述:

Init 容器能够安全运行实用程序或自定义代码,避免其破坏应用程序容器镜像的安全性。通过剥离这些不必要的工具,您可以限制应用程序容器镜像的攻击面。

5. 内核调优

最后,我们来聊聊一项最先进的技术。Kubernetes 本身是一套高度灵活的平台,可帮助您以最适合的方式运行工作负载。在 GumGum,我们拥有多种高性能应用程序,其对运行资源有着极为苛刻的要求。在进行了广泛的负载测试之后,我们发现有某一款应用程序难以在使用 Kubernetes 默认设置的前提下处理必要的流量负载。但 Kubernetes 允许我们运行一个高权限容器,通过修改为其配置适用于特定 Pod 的内核运行参数。通过以下示例代码,我们修改了 Pod 中的最大开启连接数量:

initContainers:- name: sysctlimage: alpine:3.10securityContext:privileged: truecommand: ['sh', '-c', "sysctl -w net.core.somaxconn=32768"]

这是一种使用频率较低的高级技术。如果您的应用程序难以在高负载场景下健康运行,大家可能需要调整其中的部分参数。这里建议各位在官方说明文档中参阅参数调优与可选值的相关细节信息。

到此,关于“部署Kubernetes应用容易忽略的细节有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

部署Kubernetes应用容易忽略的细节有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

部署Kubernetes应用容易忽略的细节有哪些

这篇文章主要介绍“部署Kubernetes应用容易忽略的细节有哪些”,在日常操作中,相信很多人在部署Kubernetes应用容易忽略的细节有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”部署Kuberne
2023-06-27

网站建设中容易忽略的重要细节有哪些

小编给大家分享一下网站建设中容易忽略的重要细节有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、网站链接不连贯有一些网站的技术人员,在进行网站建设的时候,或
2023-06-10

SEO中容易被忽视的细节分析有哪些

这篇文章主要为大家展示了“SEO中容易被忽视的细节分析有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SEO中容易被忽视的细节分析有哪些”这篇文章吧。第一,标签的应用,建设比较早的站容易出现
2023-06-13

原生态Java 程序员容易忽视的编程细节有哪些

今天就跟大家聊聊有关原生态Java 程序员容易忽视的编程细节有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是Java程序设计语言和Java平台的总称,要想学好一门语言,
2023-06-17

云端部署 PHP 应用的成本优化策略有哪些?

在云端部署 php 应用时,采用以下策略可优化成本:选择与应用负载匹配的实例类型(例如,轻量级应用使用共享型实例,资源密集型应用使用专用实例)。使用自动缩放根据流量自动调整实例数量。优化数据库配置,使用缓存、索引和分区提高查询性能,关闭未使
云端部署 PHP 应用的成本优化策略有哪些?
2024-05-06

PHP 云端部署中的可用性和容错策略有哪些?

提高 php 云端部署可用性和容错性的策略包括:加密传输:使用 ssl/tls 加密通信。冗余架构:创建应用程序的多个实例,并部署在不同区域。负载均衡:分发请求以提高可用性和性能。实时监控:使用监控工具持续监视应用程序健康状况。自动故障转移
PHP 云端部署中的可用性和容错策略有哪些?
2024-05-06

使用容器化技术部署 PHP 应用的优点有哪些?

使用容器化技术部署 php 应用程序的优点包括:隔离和资源限制:为应用程序提供隔离环境,防止相互影响并设置资源限制。可移植性:docker 映像包含应用程序及其依赖项,可轻松在不同环境间部署。可扩展性:按需创建和销毁容器,根据需求动态扩展或
使用容器化技术部署 PHP 应用的优点有哪些?
2024-05-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录