华为云kubernetes的简单介绍
本文目录一览:
Kubernetes从中心走向边缘
1.Kubernetes从中心走向边缘
Kubernetes是以应用为中心的技术架构与思想理念,以一套技术体系支持任意负载,运行于任意基础设施之上;向下屏蔽基础设施差异,实现底层基础资源统一调度及编排;向上通过容器镜像标准化应用,实现应用负载自动化部署;向外突破中心云计算的边界,将云计算能力无缝拓展至边缘及现场,快速构建云边一体基础设施。
将云原生技术从中心拓展到边缘,不仅实现云边基础设施技术架构大一统,同时业务实现云边自由编排部署。但是相对Kubernetes在中心云革命性的创新,在边缘场景优势明显,同时缺点也非常致命,在边缘资源有限,网络受限不稳定等特殊情况,所以需要根据不同的业务场景,选择不同Kubernetes边缘方案。
1.1.Kubernetes架构及边缘化的挑战
从技术架构来看,Kubernetes是典型的分布式架构,Master控制节点是集群“大脑”,负责管理节点,调度Pod以及控制集群运行状态。Node工作节点,负责运行容器(Container),监控/上报运行状态。在边缘计算场景存在以下比较明显的挑战:
1.状态强一致且集中式存储架构,属于中心云计算的大成产品,基于大规模的池化资源的编排调度实现业务持续服务。
2.Master管控节点与Worker工作节点通过List-Watch机制,实现状态任务实时同步,但是流量流量较大,Worker工作节点完全依赖Master节点持久化数据,无自治能力。
3.Kubelet承载太多逻辑处理,各种容器运行时各种实现的兼容,还有Device Plugin硬件设备驱动,运行占用资源高达700M;对资源有限的边缘节点负担太重,尤其是低配的边缘设备。
边缘计算涉及的范围大,场景复杂,没有统一的标准;Kubernetes开源社区的主线版本并没边缘场景的适配计划。
1.2.Kubernetes边缘化运行方案
针对中心云计算及边缘计算这种云边分布式架构,需要将Kubernetes适配成适合边缘分布式部署的架构,借助Kubernetes的优势,弥补Kubernetes的不足,通过多集群管理实现统一管理,实现中心云管理边缘运行,整体分为三种方案:
集群 Cluster:将Kubernetes标准集群下沉至边缘,优点是无需Kubernetes做定制化研发,同时可以支持Kubernetes多版本,支持业务真正实现云边架构一致;缺点就是管理资源占用多。方案比较适合区域云/中心云,边缘计算/本地计算以及规模较大的产业边缘场景。
单节点 Single Node:将Kubernetes精简,部署在单节点设备之上,优点与集群 Cluster方案一致,缺点Kubernetes能力不完整,资源的占用会增加设备的成本,对业务应用无法保证云边一致的架构部署运行,是一个中庸方案,没有解决实际问题。
边缘节点 Remote Node:基于Kubernetes二次开发增强扩展,将Kubernetes解耦适配成云边分布式架构的场景,中心化部署Master管理节点,分散式部署Worker管理节点。
1.3.Kubernetes边缘容器的碎片化
Kubernetes已经成为容器编排和调度的事实标准,针对边缘计算场景,目前国内各个公有云厂商都开源了各自基于Kubernetes的边缘计算云原生项目:
KubeEdge :由华为开源,采用边缘节点 Remote Node方案,深度定制了Kubernetes,精简了Kubelet,使用MQTT重新研发了Master与Worker通信机制等,是面向边缘计算场景、专为边云协同设计的业界首个云原生边缘计算框架。KubeEdge于2019年3月正式进入CNCF成为沙箱级项目(Sandbox),也成为CNCF首个云原生边缘计算项目。并于2020年9月晋升为孵化级项目(Incubating),成为 CNCF 首个孵化的云原生边缘计算项目。
OpenYurt:由阿里开源,采用边缘节点 Remote Node方案,业界首个开源的非侵入式边缘计算云原生平台,秉承“Extending your native Kubernetes to Edge”的非侵入式设计理念,拥有可实现边缘计算全场景覆盖的能力。2020年5 月OpenYurt正式对外开源,发布v0.1.0版本,成为业界首个开源的非侵入式边缘计算云原生平台。
SuperEdge:由腾讯、Intel、VMware、虎牙直播、寒武纪、首都在线和美团联合开源,采用边缘节点 Remote Node方案。基于Kubernetes针对边缘计算场景中常见的技术挑战提供了解决方案,如:单集群节点跨地域、云边网络不可靠、边缘节点位于 NAT 网络等。这些能力可以让应用很容易地部署到边缘计算节点上,并且可靠地运行。HTTP)和超文本传输安全协议(HTTPS)。
Baetyl:由百度开源,采用单节点 Single Node方案, 2019年9月23日,百度宣布将BAETYL捐赠给Linux基金会旗下社区,是中国首个 LF Edge捐赠项目。2020-07-08,Baetyl 2.0 正式发布,同步开源了边缘计算云管平台 Baetyl-Cloud。
总的来说,边缘容器的碎片化严重,导致构建边缘计算平台时难以抉择。从技术架构来看,几个边缘容器产品架构是有差异,总的架构思路主要是将Kubernetes解耦成适合云边,弱网络及资源稀缺的边缘计算场景,本质上没有太大差异;从产品功能来看,几个边缘容器产品功能基本一致,基本上都是云边协同,边缘自治,单元化部署功能等;
1.4.构建云边一体化云原生平台
围绕Kubernetes容器平台,构建云边一体化云原生基础设施平台能力,是边缘计算平台的最佳选择,通过云端统一的容器多集群管理,实现分散式集群统一管理,同时标准化Kubernetes集群规格配置:
标准集群(大规模):支持超过400个节点的大规模集群,配置为ETCD + Master 3台 8c16G,Prometheus + Ingress 5台 8C16G, N * Work节点;主要是业务规模较大的云原生应用运行场景;
标准集群(中等规模):支持超过100个节点以内的集群,ETCD + Master + Prometheus 3台 8c16G,N * Work节点;主要是业务规模中等的场景;
边缘原生容器集群:在云端部署集群管理节点,将边缘节点单独部署业务现场,支持运行单业务场景的应用,比如IoT物理设备接入协议解析应用,视频监控分析AI算法模型等业务场景。
按照业务场景需求选择最优容器集群方案,其中边缘容器集群方案,与其他集团方案差别较大,其他集群依然保持中心云集群服务一致,基础资源集中并且池化,所有应用共享整个集群资源;而边缘容器集群Master管理节点集中部署,共享使用;Worker节点都是分散在业务现场,按需自助增加,自运维且独占使用。
当前边缘容器碎片化严重,短时间很难有大一统的开源产品,边缘原生容器集群的集成,长期来看,建议通过标准的Kubernetes API来集成,这种兼容所有边缘容器的中庸方案。如果非要择其一,建议是OpenYurt,非侵入式设计,整体技术架构及实现更加优雅。
一致性是边缘计算的痛点,在边缘增加一个Cache即可实现断网特殊情况的边缘自治,同时可以保证正常网络情况的数据一致;还有就是Kubelet比较重的问题,随着Kubernetes放弃Docker已经开始精简;同时硬件更新迭代较快,相比少量硬件成本,保持Kubernetes原生及通用性为大。其实更希望Kubernetes社区本身提供适配边缘化方案,同时考虑为Kubelet增加缓存机制。
1.5.业务应用的云边管运协同
基于中心云的分布式业务应用架构,与云边分布式协同业务应用架构本质上是有很大的差别。在中心云更多的是基于DDD业务领域,将复杂的业务系统拆分成一个个相对独立的服务,整体构建一个松耦合的分布式应用;但是在云边分布式场景下,更多的强调的是集中式管控运营,分散式运作支撑;将管理运营系统集中在云中心,实现中心式管控;将支撑业务实时运作的应用分散至边缘,实现低延迟快速响应。
从业务应用来看,财务/经营,计划/管理两层属于管控运营类的应用,就是需要通过中心云统一汇聚,实现集中化强管控;对延迟不敏感,对安全,大数据分析能力等要求较高;控制,传感/执行,生产过程三层属于运作支撑类应用,也可以优先考虑中心云;如果业务场景对延迟敏感,才考虑通过边缘计算能力,实现分散式低时延响应;
从请求响应来看,对时延不敏感(50ms以上)都优先考虑部署在中心云计算及云化的边缘产品(CDN)实现;对延迟敏感(小于10ms),运营商骨干网完全无法支持的,考虑建设边缘计算平台,同时业务面临不小的投入及人员;
说的比较抽象,就用实体物流领域为例,对于物流领域,经典的OTW系统(OMS订单管理系统,WMS仓库管理系统,TMS运输管理系统);其中OT就属于典型的管理运营系统,所以建议部署在中心云,通过中心云数据汇聚,实现拼单拆单,多式联运等跨区域业务;W是仓库管理系统,管理四面墙的任务,属于运作支撑应用,并且仓库一般都有一些自动化设备,就可以考虑将W部署在边缘。
1.6.总结
突破中心云计算的边界,将云原生Kubernetes从中心拓展至边缘,构建云边一体化基础设施。面向业务,不仅统一了广域边缘侧分布式的应用运行时,同时实现了应用的中心化管理和边缘侧运行的云边协同。面向运维,业务的自动化运维、高可靠性保障,降低边缘应用的运维工作量,提升边缘计算业务创新效率。
总的来说,Kubernetes云原生是一个庞大且复杂的体系,将整个体系下沉至边缘,面临很大挑战与困难;业务应用想要真正践行边缘的云原生体系,需要从理念、系统设计、架构设计等多方面来公关实现,才能充分发挥边缘的优势及价值。云原生,边缘计算两个领域都在发展,国家也对场景化边缘计算建设提出更高的要求,未来已来,共同期待。
kubernetes 提供什么功能
Kubernetes,是开源容器应用自动化部署技术,也就是大家经常说的k8s。
Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。
使用Kubernetes可以:
自动化容器的部署和复制
随时扩展或收缩容器规模
将容器组织成组,并且提供容器间的负载均衡
很容易地升级应用程序容器的新版本
提供容器弹性,如果容器失效就替换它,等等...
它有这些特点:
可移植:支持公有云,私有云,混合云,多重云 multi-cloud
可扩展:模块化,插件化,可挂载,可组合
自动化:自动部署,自动重启,自动复制,自动伸缩/扩展
如果还有想要了解的可以到官网或是相关教程视频中看看,比如B站这个视频教程:
K8S的概念是什么?
k8s全称kubernetes,这个名字大家应该都不陌生,k8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程,推动了微服务架构等热门技术的普及和落地,正在如火如荼的发展。想要了解更多,我推荐你去看看时速云,他们是一家全栈云原生技术服务提供商,提供云原生应用及数据平台产品,其中涵盖容器云PaaS、DevOps、微服务治理、服务网格、API网关等。大家可以去体验一下。
希望能给您提供帮助,可以给个大大的赞不。
什么是K8S?
k8s是什么?
Kubernetes 是一个可移植的,可扩展的开源容器编排平台,用于管理容器化的工作负载和服务,方便了声明式配置和自动化。它拥有一个庞大且快速增长的生态系统。Kubernetes 的服务,支持和工具广泛可用。
为什么现在流行使用容器?
早期: 在物理服务器上面部署应用程序存在资源分配问题,因为其不能在物理服务器中的应用程序定义资源边界,导致应用程序资源利用不足而无法扩展.
后来: 为了解决该问题,引入了虚拟化技术, 虚拟化技术是指允许你在单个物理服务器的 CPU 上运行多个虚拟机,可以让多个应用程序在虚拟机之间进行隔离,具有一定的安全性, 每一个虚拟机就是一台完整的计算机, 在虚拟化硬件之上运行所有组件.
现在: 多数在物理服务器上面部署应用程序都是采kubectl用容器的方式,容器类似于虚拟机,它们都具有自己的文件系统、CPU、内存、进程空间等, 且由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。基于此特点被企业大范围使用.
为什么需要使用k8s容器?
若出现这样一个环境: 在生产环境中如果一个容器发生故障,则我们需要手动去启动另外一个容器,这样的操作是对我们的管理员来说是不太方便的, 若一个容器出现故障,另一个容器可以自动启动容器接管故障的容器,这样是最好的.
k8s就可以实现该效果,Kubernetes 提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移、部署模式等。
k8s功能: 服务发现和负载均衡, 存储编排, 自动部署和回滚, 自动完成装箱计算, 自我修复, 密钥与配置管理
名词解释
secret
Secret有三种类型:
Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的目录中;
/run/secrets/kubernetes.io/serviceaccount
Opaque:base64编码格式的Secret,用来存储密码、密钥等;
kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。
k8s的组成
k8s是由组件,API,对象等组成.
包含所有相互关联组件的 Kubernetes 集群图如下:
组件
控制平面组件
kube-apiserver: 为k8s的api服务器,公开了所有Kubernetes API, 其他所有组件都必须通过它提供的API来操作资源数据.
保证集群状态访问的安全
隔离集群状态访问的方式和后端存储实现的方式:API Server是状态访问的方式,不会因为后端存储技术etcd的改变而改变。
etcd: 为k8s的键值数据库,保存了k8s所有集群数据的后台数据库。
kube-scheduler: 收集和分析当前Kubernetes集群中所有Node节点的资源(内存、CPU)负载情况,然后依此分发新建的Pod到Kubernetes集群中可用的节点。 kube-controller-manager: 在主节点上运行 控制器 的组件。
cloud-controller-manager: 云控制器管理器是指嵌入特定云的控制逻辑的 控制平面组件
Node 组件
kubelet: 一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都 运行在 Pod 中。
kube-proxy: kube-proxy是集群中每个节点上运行的网络代理,维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
容器运行时: 负责运行容器的软件。
插件(Addons)
DNS: 集群 DNS 是一个 DNS 服务器,和环境中的其他 DNS 服务器一起工作,它为 Kubernetes 服务提供 DNS 记录。
Web 界面(仪表盘): Dashboard 是Kubernetes 集群的通用的、基于 Web 的用户界面。
容器资源监控: 容器资源监控 将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中,并提供用于浏览这些数据的界面。
集群层面日志: 集群层面日志 机制负责将容器的日志数据 保存到一个集中的日志存储中,该存储能够提供搜索和浏览接口。
API
Kubernetes 控制面 的核心是 API 服务器。 API 服务器负责提供 HTTP API,以供用户、集群中的不同部分和集群外部组件相互通信。
对象
Kubernetes对象是Kubernetes系统中的持久实体。Kubernetes使用这些实体来表示集群的状态.
具体来说,他们可以描述:
容器化应用正在运行(以及在哪些节点上)
这些应用可用的资源
关于这些应用如何运行的策略,如重新策略,升级和容错
Kubernetes 架构
Kubernetes 架构由节点,控制面到节点通信, 控制器, 云控制器管理器组成.
master 流程图
Kubecfg将特定的请求,比如创建Pod,发送给Kubernetes Client。
Kubernetes Client将请求发送给API server。
API Server根据请求的类型,比如创建Pod时storage类型是pods,然后依此选择何种REST Storage API对请求作出处理。
REST Storage API对的请求作相应的处理。
将处理的结果存入高可用键值存储系统Etcd中。
在API Server响应Kubecfg的请求后,Scheduler会根据Kubernetes Client获取集群中运行Pod及Minion/Node信息。
依据从Kubernetes Client获取的信息,Scheduler将未分发的Pod分发到可用的Minion/Node节点上。
节点
节点可以是一个虚拟机或者物理机器,取决于所在的集群配置。 每个节点包含运行 Pods 所需的服务, 这些 Pods 由 控制面 负责管理.
节点上的组件包括 kubelet、 容器运行时以及 kube-proxy。
节点状态
可以使用 kubectl 来查看节点状态和其他细节信息:
kubectl describe node �节点名称
一个节点包含以下信息:
地址
HostName:由节点的内核设置。可以通过 kubelet 的 —hostname-override 参数覆盖。
ExternalIP:通常是节点的可外部路由(从集群外可访问)的 IP 地址。
InternalIP:通常是节点的仅可在集群内部路由的 IP 地址。
状况(conditions 字段描述了所有 Running 节点的状态)
Ready 如节点是健康的并已经准备好接收 Pod 则为 True;False 表示节点不健康而且不能接收 Pod;Unknown 表示节点控制器在最近 node-monitor-grace-period 期间(默认 40 秒)没有收到节点的消息
DiskPressure为True则表示节点的空闲空间不足以用于添加新 Pod, 否则为 False
MemoryPressure为True则表示节点存在内存压力,即节点内存可用量低,否则为 False
PIDPressure为True则表示节点存在进程压力,即节点上进程过多;否则为 False
NetworkUnavailable为True则表示节点网络配置不正确;否则为 False
容量与可分配描述节点上的可用资源:CPU、内存和可以调度到节点上的 Pod 的个数上限。
信息关于节点的一般性信息,例如内核版本、Kubernetes 版本(kubelet 和 kube-proxy 版本)、 Docker 版本(如果使用了)和操作系统名称。这些信息由 kubelet 从节点上搜集而来。
控制面到节点通信
节点到控制面
apiserver在安全的 HTTPS 端口(443)上监听远程连接请求
以客户端证书的形式将客户端凭据提供给 kubelet
控制面到节点
API 服务器到 kubelet连接用于
获取 Pod 日志
挂接(通过 kubectl)到运行中的 Pod
提供 kubelet 的端口转发功能。
(注: 在连接状态下, 默认apiserver 不检查 kubelet 的服务证书。容易受到中间人攻击,不安全.)
apiserver 到节点、Pod 和服务
SSH 隧道(目前已经废弃)
产生原因: 若无服务证书, 又要求避免在非受信网络或公共网络上进行连接,则可以在apiserver 和 kubelet 之间使用ssh隧道.
Kubernetes 支持使用 SSH 隧道来保护从控制面到节点的通信路径。
Konnectivity 服务为ssh隧道的替代品, Konnectivity 服务提供 TCP 层的代理,以便支持从控制面到集群的通信。
控制器
在 Kubernetes 中,控制器通过监控集群 的公共状态,并致力于将当前状态转变为期望的状态。
举个例子: 当前室内温度为20度, 我们通过调节遥控器,使其温度上升至24度, 这20度到24度的变化即为让其从当前状态接近期望状态。
控制器模式分为直接控制和通过API服务器来控制.
云控制器管理器
云控制器管理器是指嵌入特定云的控制逻辑的 控制平面组件。 云控制器管理器允许您链接聚合到云提供商的应用编程接口中, 并分离出相互作用的组件与您的集群交互的组件。
云控制器管理器中的控制器包括:
节点控制器
节点控制器负责在云基础设施中创建了新服务器时为之 创建 节点(Node)对象。 节点控制器从云提供商获取当前租户中主机的信息。
执行功能:
针对控制器通过云平台驱动的 API 所发现的每个服务器初始化一个 Node 对象
利用特定云平台的信息为 Node 对象添加注解和标签
获取节点的网络地址和主机名
检查节点的健康状况。
路由控制器Route 控制器负责适当地配置云平台中的路由,以便 Kubernetes 集群中不同节点上的 容器之间可以相互通信。
服务控制器服务(Service)与受控的负载均衡器、 IP 地址、网络包过滤、目标健康检查等云基础设施组件集成。 服务控制器与云驱动的 API 交互,以配置负载均衡器和其他基础设施组件。
Kubernetes 安全性
云原生安全
云原生安全4个C: 云(Cloud)、集群(Cluster)、容器(Container)和代码(Code)
云原生安全模型的每一层都是基于下一个最外层,代码层受益于强大的基础安全层(云、集群、容器)。我们无法通过在代码层解决安全问题来为基础层中糟糕的安全标准提供保护。
基础设施安全
Kubetnetes 基础架构关注领域
建议
通过网络访问 API 服务(控制平面)
所有对 Kubernetes 控制平面的访问不允许在 Internet 上公开,同时应由网络访问控制列表控制,该列表包含管理集群所需的 IP 地址集。
通过网络访问 Node(节点)
节点应配置为 仅能 从控制平面上通过指定端口来接受(通过网络访问控制列表)连接,以及接受 NodePort 和 LoadBalancer 类型的 Kubernetes 服务连接。如果可能的话,这些节点不应完全暴露在公共互联网上。
Kubernetes 云访问提供商的 API
每个云提供商都需要向 Kubernetes 控制平面和节点授予不同的权限集。为集群提供云提供商访问权限时,最好遵循对需要管理的资源的最小特权原则。Kops 文档提供有关 IAM 策略和角色的信息。
访问 etcd
对 etcd(Kubernetes 的数据存储)的访问应仅限于控制平面。根据配置情况,你应该尝试通过 TLS 来使用 etcd。更多信息可以在 etcd 文档中找到。
etcd 加密
在所有可能的情况下,最好对所有驱动器进行静态数据加密,但是由于 etcd 拥有整个集群的状态(包括机密信息),因此其磁盘更应该进行静态数据加密。
集群组件安全
运行的应用程序的安全性关注领域
访问控制授权(访问 Kubernetes API)
认证方式
应用程序 Secret 管理 (并在 etcd 中对其进行静态数据加密)
Pod 安全策略
服务质量(和集群资源管理)
网络策略
Kubernetes Ingress 的 TLS 支持
容器安全
容器安全性关注领域
容器搭建配置(配置不当,危险挂载, 特权用户)
容器服务自身缺陷
Linux内核漏洞
镜像签名和执行
代码安全
代码安全关注领域
仅通过 TLS 访问(流量加密)
限制通信端口范围
第三方依赖性安全
静态代码分析
动态探测攻击(黑盒)
Kubernetes架构常见问题
Kubernetes ATTACK 矩阵
信息泄露
云账号AK泄露
API凭证(即阿里云AccessKey)是用户访问内部资源最重要的身份凭证。用户调用API时的通信加密和身份认证会使用API凭证.
API凭证是云上用户调用云服务API、访问云上资源的唯一身份凭证。
API凭证相当于登录密码,用于程序方式调用云服务API.
k8s configfile泄露
kubeconfig文件所在的位置:
$HOME/.kube/config
Kubeconfig文件包含有关Kubernetes集群的详细信息,包括它们的位置和凭据。
云厂商会给用户提供该文件,以便于用户可以通过kubectl对集群进行管理. 如果攻击者能够访问到此文件(如办公网员工机器入侵、泄露到Github的代码等),就可以直接通过API Server接管K8s集群,带来风险隐患。
Master节点SSH登录泄露
常见的容器集群管理方式是通过登录Master节点或运维跳板机,然后再通过kubectl命令工具来控制k8s。
云服务器提供了通过ssh登陆的形式进行登陆master节点.
若Master节点SSH连接地址泄露,攻击者可对ssh登陆进行爆破,从而登陆上ssh,控制集群.
容器组件未鉴权服务
Kubernetes架构下常见的开放服务指纹如下:
kube-apiserver: 6443, 8080
kubectl proxy: 8080, 8081
kubelet: 10250, 10255, 4149
dashboard: 30000
docker api: 2375
etcd: 2379, 2380
kube-controller-manager: 10252
kube-proxy: 10256, 31442
kube-scheduler: 10251
weave: 6781, 6782, 6783
kubeflow-dashboard: 8080
注:前六个重点关注: 一旦被控制可以直接获取相应容器、相应节点、集群权限的服务
了解各个组件被攻击时所造成的影响
组件分工图:
假如用户想在集群里面新建一个容器集合单元, 流程如下:
用户与 kubectl进行交互,提出需求(例: kubectl create -f pod.yaml)
kubectl 会读取 ~/.kube/config 配置,并与 apiserver 进行交互,协议:http/https
apiserver 会协同 ETCD, kube-controller-manager, scheduler 等组件准备下发新建容器的配置给到节点,协议:http/https
apiserver 与 kubelet 进行交互,告知其容器创建的需求,协议:http/https;
kubelet 与Docker等容器引擎进行交互,创建容器,协议:http/unix socket.
容器已然在集群节点上创建成功
攻击apiserver
apiserver介绍:
在Kubernetes中,对于未鉴权对apiserver, 能访问到 apiserver 一般情况下就能获取了集群的权限.
在攻击者眼中Kubernetes APIServer
容器编排K8S总控组件
pods, services, secrets, serviceaccounts, bindings, componentstatuses, configmaps,
endpoints, events, limitranges, namespaces, nodes, persistentvolumeclaims,
persistentvolumes, podtemplates, replicationcontrollers, resourcequotas …
可控以上所有k8s资源
可获取几乎所有容器的交互式shell
利用一定技巧可获取所有容器母机的交互式shell
默认情况下apiserver都有鉴权:
未鉴权配置如下:
对于这类的未鉴权的设置来说,访问到 apiserver 一般情况下就获取了集群的权限:
如何通过apiserver来进行渗透,可参考:
攻击kubelet
每一个Node节点都有一个kubelet(每个节点上运行的代理)服务,kubelet监听了10250,10248,10255等端口。
10250端口,是kubelet与apiserver进行通信对主要端口, 通过该端口,kubelet可以知道当前应该处理的任务.该端口在最新版Kubernetes是有鉴权的, 但在开启了接受匿名请求的情况下,不带鉴权信息的请求也可以使用10250提供的能力, 在Kubernetes早期,很多挖矿木马基于该端口进行传播.
在配置文件中,若进行如下配置,则可能存在未授权访问漏洞.
/var/bin/kubulet/config/yaml
若10250端口存在未授权访问漏洞,我们可以直接访问/pods进行查看
根据在pods中获取的信息,我们可以在容器中执行命令
curl -Gks {namespace}/{podname}/{containername} \-d 'input=1' -d 'output=1' -d 'tty=1' \-d 'command=whoami'
上述命令得到websocket地址,连接websocket得到命令结果:
使用wscat工具连接websocket
wscat -c “{websocket}” --no-check
即可得到我们执行命令的结果.
获取token
/var/run/secrets/kubernetes.io/serviceaccount
然后即可访问kube-api server,获取集群权限
curl -ks -H "Authorization: Bearer \ ttps://master:6443/api/v1/namespaces/{namespace}/secrets
"
攻击kubelet总体步骤如下:
访问pods获取信息
获取namespace、podsname、containername
执行exec获取token
/var/run/secrets/kubernetes.io/serviceaccount
利用Token访问API Server进行对pods操作。
攻击dashboard
dashboard登陆链接如下:
dashboard界面如下:
dashboard是Kubernetes官方推出的控制Kubernetes的图形化界面.在Kubernetes配置不当导致dashboard未授权访问漏洞的情况下,通过dashboard我们可以控制整个集群。
默认情况下, dashboard是需要进行鉴权操作的,当用户开启了enable-skip-login时可以在登录界面点击Skip跳过登录进入dashboard.
通过skip登陆的dashboard默认是没有操作集群的权限,因为Kubernetes使用RBAC(Role-based access control)机制进行身份认证和权限管理,不同的serviceaccount拥有不同的集群权限。
但有些开发者为了方便或者在测试环境中会为Kubernetes-dashboard绑定cluster-admin这个ClusterRole(cluster-admin拥有管理集群的最高权限).
为Kubernetes-dashboard绑定cluster-admin 设置如下:
新建dashboard-admin.yaml内容
apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: kubernetes-dashboardroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-adminsubjects : kind: ServiceAccount name: kubernetes-dashboard namespace: kubernetes-dashboard
kubectl create -f dashboard-admin.yaml
后通过skip登陆dashboard便有了管理集群的权限.
创建Pod控制node节点,该pod主要是将宿主机根目录挂载到容器tmp目录下。
新建一个Pod如下:
通过该容器的tmp目录管理node节点的文件
攻击etcd
Kubernetes默认使用了etcd v3来存储数据, 若能na
etcd对内暴露2379端口,本地127.0.0.1可免认证访问. 其他地址要带—endpoint参数和cert进行认证。
未授权访问流程:
检查是否正常链接
etcdctl endpoint health
读取service account token
etcdctl get / --prefix --keys-only | grep /secrets/kube-system/clusterrole
通过token认访问API-Server端口6443,接管集群:
kubectl --insecure-skip-tls-verify -s --token="[ey...]" -n kube-system get pods
攻击docker remote api(Docker daemon公网暴露)
2375是docker远程操控的默认端口,通过这个端口可以直接对远程的docker 守护进程进行操作。Docker 守护进程默认监听2375端口且未鉴权.
当机器以方式启动daemon时,可以在外部机器对该机器的docker daemon进行直接操作:
docker daemon -H=0.0.0.0:2375
之后依次执行systemctl daemon-reload、systemctl restart docker
外部主机使用 即可操作暴露2375端口的主机.
-H
因此当你有访问到目标Docker API 的网络能力或主机能力的时候,你就拥有了控制当前服务器的能力。我们可以利用Docker API在远程主机上创建一个特权容器,并且挂载主机根目录到容器.
检测目标是否存在docker api未授权访问漏洞的方式也很简单,访问http://[host]:[port]/info路径是否含有ContainersRunning、DockerRootDir等关键字。
攻击kubectl proxy
二次开发所产生的问题
管理Kubernetes无论是使用 kubectl 或 Kubernetes dashboard 的UI功能,其实都是间接在和 APIServer 做交互.
如果有需求对k8s进行二次开发的话,大部分的开发功能请求了 APIServer 的 Rest API 从而使功能实现的。
例如:
给用户销毁自己POD的能力
DELETE
类似于这样去调用apiserver, 攻击者若修改namespace、pod和容器名, 那么即可造成越权.
推荐工具
Kube-Hunter扫描漏洞
kube-hunter是一款用于寻找Kubernetes集群中的安全漏洞扫描器
下载地址:
CDK(强推)
CDK是一款为容器环境定制的渗透测试工具,在已攻陷的容器内部提供零依赖的常用命令及PoC/EXP。集成Docker/K8s场景特有的 逃逸、横向移动、持久化利用方式,插件化管理。
下载地址:
参考链接
什么是华为云cce?
华为云CCE是华为云容器引擎cloud container engine,提供可靠高性能的企业级容器应用管理服务,支持kubernetes社区原生应用和工具,简化云上自动化容器运行环境搭建
关于华为云kubernetes和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注维启网络。
发表评论
暂时没有评论,来抢沙发吧~