您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

Kubernetes 可扩展性简介

时间:2022-09-21 10:49:07  来源:  作者:qaseven
了解有关 Kube.NETes 可扩展性的更多信息。

 

Kubernetes 提供了很多好处:拥有大量参与者、自我修复能力等的巨大生态系统。不过,没有免费的午餐。它也有缺点,其中最主要的是它的复杂性和运营成本。

但是,我使用 Kubernetes 的次数越多,我就越认为它最重要的资产是可扩展性。如果您需要平台默认不提供的东西,可以选择自己开发并集成它。在这篇文章中,我想列出这些扩展点。

 

Kubernetes 101

 

很多关于 Kubernetes 的解释都集中在架构上。我相信他们进入了太多细节而错过了大局。在这里,我只想强调基本概念。

在最基本的层面上,Kubernetes 只是一个能够运行容器镜像的平台。它将其配置存储在分布式存储引擎中,etcd. 此配置的最重要部分专用于对象的所需状态。例如,您仅在使用kubectl命令行调度 pod 时才更新此状态。

称为控制器的其他组件监视配置更改并读取所需的状态。然后,他们尝试使期望状态与实际状态相协调。这没有什么革命性的:Puppet 基于相同的控制回路方法,而 AFAIK,Chef。通常,控制器管理单一类型的对象,例如管理DeploymentController部署。

制作通用工具背后的想法是遵循帕累托定律:用 20% 的努力解决 80% 的问题。不幸的是,工具越通用,用户群越广泛,定制剩余 20% 的工作量就越大。

Kubernetes 设计人员将此问题视为广泛采用的最关键障碍。因此,Kubernetes 提供了许多扩展点。

 

可扩展模型

 

在上面的部分中,我提到了调度一个 pod。Pod 是 Kubernetes 开箱即用的众多对象之一。其他对象包括部署、作业、服务等。

一些解决方案很容易适合这个模型。例如,可以轻松创建三个 Hazelcast pod 的部署。它开箱即用:Pod 将通过网络进行多播、找到彼此并形成一个集群。

其他解决方案不是那么均匀。在KIP-500之前,Kafka 将依赖 Zookeeper。At cluster 由至少三个 Zookeeper 节点和所需数量的 Kafka 节点组成。Kubernetes 使得在同一个 pod 上部署多个镜像成为可能。然而,如果所有必需的组件都在同一个 pod 上,而 pod 出现故障,那它就等于没有。我们应该将一个常规组件映射到一个 pod。

在这种情况下,我们需要一个功能齐全的 Kubernetes 清单来描述架构。由于要求不同,我们需要使其可配置。Kubernetes 的生态系统提供了多种解决方案来解决这个问题:Kustomize和Helm count 是最流行的解决方案之一。但两者都不能在所需的抽象级别上工作,即 Kafka 集群。

因此,Kubernetes 允许设计一个新Kafka对象。这种自定义对象称为CRD。这是一个简单的任意Foo对象的示例:

apiVersion: apiextensions.k8s.io/v1 #1
kind: CustomResourceDefinition
metadata:
name: foos.frankel.ch #2
spec:
group: frankel.ch #3
names:
plural: foos #4
singular: foo #5
kind: Foo #6
scope: Namespaced #7
versions:
- name: v1alpha1
served: true #8
storage: true #9
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
bar:
type: string
required: ["bar"]
required: ["spec"]

 

  1. 必需的标头
  2. 符合以下.
  3. REST API 的组名 -/apis//
  4. REST API 的复数名称 -/apis///
  5. 用于 CLI 和显示的单数名称
  6. 在清单中使用
  7. 可以是Cluster或Namespaced。一个Cluster资源在集群范围内声明,每个集群可以有一个资源;Namespaced资源可以是多个,并且需要在一个命名空间下;默认,default
  8. 可以启用/禁用一个版本
  9. 最新版本必须标记为存储版本

 

应用此清单后,您可以管理您的Foo. 让我们创建一个清单来创建一个新Foo对象。

apiVersion: foos.frankel.ch/v1alpha1
kind: Foo
metadata:
name: myfoo
spec:
bar: "whatever"

kubectl Apply -f foo.yml
kubectl get foo

上面的命令已经用新Foo类型更新了数据模型并创建了一个Foo对象。但实际上,我们只是etcd通过 Kubernetes API 存储数据。在我们启动一个控制器来监视新对象并对其进行操作之前,什么都不会发生。请注意,管理 CRD 的控制器的名称是operator。

 

可扩展验证

 

可以运行第三方工作负载的平台的一个常见问题是只允许经过审查的工作负载。一些工作负载可能会消耗过多的资源;其他人可能是恶意的。

这里有两个具体的场景:

 

  1. 作为集群操作员,您希望管理集群的有限物理资源(CPU/内存)并在所有 pod 之间共享它们。为此,您希望强制每个 pod 描述其资源需求。开发人员通过设置request和limits属性来实现这一点。您想禁止没有它们的 pod。
  2. 作为具有安全意识的操作员,您希望防止特权升级。它不应该改变 pod 的最终行为。您想将 添加allowPrivilegeEscalation=false到每个 pod。

 

虽然可以通过“构建”管道管理这两种情况,但 Kubernetes 提供了一种开箱即用的解决方案。

正如我上面解释的,Kubernetes 存储配置是etcd在控制器观察变化并对其采取行动的时候。为了防止不需要的行为,最安全的方法是验证更改配置的有效负载;这是准入控制器的角色。

 

准入控制器是一段代码,它在对象持久化之前截取对 Kubernetes API 服务器的请求,但在请求经过身份验证和授权之后。控制器由以下列表组成,被编译成 kube-apiserver 二进制文件,并且只能由集群管理员配置。在该列表中,有两个特殊的控制器:MutatingAdmissionWebhook和ValidatingAdmissionWebhook. 它们执行在 API 中配置的变异和验证(分别)准入控制 webhook。
--使用准入控制器

 

简而言之,有两种准入控制器可用:

 

  1. 验证准入 webhook 允许/阻止请求更改状态
  2. mutating admission webhook 改变了请求

 

它们按照下图依次运行:

从Kubernetes 准入控制器指南

每个都可以解决上面突出显示的场景。

 

可扩展的客户端功能

 

在最基本的层面上,kubectl命令行是 REST 客户端的高级抽象。您可以通过设置详细选项来验证它:

kubectl get pods --v=8

:http://kubernetes.io/docs/user-guide/identifiers#names","优先级":0},loader.go:372] Config loaded from file: /Users/nico/.kube/config

round_trippers.go:463] GET https://127.0.0.1:61378/api/v1/namespaces/default/pods?limit=500
round_trippers.go:469] Request Headers:
round_trippers.go:473] Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json
round_trippers.go:473] User-Agent: kubectl/v1.24.2 (darwin/arm64) kubernetes/f66044f
round_trippers.go:574] Response Status: 200 OK in 8 milliseconds
round_trippers.go:577] Response Headers:
round_trippers.go:580] Cache-Control: no-cache, private
round_trippers.go:580] Content-Type: application/json
round_trippers.go:580] X-Kubernetes-Pf-Flowschema-Uid: 479e2d49-7b9f-4e4c-8fca-63c273cfb525
round_trippers.go:580] X-Kubernetes-Pf-Prioritylevel-Uid: 4787583d-e7d4-4679-a474-ebb66919a43c
round_trippers.go:580] Date: Sun, 04 Sep 2022 09:32:39 GMT
round_trippers.go:580] Audit-Id: 2f2f163d-fb6d-4149-ba44-ecf4395028aa
request.go:1073] Response Body: {"kind":"Table","apiVersion":"meta.k8s.io/v1","metadata":{"resourceVersion":"263411"},"columnDefinitions":[{"name":"Name","type":"string","format":"name","description":"Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names","priority":0},{"name":"Ready","type":"string","format":"","description":"The aggregate readiness state of this pod for accepting traffic.","priority":0},{"name":"Status","type":"string","format":"","description":"The aggregate status of the containers in this pod.","priority":0},{"name":"Restarts","type":"string","format":"","description":"The number of times the containers in this pod have been restarted and when the last container in this pod has restarted.","priority":0},{"name":"Age","type":"st [truncated 6465 chars]

Kubernetes 的 REST API(大部分?)基于CRUD操作。有时,您需要运行多个命令才能获得所需的结果。例如,我们想查询哪些主体可以执行一个动作。

kubectl包括一种编写代码来编排这些调用的机制。该机制与 Gits 非常相似:

 

  1. 您根据特定格式编写代码 -插件
  2. 你在你的PATH变量中设置它

 

从这一点,kubectl可以发现它。

你可以在你的机器上管理你的插件,但这种方法不能扩展到整个组织。解决方案是插件管理器。认识Krew:

 

Krew 是kubectl命令行工具的插件管理器。
Krew帮助您:
  1. 发现kubectl插件,
  2. 将它们安装在您的机器上,
  3. 并保持安装的插件是最新的。
——Krew是什么?

 

关于哪些主体可以执行一个动作,这里是如何做到的:

brew install krew #1
kubectl krew completion #2
# follow instructions to update your shell
kubectl krew update #3
kubectl krew install who-can #4
k who-can watch pod #5

 

  1. brew在 mac 上安装
  2. 显示自动完成指令
  3. 更新缓存的插件列表
  4. 安装who-can克鲁插件
  5. 享受!

 

No subjects found with permissions to watch pod assigned through RoleBindings
CLUSTERROLEBINDING SUBJECT TYPE SA-NAMESPACE
apisix-clusterrolebinding apisix-ingress-controller ServiceAccount ingress-apisix
cluster-admin system:masters Group
local-path-provisioner-bind local-path-provisioner-service-account ServiceAccount local-path-storage
system:controller:attachdetach-controller attachdetach-controller ServiceAccount kube-system
system:controller:daemon-set-controller daemon-set-controller ServiceAccount kube-system
system:controller:deployment-controller deployment-controller ServiceAccount kube-system
system:controller:endpoint-controller endpoint-controller ServiceAccount kube-system
system:controller:endpointslice-controller endpointslice-controller ServiceAccount kube-system
system:controller:ephemeral-volume-controller ephemeral-volume-controller ServiceAccount kube-system
system:controller:generic-garbage-collector generic-garbage-collector ServiceAccount kube-system
system:controller:job-controller job-controller ServiceAccount kube-system
system:controller:persistent-volume-binder persistent-volume-binder ServiceAccount kube-system
system:controller:pod-garbage-collector pod-garbage-collector ServiceAccount kube-system
system:controller:pvc-protection-controller pvc-protection-controller ServiceAccount kube-system
system:controller:replicaset-controller replicaset-controller ServiceAccount kube-system
system:controller:replication-controller replication-controller ServiceAccount kube-system
system:controller:resourcequota-controller resourcequota-controller ServiceAccount kube-system
system:controller:statefulset-controller statefulset-controller ServiceAccount kube-system
system:coreDNS coredns ServiceAccount kube-system
system:kube-controller-manager system:kube-controller-manager User
system:kube-scheduler system:kube-scheduler User

 

结论

 

在这篇文章中,我们浏览了 Kubernetes 中的几个扩展点:数据模型、准入控制器和客户端。这是一个非常简短的介绍,无论是宽度还是深度。然而,我希望它为进一步的研究提供了一个很好的切入点。



Tags:Kubernetes   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  Search: Kubernetes  点击:(6)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  Search: Kubernetes  点击:(17)  评论:(0)  加入收藏
聊聊 Kubernetes 网络模型综合指南
这篇详细的博文探讨了 Kubernetes 网络的复杂性,提供了关于如何在容器化环境中确保高效和安全通信的见解。译自Navigating the Network: A Comprehensive Guide to Kubernete...【详细内容】
2024-02-19  Search: Kubernetes  点击:(39)  评论:(0)  加入收藏
Kubernetes是什么?主要特点是什么?
Kubernetes是什么?Kubernetes,也称为K8s,是一个开源的容器编排系统,由Google首次开发和维护。它允许容器化的应用程序在集群中自动部署、扩展和管理。Kubernetes提供了一种容器...【详细内容】
2024-02-01  Search: Kubernetes  点击:(161)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  Search: Kubernetes  点击:(51)  评论:(0)  加入收藏
Kubernetes Informer基本原理,你明白了吗?
本文分析 k8s controller 中 informer 启动的基本流程不论是 k8s 自身组件,还是自己编写 controller,都需要通过 apiserver 监听 etcd 事件来完成自己的控制循环逻辑。如何高...【详细内容】
2024-01-30  Search: Kubernetes  点击:(40)  评论:(0)  加入收藏
Kubernetes 100个常用命令!
这篇文章是关于使用 Kubectl 进行 Kubernetes 诊断的指南。列出了 100 个 Kubectl 命令,这些命令对于诊断 Kubernetes 集群中的问题非常有用。这些问题包括但不限于:• 集...【详细内容】
2024-01-03  Search: Kubernetes  点击:(78)  评论:(0)  加入收藏
一文读懂Kubernetes部署策略
在这篇文章中,我们将深入研究 Kubernetes 部署概念和一些常见策略,了解每种策略的优缺点。合适的部署策略使我们能够在发布应用程序时最大限度地减少停机时间、增强客户体验并...【详细内容】
2024-01-03  Search: Kubernetes  点击:(60)  评论:(0)  加入收藏
从Kubernetes的探针到DevOps
今天在群里又看有人问如何设置 Kubernetes 的探针,感觉要补充的话太多了,结合我们在一些 DevOps 项目中痛苦的体验,今天一劳永逸的全部说完,此外,也为大家展现一下为什么 DevOps...【详细内容】
2023-12-27  Search: Kubernetes  点击:(117)  评论:(0)  加入收藏
如何基于Kubernetes运行Nacos高可用集群
Nacos(Namings and Configuration Management)是阿里巴巴开源的一个易于构建云原生应用的动态服务发现、配置管理和服务管理平台。以下是Nacos的一些主要功能和特点: 服务发现...【详细内容】
2023-12-18  Search: Kubernetes  点击:(70)  评论:(0)  加入收藏
▌简易百科推荐
Docker 和传统虚拟机有什么区别?
我有一个程序员朋友,他每年情人节都要送女朋友一台服务器。他说:“谁不想在过节当天收到一台 4核8g 的服务器呢?”“万一对方不要,我还能留着自己用。” 给他一次过节的机会,他能...【详细内容】
2024-03-26  小白debug  微信公众号  Tags:Docker   点击:(12)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22    51CTO  Tags:Docker   点击:(11)  评论:(0)  加入收藏
Containerd容器管理
Nginx 指定容器名称 使用 ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。容器基本操作容器基本操作主要是 ctr image 命令,查看命令帮...【详细内容】
2024-03-20  云原生运维圈  微信公众号  Tags:容器   点击:(13)  评论:(0)  加入收藏
如何基于Docker镜像逆向生成Dockerfile
引言你是否曾经遇到过一个想要使用的 Docker 镜像,但却无法修改以适应你的特定需求?或者你可能发现了一个喜欢的 Docker 镜像,但想要了解它是如何构建的?在这两种情况下,将 Docke...【详细内容】
2024-03-07  云原生运维圈  微信公众号  Tags:Docker   点击:(23)  评论:(0)  加入收藏
Kubernetes是什么?主要特点是什么?
Kubernetes是什么?Kubernetes,也称为K8s,是一个开源的容器编排系统,由Google首次开发和维护。它允许容器化的应用程序在集群中自动部署、扩展和管理。Kubernetes提供了一种容器...【详细内容】
2024-02-01    简易百科  Tags:Kubernetes   点击:(161)  评论:(0)  加入收藏
我们一起聊聊容器资源自愈
在企业实际在使用容器这类资源的时候,除了技术本身,要考虑的其他问题也会很多。企业管理的容器有千千万万,出于效率考虑,对于有特殊需求的容器如何进行批量创建和管理呢,这就需要...【详细内容】
2024-01-30  匠心独运维妙维效  微信公众号  Tags:容器   点击:(47)  评论:(0)  加入收藏
Docker与Docker Compose入门:释放你应用部署的威力
今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨...【详细内容】
2024-01-17  waynblog  微信公众号  Tags:Docker   点击:(66)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  编程技术汇  今日头条  Tags:Docker   点击:(79)  评论:(0)  加入收藏
如何在 Ubuntu 上安装 Docker
使用 Docker 意味着开启一个新的计算领域,但如果你刚刚开始使用 Docker,安装可能看起来是一项艰巨的任务。在 Ubuntu 上安装 Docker 有两种推荐的方法: 从 Ubuntu 的仓库安装 D...【详细内容】
2024-01-04    Linux中国  Tags:Docker   点击:(124)  评论:(0)  加入收藏
从Kubernetes的探针到DevOps
今天在群里又看有人问如何设置 Kubernetes 的探针,感觉要补充的话太多了,结合我们在一些 DevOps 项目中痛苦的体验,今天一劳永逸的全部说完,此外,也为大家展现一下为什么 DevOps...【详细内容】
2023-12-27  云云众生s  微信公众号  Tags:Kubernetes   点击:(117)  评论:(0)  加入收藏
站内最新
站内热门
站内头条