注册推特怎么改语言(怎么注册推特啊)
Kubernetes 作为大规模企业级应用容器编排的首推工具,其为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,本文作者 Marek Bartik 深入分享了 K8s 的避坑宝典,相信会对开发者们大有裨益。
译者 | 苏本如,责编 | 唐小引
头图 | CSDN 下载自 VCG
出品 | CSDN
以下为译文:
在我们多年使用 Kubernetes的经历中,我们有机会近距离接触了相当多的集群,并且看到一些错误在不断重复。但不必为此感到羞耻,因为我们也犯了很多这样的错误!
接下来,我会尽量解释那些我们经常犯的错误,并讨论如何修复它们。
资源 —— 请求和限制的设置
这无疑是蕞值得关注的,因而列在了这个错误榜单的弟一位。
设置 CPU request 的常见错误有两种 —— 「不设置」或「设置得很低」,这两种错误会导致节点被过量使用。在高需求的时候,节点的 CPU 就会被完全占用,我们的工作负载就只能得到“它所请求的很低的资源”,因此工作负载得到的 CPU 资源就很有限,这样就会导致应用程序延迟、超时等问题的增加。
不设置 CPU request时的配置如下:
resources: {}
CPU request 设置得很低生成临时 secret。
我们经常看到这样错误的用法:将访问权限和 secret key 硬编码到应用程序的配置中,当使用云 IAM 时,从来不轮换 secret。在合适的情况下,你应当使用 IAM 角色和服务帐户而不是 IAM Users。
跳过 kube2am,直接用于服务帐户的 IAM 角色。就像 Štěpán Vraný 在这篇博客文章[3]中所说的那样。
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-app-role
name: my-serviceaccount
namespace: default
上面的示例不是很难理解,不是吗?
另外,在不是必要时,千万不要将 admin 和 cluster-admin 的权限给予服务帐户或实例配置文件。这点做起来有点困难,尤其是在使用 K8s 的 RBAC 时,但是仍然值得努力。
POD 的自我反亲和性
运行某个部署的 pod 副本,当节点下线时,你发现所有副本都随之同时下线了。呵呵?所有副本竟然都是在一个节点上运行的吗?K8s 难道不应该有魔法,可以自动提供高可用性吗?!
你不能指望 K8s 调度器自动为你的 pod 强加一个反亲和性设置。相反,你应该明确地定义它们。
// omitted for brevity
labels:
app: zk
// omitted for brevity
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: \\\"app\\\"
operator: In
values:
- zk
topologyKey: \\\"kubernetes.io/hostname\\\"
你需要像上面这样设置 pod 的反亲和性,它将确保 pod 被调度到不同的节点上。
我们这里讨论的是在不同节点上的 pod 反亲和性,而不是不同可用区域的 pod 反亲和性。如果你真的需要高可用性,你应该更加深入地探讨这个话题。
没有 poddisruptionbudget
你是在 K8s 上运行生产环境的工作负载。你的节点和集群必须不时地升级或停用。而 PodDisruptionBudget就是一种被集群管理员和集群用户广泛用来确保服务质量的 API。
请确保你创建了 pdb,以避免由于节点停用过多而导致不必要的服务中断。
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: zookeeper
作为集群用户,你可以这样告诉集群管理员:“嘿,我这里有个 zookeeper 服务,不管你想做什么,我希望至少保证两个副本始终可用。”
关于这个话题,我在这篇博文中作了深入地讨论[4]。
共享集群中有更多租户或环境
K8s 命名空间不提供任何强隔离。
人们似乎期望,如果将非生产环境工作负载分离到一个命名空间,将生产环境工作负载分离到另一个命名空间,那么一个工作负载就永远不会影响另一个工作负载,这样就可以实现某种程度的公平性和隔离性,以便“物理地”分离数据平面中的工作负载,但是,实现这种程度地分离相当复杂。
如果你需要在同一集群中同时拥有这两种类型的工作负载,那么你将不得不承受这种复杂性。但是如果你不是非要这样做不可,并且拥有另一个集群对你来说相对便宜,那么蕞好将它们放在不同的集群中,以实现更高的隔离级别。
设置 externalTrafficPolicy 值为 Cluster
经常看到这种情况,所有的流量在集群内全部被路由到一个 NodePort 服务, K8s 服务默认将 externalTrafficPolicy:的值设为 Cluster。这意味着集群内的每个节点都打开该 NodePort 服务,这样你就可以使用任何一个节点和所需的服务通信。
通常,负责提供 NodePort 服务的实际 pod 只在这些节点的子集上运行。这意味着,如果你与一个没有运行 pod 的节点会话,它会将流量转发到另一个节点,从而导致额外的网络跳数和延迟的增加成本)。
将 K8s 服务的 externalTrafficPolicy 值设置为 Local 将不会导致在每个节点上打开该 NodePort 服务,它只会在 pod 实际运行的节点上打开。如果你使用一个能够对 endpoint 进行状态检查的外部负载平衡器,它就仅仅将流量发送到它应该发送到的节点,从而改进延迟、降低计算开肖和出口成本,并提高健全性。
很可能,你会将像 traefik 或 nginx-ingress-controller 之类的服务公开为 NodePort 类型,以便路由 http ingress 流量,这个设置可以大大减少此类请求的延迟。
这里有篇很棒的博客文章[5],深入探讨了 externalTrafficPolicy 各种设置以及它们的优点和缺点。
有状态集群以及过高地控制平面的压力
你从按名字调用你的服务器 Anton, HAL9000 和 Colossus,到为你的 K8s 节点生成随机 id,现在你开始按名字来调用集群了?
你知道你是如何开始使用 K8s 进行概念验证的,你将集群命名为“testing”,并且在生产环境中仍然使用这个名字。这样命名导致了每个人都害怕碰它吗?
Pet 集群并不容易管理,你可能需要考虑不时地删除你的集群,练习灾难恢复并管理好控制平面。害怕操作控制平面不是个好现象。Etcd 组件挂起?好吧,你有个大麻烦。
另一方面,对控制平面操作太多也不好。随着时间的推移,控制平面会越来越慢,可能的原因是,你要么创建了太多对象而不轮换其状态,要么不断地从 kube-api 中拚凑并编辑了大量内容。
另外,请查看你的 K8s 托管服务提供商承诺的 SLA/SLO 以及服务质量保障。你的提供商可能会保证控制平面的可用性,但不会保证让你满意的 p99 延迟。也就是说,你运行 kubectl get nodes 命令,只要该命令在 10 分钟执行完成并返回正确结果,你的服务提供商就仍然没有违反服务保证。
附送一个问题:使用 latest 标签
这是一个经典的问题。但是蕞近我发现自己不经常看到这种问题了,可能因为我们太多人都在这上面栽过跟头,所以我们不再使用:latest 这个标签了。
AWS ECR 现在支持标签不变性,这个很棒的特性绝对值得你去查看。
总结
不要指望一切都会自动进行,K8s 并非灵丹妙药。一个糟糕的应用程序始终是糟糕的应用程序,即使在 K8s 上也改变不了。稍不小心,你可能就会面对诸如太多复杂性,过高的压力,控制平面缓慢,没有灾难恢复策略等麻烦。不要对开箱即用的多租户设计和高可用性期望过高。花点时间思考如何让你的云应用成为原生应用。
查看 Henning 收集的这些关于 K8s 使用的失败故事[6],可以对你在将来避开这些错误有所帮助。
如果你看到有人在 K8s 使用上犯了不同于本文中的错误,请在 Twitter 上告诉我们!
[1] Optimizing Kubernetes Resource Requests/Limits for Cost-Efficiency and Latency – Highload++, https://www.slideshare.net/try_except_/optimizing-kubernetes-resource-requestslimits-for-costefficiency-and-latency-highload
[2] https://cloud.google.com/kubernetes-engine/docs/concepts/verticalpodautoscaler
[3] https://blog.pipetail.io/posts/2020-04-13-more-eks-tips/
[4] https://blog.marekbartik.com/posts/2018-06-29_kubernetes-in-production-poddisruptionbudget/
[5] https://www.asykim.com/blog/deep-dive-into-kubernetes-external-traffic-policies
[6] https://k8s.af/
【作者自我简介】Marek Bartik,一名 NoOps/NoCode 的坚定支持者。在攻读“计算机系统和网络”硕士学位时开始从事 C++编程工作。在 SysAdmin 年代长大的我很快意识到沟通和协作的重要性。现在我专注于云架构、微服务和 Continuous Everything 来解决业务问题,而非技术问题。我热爱旅行,并且是极简主义,DevOps 和云原生的大力倡导者。
英文:10 most common mistakes using Kubernetes
链接:https://blog.pipetail.io/posts/2020-05-04-most-common-mistakes-k8s/
翻译:苏本如,责编:唐小引
☞华为全球分析师大会:HMS Core全球开发者应用集成的数量加速增长,打造全场景智慧体验
☞腾讯人均月薪 8 万,恍恍惚惚,又被平均了?
☞200 万年薪请不到!清华姚班到底有多牛?| 原力计划
☞量子计算与AI“双拳”出击,他们锁定38种潜在抗艺药物
☞我们已经不用AOP做操作日志了!| 原力计划
☞国外这三位帅小伙,居然搞了个用比特币付款、无人机运送的水培沙拉项目?
海外精品引流脚本–最强海外引流
唯一TG:https://t.me/Facebook181818
更多海外引流脚本方案
如果你需要脚本演示、部署咨询或海外获客方案,可以通过下面入口继续查看。
