前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >11 个常见 K8S 避雷指南详解

11 个常见 K8S 避雷指南详解

作者头像
我的小碗汤
发布于 2024-04-19 10:54:01
发布于 2024-04-19 10:54:01
39800
代码可运行
举报
文章被收录于专栏:我的小碗汤我的小碗汤
运行总次数:0
代码可运行

作者|Seifeddine Rajhi

翻译|Seal软件

链接|https://t.cn/A6TjHd91

简介

Kubernetes 是一套功能强大的工具,可用于管理自动可扩展、高可用性的分布式云原生应用程序,但很多人都会犯一些常见错误。

在本文中,我们将探讨使用 Kubernetes 时最常见的一些误区,并提供如何避免这些误区的提示。

不设置资源请求

这绝对是最值得关注的问题之一。CPU 请求通常要么未设置,要么设置得很低(这样我们就能在每个节点上安装大量 pod),从而导致节点超负荷运行。在需求量大的时候,节点的 CPU 会被充分利用,而我们的工作负载只能获得 “它所要求的”,因此 CPU 会被节流,导致应用程序延迟增加、超时等

以下是一些示例情况,请不要轻易尝试:

BestEffort

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resources: {}

CPU 性能极低

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resources:
      requests:
        cpu: "1m"

另一方面,即使节点的 CPU 没有被充分利用,CPU 限制也会不必要地限制 pod 的运行,这同样会导致延迟增加。

关于 Linux 内核中的 CPU CFS 配额和基于 CPU 设置的 CPU 节流以及关闭 CFS 配额的问题,有一个公开的讨论, 即 CPU 限制可能导致更多问题,而不是解决问题

因此,不要过度占用内存,并使用保证 QoS(服务质量)将内存请求设置为等于限制,就像下面的例子一样。

Burstable(更有可能经常被 OOMkilled)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    resources:
      requests:
        memory: "128Mi"
        cpu: "500m"
      limits:
        memory: "256Mi"
        cpu: 2

Guaranteed

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   resources:
      requests:
        memory: "128Mi"
        cpu: 2
      limits:
        memory: "128Mi"
        cpu: 2

那么,在设置资源时,有什么可以帮助您呢?

您可以使用 metrics-server,查看 pod(以及其中的容器)当前的 CPU 和内存使用情况。您很可能已经在运行它了。只需运行以下命令即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl top pods 
kubectl top pods --containers 
kubectl top nodes

不过,这些显示的只是当前的使用情况。虽然可以大致了解数字,但您最终还是希望及时看到这些使用指标(比如助于解决以下问题:在高峰期、昨天早上等时间段的 CPU 使用率是多少)。为此,您可以使用 Prometheus、DataDog 和其他许多工具。它们只需从指标服务器摄取指标并存储起来,然后就可以查询和绘制图表了。

VerticalPodAutoscaler 可以帮助您将这一手动过程自动化——及时查看 CPU/内存使用情况,并根据这些情况重新设置新的请求和限制

省略健康检查

将服务部署到 Kubernetes 时,健康检查在维护服务方面发挥着重要作用。在 Kubernetes 环境中,健康检查的利用率非常低。通过健康检查,您可以密切关注 pod 及其容器的健康状况。

Kubernetes 有三种主要工具可用于健康检查:

  • 配置存活检查(Liveness Check)允许 Kubernetes 检查应用程序是否存活。每个节点上运行的 Kubelet 代理都会使用存活探针来确保容器按预期运行。
  • 就绪检查 (Readiness Checks) 在容器的整个生命周期内运行。Kubernetes 使用该探针了解容器何时准备好接受流量。
  • 启动探针(Startup Probe)确定容器应用何时成功启动。如果启动检查失败,就会重新启动 pod。

使用 latest 标签

latest 标签普遍没有说明性,难以使用。关于在生产环境中使用 docker 镜像:latest 标签,Kubernetes 文档说得很清楚:

在生产环境中部署容器时,应避免使用 :latest 标签,因为它很难跟踪运行的是哪个版本的镜像,也很难回滚。

我觉得最近我们已经很少看到这种情况了,因为我们中的很多人都经历过这种情况很多次,所以我们不再使用 :latest 了,每个人都开始有了固定版本。

权限过高的容器

过度授权的容器是指被赋予过多权限的容器,如访问普通容器无法访问的资源。这是开发人员在使用 Kubernetes 时常犯的错误,而且会带来安全风险。

例如,在 Docker 容器内运行 Docker 守护进程就是特权容器的一个例子,它不一定安全。为了避免这种情况,建议避免为容器赋予 CAP_SYS_ADMIN 能力,因为它占所有内核漏洞的 25% 以上。

此外,避免赋予容器完全权限和赋予容器的主机文件系统权限也很重要。这意味着可以利用容器替换恶意二进制文件,从而入侵整个主机。

为防止容器权限过高,必须仔细配置权限设置,切勿以高于所需的权限运行进程。并且,使用监控和日志来检测和解决问题也很重要。

缺乏监控和日志记录

Kubernetes 环境中缺乏监控和日志记录会对其安全性和整体性能造成损害。日志记录和监控不足会给事件调查和响应工作带来挑战,从而难以有效地发现和解决问题。

一个常见的陷阱是,由于缺乏相关日志或指标,无法找到 Kubernetes 平台和应用程序中的故障点

要解决这个问题,必须设置适当的监控和日志工具,如 Prometheus、Grafana、Fluentd 和 Jaeger,以收集、分析和可视化指标、日志和跟踪,深入了解 Kubernetes 环境的性能和健康状况。

通过实施强大的监控和日志记录实践,企业可以有效地关联信息,获得更深入的见解,并克服与 Kubernetes 环境的动态和复杂性相关的挑战。

所有对象的默认命名空间

对 Kubernetes 中的所有对象使用默认命名空间会带来组织和管理方面的挑战。default 命名空间是默认创建服务和应用程序的地方,除非明确指定,否则它也是活动命名空间。

完全依赖默认命名空间会导致集群内的不同组件或团队缺乏隔离和组织。这会导致资源管理、访问控制和可见性方面的困难。为避免这种情况,建议为不同项目、团队或应用程序创建自定义命名空间,以便在 Kubernetes 集群内实现更好的组织、资源分配和访问控制。

通过利用多个命名空间,用户可以有效地划分和管理资源,提高 Kubernetes 环境的整体运行效率和安全性

缺少安全配置

部署应用程序时,应始终牢记安全性。那么,在安全方面有哪些最重要的事项需要考虑呢?例如,使用集群外部可访问的端点、不保护机密、不考虑如何安全运行有权限的容器等。

Kubernetes 安全是任何 Kubernetes 部署不可或缺的一部分。安全挑战包括:

  • 授权身份验证和授权对于控制 Kubernetes 集群中的资源访问至关重要。
  • 网络:Kubernetes 网络涉及管理覆盖网络和服务端点,以确保容器之间的流量在集群内安全路由
  • 存储:集群中存储的安全包括确保数据不会被未经授权的用户或进程访问,并确保数据安全

Kubernetes API 服务器有一个 REST 接口,可访问存储的所有信息。这意味着,用户只需向 API 发送 HTTP 请求,即可访问 API 中存储的任何信息。为防止未经身份验证的用户访问这些数据,您需要使用用户名/密码或基于令牌的身份验证等支持的方法为 API 服务器配置身份验证。

这不仅关系到集群本身的安全,还关系到集群上的机密和配置的安全。为了保护集群免受漏洞攻击,您需要在集群上配置一套安全控制。

使用基于角色的访问控制(RBAC)来保护 Kubernetes 集群就是这样一种强大的安全控制:基于角色的访问控制可用于保护 Kubernetes 集群的安全,方法是根据分配给用户的角色限制对资源的访问。这些角色可以配置为 “管理员”或 “操作员”。

管理员角色拥有完整的访问权限,而操作员角色对集群内的资源拥有有限的权限。通过这种方式,我们可以控制和管理访问集群的任何人。

缺少 poddisruptionbudget

您在 kubernetes 上运行生产工作负载。您的节点和集群时常需要升级或退役。PodDisruptionBudget (pdb) 是集群管理员和集群用户之间的服务保证 API。

请务必创建 pdb,以避免因节点耗尽而造成不必要的服务中断。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: db-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: database

这样, 作为集群用户,您可以告诉集群管理员,无论您要做什么都希望至少有两个副本始终可用。

pod 的自我防瘫痪功能

例如,当运行某个部署的 3 个 pod 副本时,节点宕机,所有副本也会随之宕机。为什么?

这是因为,您不能指望 Kubernetes 调度器为您的 pod 强制执行 anti-affinite。您必须明确定义它们。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
......
      labels:
        app: db
......
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                    - db
              topologyKey: "kubernetes.io/hostname"

就是这样。这将确保 pod 被调度到不同的节点上(仅在调度时检查,而不是在执行时,因此 requiredDuringSchedulingIgnoredDuringExecution)。

我们说的是不同节点名称上的 podAntiAffinity 而不是不同的可用性区域,即 topologyKey:"kubernetes.io/hostname。如果您真的需要适当的 HA,请深入了解这一主题。

每个 HTTP 服务的负载均衡

您的集群中可能有更多的 HTTP 服务,而您希望将这些服务对外公开。

如果您将 kubernetes 服务作为 type:LoadBalancer 公开,其控制器(特定于供应商)将提供并调节外部 LoadBalancer,而这些资源可能会变得昂贵(外部静态 IPv4 地址、按秒计价......),因为您需要创建很多这样的资源。

在这种情况下,共享一个外部负载均衡可能更有意义,您可以将您的服务作为 type:NodePort 公开。或者,部署类似 nginx-ingress-controller(或 traefik 或 Istio)的东西,将其作为暴露给外部负载平衡器的单一 NodePort 端点,并根据 kubernetes ingress 资源在集群中路由流量。

集群内其他相互对话的(微)服务可通过 ClusterIP 服务和开箱即用的 DNS 服务发现进行对话

注意:不要使用他们的公共 DNS/IP,因为这可能会影响他们的延迟和云成本。

未感知集群自动扩展

在集群中添加和移除节点时,不应考虑一些简单的指标,如这些节点的 CPU 利用率。在调度 pod 时,您需要根据大量调度约束条件(如 pod 和节点亲和性、污点和容忍度、资源请求、QoS 等)来做出决定。如果外部自动调度器不了解这些约束条件,可能会造成麻烦。

试想一下,有一个新的 pod 需要调度,但所有可用的 CPU 都被请求了,该 pod 被卡在待定状态。外部自动调节器会看到当前使用的 CPU 平均值(未请求),因此不会扩展(不会添加另一个节点)。pod 无法调度。

向内扩展(从集群中移除一个节点)总是比较困难。假设您有一个有状态的 pod(附加了持久卷),由于持久卷通常是属于特定可用性区域的资源,不会在区域内复制,因此您自定义的 autoscaler 会移除带有此 pod 的节点,而调度器无法将其调度到其他节点上,因为它受到唯一带有持久磁盘的可用性区域的限制。pod 再次卡在待处理状态。

总结

总之,Kubernetes 是管理容器化应用程序的强大工具,但它也有自己的一系列挑战。要避免常见错误和陷阱,必须密切关注与 Kubernetes 的交互,并了解它与已部署服务的交互方式之间的差异。

不要指望一切都能自动运行,要投入一些时间让您的应用程序成为云原生的。通过避免这些错误,您可以高效地进行 Kubernetes 部署,并提高 Kubernetes 环境的稳定性、性能和安全性。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
TensorFlow和Pytorch中的音频增强
来源:Deephub Imba本文约2100字,建议阅读9分钟本文将介绍如何将增强应用到 TensorFlow 中的数据集的两种方法。 对于图像相关的任务,对图像进行旋转、模糊或调整大小是常见的数据增强的方法。因为图像的自身属性与其他数据类型数据增强相比,图像的数据增强是非常直观的,我们只需要查看图像就可以看到特定图像是如何转换的,并且使用肉眼就能对效果有一个初步的评判结果。尽管增强在图像域中很常见,但在其他的领域中也是可以进行数据增强的操作的,本篇文章将介绍音频方向的数据增强方法。 在这篇文章中,将介绍
数据派THU
2022/04/11
1.2K0
TensorFlow和Pytorch中的音频增强
使用深度学习进行音频分类的端到端示例和解释
声音分类是音频深度学习中应用最广泛的方法之一。它包括学习对声音进行分类并预测声音的类别。这类问题可以应用到许多实际场景中,例如,对音乐片段进行分类以识别音乐类型,或通过一组扬声器对短话语进行分类以根据声音识别说话人。
deephub
2021/03/25
1.3K0
使用深度学习进行音频分类的端到端示例和解释
基于Tensorflow实现声音分类
本章我们来介绍如何使用Tensorflow训练一个区分不同音频的分类模型,例如你有这样一个需求,需要根据不同的鸟叫声识别是什么种类的鸟,这时你就可以使用这个方法来实现你的需求了。话不多说,来干。
夜雨飘零
2020/05/01
4K1
使用Tensorflow实现声纹识别
本章介绍如何使用Tensorflow实现简单的声纹识别模型,首先你需要熟悉音频分类,没有了解的可以查看这篇文章《基于Tensorflow实现声音分类》。基于这个知识基础之上,我们训练一个声纹识别模型,通过这个模型我们可以识别说话的人是谁,可以应用在一些需要音频验证的项目。
夜雨飘零
2020/06/02
6K0
基于Pytorch实现的声音分类
本章我们来介绍如何使用Pytorch训练一个区分不同音频的分类模型,例如你有这样一个需求,需要根据不同的鸟叫声识别是什么种类的鸟,这时你就可以使用这个方法来实现你的需求了。
夜雨飘零
2021/12/07
2.7K0
基于Pytorch实现的EcapaTdnn声纹识别模型
本项目使用了EcapaTdnn模型实现的声纹识别,不排除以后会支持更多模型,同时本项目也支持了多种数据预处理方法,损失函数参考了人脸识别项目的做法PaddlePaddle-MobileFaceNets ,使用了ArcFace Loss,ArcFace loss:Additive Angular Margin Loss(加性角度间隔损失函数),对特征向量和权重归一化,对θ加上角度间隔m,角度间隔比余弦间隔在对角度的影响更加直接。
夜雨飘零
2022/05/10
3K0
基于Pytorch实现的EcapaTdnn声纹识别模型
利用 AssemblyAI 在 PyTorch 中建立端到端的语音识别模型
这篇文章是由AssemblyAI的机器学习研究工程师Michael Nguyen撰写的。AssemblyAI使用Comet记录、可视化和了解模型开发流程。
AI科技大本营
2020/06/16
1.6K0
音频数据建模全流程代码示例:通过讲话人的声音进行年龄预测
大多数人都熟悉如何在图像、文本或表格数据上运行数据科学项目。但处理音频数据的样例非常的少见。在本文中,将介绍如何在机器学习的帮助下准备、探索和分析音频数据。简而言之:与其他的形式(例如文本或图像)类似我们需要将音频数据转换为机器可识别的格式。
deephub
2022/03/12
1.9K0
音频数据建模全流程代码示例:通过讲话人的声音进行年龄预测
使用 FastAI 和即时频率变换进行音频分类
目前深度学习模型能处理许多不同类型的问题,对于一些教程或框架用图像分类举例是一种流行的做法,常常作为类似“hello, world” 那样的引例。FastAI 是一个构建在 PyTorch 之上的高级库,用这个库进行图像分类非常容易,其中有一个仅用四行代码就可训练精准模型的例子。随着v1版的发布,该版本中带有一个data_block的API,它允许用户灵活地简化数据加载过程。今年夏天我参加了Kaggle举办的Freesound General-Purpose Audio Tagging 竞赛,后来我决定调整其中一些代码,利用fastai的便利做音频分类。本文将简要介绍如何用Python处理音频文件,然后给出创建频谱图像(spectrogram images)的一些背景知识,示范一下如何在事先不生成图像的情况下使用预训练图像模型。
AI研习社
2019/05/15
1.9K0
基于Pytorch实现的语音情感识别
在语音情感识别中,我首先考虑的是语音的数据预处理,按照声音分类的做法,本人一开始使用的是声谱图和梅尔频谱。声谱图和梅尔频谱这两种数据预处理在声音分类中有着非常好的效果,具体的预处理方式如下,但是效果不佳,所以改成本项目使用的预处理方式,这个种预处理方式是使用多种处理方式合并在一起的。
夜雨飘零
2022/09/07
2.3K0
使用Python实现深度学习模型:语音合成与语音转换
语音合成和语音转换是语音处理中的重要任务,广泛应用于语音助手、语音导航、语音翻译等领域。通过使用Python和深度学习技术,我们可以构建一个简单的语音合成与语音转换系统。本文将介绍如何使用Python实现这些功能,并提供详细的代码示例。
Echo_Wish
2024/07/19
3160
使用Python实现深度学习模型:语音合成与语音转换
应用深度学习使用 Tensorflow 对音频进行分类
原文链接 / https://pub.towardsai.net/a-gentle-introduction-to-audio-classification-with-tensorflow-c469cb0be6f5
LiveVideoStack
2021/07/12
1.7K0
基于PaddlePaddle实现声音分类
本章我们来介绍如何使用PaddlePaddle训练一个区分不同音频的分类模型,例如你有这样一个需求,需要根据不同的鸟叫声识别是什么种类的鸟,这时你就可以使用这个方法来实现你的需求了。
夜雨飘零
2020/05/01
2K0
音频数据建模全流程代码示例:通过讲话人的声音进行年龄预测
来源:DeepHub IMBA本文约6100字,建议阅读10+分钟本文展示了从EDA、音频预处理到特征工程和数据建模的完整源代码演示。 大多数人都熟悉如何在图像、文本或表格数据上运行数据科学项目。但处理音频数据的样例非常的少见。在本文中,将介绍如何在机器学习的帮助下准备、探索和分析音频数据。简而言之:与其他的形式(例如文本或图像)类似我们需要将音频数据转换为机器可识别的格式。 音频数据的有趣之处在于您可以将其视为多种不同的模式: 可以提取高级特征并分析表格数据等数据。 可以计算频率图并分析图像数据等数据。
数据派THU
2022/03/08
1.2K0
librosa音频处理教程
Librosa是一个 Python 模块,用于分析一般的音频信号,是一个非常强大的python语音信号处理的第三方库,根据网络资料以及官方教程,本文主要总结了一些重要且常用的功能。
致Great
2022/05/13
4.4K0
librosa音频处理教程
基于Tensorflow2实现的中文声纹识别
本章介绍如何使用Tensorflow实现简单的声纹识别模型,首先你需要熟悉音频分类,没有了解的可以查看这篇文章《基于Tensorflow实现声音分类》 。基于这个知识基础之上,我们训练一个声纹识别模型,通过这个模型我们可以识别说话的人是谁,可以应用在一些需要音频验证的项目。不同的是本项目使用了ArcFace Loss,ArcFace loss:Additive Angular Margin Loss(加性角度间隔损失函数),对特征向量和权重归一化,对θ加上角度间隔m,角度间隔比余弦间隔在对角度的影响更加直接。
夜雨飘零
2021/12/07
1.4K0
librosa怎么安装_librosa保存音频
Librosa是一个用于音频、音乐分析、处理的python工具包,一些常见的时频处理、特征提取、绘制声音图形等功能应有尽有,功能十分强大。本文主要介绍librosa的安装与使用方法。
全栈程序员站长
2022/11/03
1.9K0
歌声合成相关的数据集
GTZAN数据集是一个非常流行的音乐数据集,包含10个音乐流派,每个流派有100首30秒的音频片段。
AI拉呱
2024/06/06
4130
人工智能下的音频还能这样玩!!!!
Librosa是一个用于音频、音乐分析、处理的python工具包,一些常见的时频处理、特征提取、绘制声音图形等功能应有尽有,功能十分强大。本文主要介绍librosa的安装与使用方法。
Python研究者
2021/08/21
1.6K0
使用 PyTorch 进行音频信号处理的数据操作和转换
torchaudio 的目标是将PyTorch应用到音频领域。通过支持 PyTorch,torchaudio 遵循相同的理念,即提供强大的 GPU 加速,通过 autograd 系统专注于可训练的特征,并具有一致的风格(张量名称和维度名称)。因此,它主要是一个机器学习库,而不是一个通用的信号处理库。PyTorch 的好处可以在 torchaudio 中看到,因为所有计算都通过 PyTorch 操作进行,这使得它易于使用并且感觉像是一个自然的扩展。
海拥
2022/09/29
3.3K0
推荐阅读
相关推荐
TensorFlow和Pytorch中的音频增强
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档