返回顶部
首页 > 资讯 > 精选 >部署Kubernetes应用容易忽略的细节有哪些
  • 328
分享到

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

2023-06-27 10:06:31 328人浏览 八月长安
摘要

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

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

--结束END--

本文标题: 部署Kubernetes应用容易忽略的细节有哪些

本文链接: https://lsjlt.com/news/309715.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 部署Kubernetes应用容易忽略的细节有哪些
    这篇文章主要介绍“部署Kubernetes应用容易忽略的细节有哪些”,在日常操作中,相信很多人在部署Kubernetes应用容易忽略的细节有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”部署Kuberne...
    99+
    2023-06-27
  • 容易被忽视的JavaScript细节有哪些
    今天就跟大家聊聊有关容易被忽视的JavaScript细节有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。语句/表达式换个角度理解语句(state...
    99+
    2024-04-02
  • 网站建设中容易忽略的重要细节有哪些
    小编给大家分享一下网站建设中容易忽略的重要细节有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、网站链接不连贯有一些网站的技术人员,在进行网站建设的时候,或...
    99+
    2023-06-10
  • Python初学者容易忽略的一些细节
    1、Python中当让给变量1赋值上变量2的值时,变量1直接指向值在内存中存储的地址,即变量1存储的是变量2的值而不是指向变量   2、"""的用法 1.多行注释 2.多行输出 3、格式化输出的三种方法 1.字符串拼接(占用内存大慎...
    99+
    2023-01-31
    初学者 细节 Python
  • SEO中容易被忽视的细节分析有哪些
    这篇文章主要为大家展示了“SEO中容易被忽视的细节分析有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SEO中容易被忽视的细节分析有哪些”这篇文章吧。第一,标签的应用,建设比较早的站容易出现...
    99+
    2023-06-13
  • 使用Dedecms中七个容易忽略的安全细节介绍
    随着cms的流行起来,越来越多的网友开始加入到个人站长的行业里,或许不少网友认为,只要买个域名,租个空间,随后解析域名,随后FTP上传程序,程序安装以后便可以发布内容了,发布内容了便开始到处做外链了,做外链了便是真正的站...
    99+
    2022-06-12
    dede细节 dedecms细节
  • 原生态Java 程序员容易忽视的编程细节有哪些
    今天就跟大家聊聊有关原生态Java 程序员容易忽视的编程细节有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是Java程序设计语言和Java平台的总称,要想学好一门语言,...
    99+
    2023-06-17
  • web开发中容易忽略的CSS特性有哪些
    web开发中容易忽略的CSS特性有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。大小写不敏感 虽然我们平时在写CSS的时候...
    99+
    2024-04-02
  • 前端开发中容易被忽略CSS特性有哪些
    这篇文章给大家分享的是有关前端开发中容易被忽略CSS特性有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。大小写不敏感虽然我们平时在写CSS的时候都是用小写,但其实CSS并不是...
    99+
    2024-04-02
  • 商城网站建设优化最容易忽略的问题有哪些
    这篇文章主要介绍了商城网站建设优化最容易忽略的问题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。第一、商城网站中的商品标题商城网站中的内容一般都是商品,每一个商品都会有...
    99+
    2023-06-10
  • Linux下容易被忽视的命令有哪些
    这篇文章给大家分享的是有关Linux下容易被忽视的命令有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言工作中发现很多同学对于Linux下的命令不太熟悉,尤其是一些功能强大的工具,使用者很少。正所谓工欲...
    99+
    2023-06-16
  • 企业网站在建设环节中容易忽视的问题有哪些
    本篇内容介绍了“企业网站在建设环节中容易忽视的问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  第一,定位问题。很多企业网站对于网...
    99+
    2023-06-10
  • Java编程中最容易忽略的10个常见问题分别有哪些
    本篇文章给大家分享的是有关Java编程中最容易忽略的10个常见问题分别有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在Java编码中,我们容易犯一些错误,也容易疏忽一些问...
    99+
    2023-06-17
  • 使Kubernetes变得更容易使用的工具有哪些
    这篇文章主要讲解了“使Kubernetes变得更容易使用的工具有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“使Kubernetes变得更容易使用的工具...
    99+
    2024-04-02
  • PHP 云端部署中的可用性和容错策略有哪些?
    提高 php 云端部署可用性和容错性的策略包括:加密传输:使用 ssl/tls 加密通信。冗余架构:创建应用程序的多个实例,并部署在不同区域。负载均衡:分发请求以提高可用性和性能。实时监...
    99+
    2024-05-06
    php 云端部署 加密通信 敏感数据
  • 云端部署 PHP 应用的成本优化策略有哪些?
    在云端部署 php 应用时,采用以下策略可优化成本:选择与应用负载匹配的实例类型(例如,轻量级应用使用共享型实例,资源密集型应用使用专用实例)。使用自动缩放根据流量自动调整实例数量。优化...
    99+
    2024-05-06
    php 云端部署 mysql
  • Go语言在容器化部署中的应用有哪些?
    随着容器技术的不断发展和普及,越来越多的企业开始将应用程序容器化部署。在这个过程中,Go语言作为一门轻量级、高效、并发性强的编程语言,受到了越来越多企业的青睐。本文将详细介绍Go语言在容器化部署中的应用。1.快速开发容器应用程序在容器化部署...
    99+
    2023-05-16
    应用 Go语言 容器化部署
  • 超好用的本地Kubernetes部署工具分别有哪些
    超好用的本地Kubernetes部署工具分别有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。探讨这个议题之前,我们要先来问一个问题是:我们本地开发者,真的需要一个 Kube...
    99+
    2023-06-15
  • 使用容器化技术部署 PHP 应用的优点有哪些?
    使用容器化技术部署 php 应用程序的优点包括:隔离和资源限制:为应用程序提供隔离环境,防止相互影响并设置资源限制。可移植性:docker 映像包含应用程序及其依赖项,可轻松在不同环境间...
    99+
    2024-05-06
    php 容器化 docker
  • 容易被忽视的Linux安全权限配置问题有哪些
    小编给大家分享一下容易被忽视的Linux安全权限配置问题有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、太宽的权限有些服务对权限的要求会是一个区间,小了不行,大了也不行。如果这个文件被赋予的权限不够,那么肯定不能使...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作