阿里云Kubernetes平台构建和管理实践(下)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
网络型负载均衡 NLB,每月750个小时 15LCU
应用实时监控服务-应用监控,每月50GB免费额度
简介: 阿里云智能容器平台解决方案架构师徐征讲解阿里云Kubernetes平台构建和管理实践,徐征主要从事帮助企业在面向云原生的应用转型的过程中提供解决方案和相应的工作。

本专题主要对整个阿里云产品的概览、集群规划创建、核心组件配置及优化、集群运维四个部分进行介绍。

本文为第三部分和第四部分,点击这里,查看第一部分和第二部分。

想看精彩直播回放,请点击这里。

以下为精彩直播内容整理:

三、核心组件配置及优化

核心组件-Ingress Controller部署架构:混布(中小规模)
image.png

当建好集群以及布好业务之后,为了更好的对外服务,Ingress是以Pod的形式部署在k8s里,集群默认初始化的配置给到的是Ingress Controller集齐的两个Pod,这两个Pod是随机的运行在Worker节点上的,基于这样的场景,对于一些中小规模的集群运行是没问题的。Ingress Controller和其他的Pod是同步在Worker节点上,这样会灵活伸缩,同时维护比较简单。但是,在这个节点上同时存在外部的南北流量和内部的东西流量,会产生流量的叠加,所以这样的场景比较适合中小规模。对整个Ingress需要对外访问的Kubernetes要求不会特别高的场景,可以用默认的配置直接使用。

核心组件-Ingress Controller部署架构:独立部署(大规模)

image.png

Ingress Controller核心组件的Pod可以独立进行部署,相当于是规划好的一组node节点。使这组节点不调动其他非Ingress的Pod,就只应用于Ingress Controller,这样的能力相当于这个节点上只提供Ingress Controller的Pod使用,从而最大限度的保证性能。但存在的问题是需要手动的维护机器组,当伸缩时,维护相对复杂。好处是一个节点内只有南北流量,或者只有东西流量,抗干扰性好,并且Ingress性能也有所保障。有一点需要注意的是,如果用于独立部署ingress controller的节点需要选择大规划,nf_conntrack表会受限于CPU核数,同时定义每一core对应的基本值为多少。Ingress Controller节点选择什么规格就决定了这个节点上能有多少的转发能力,nf_conntrack表就直接决定了转发的性能。通常,ingress的南北流量很大,但是ingress controller没有做特定的隔离选择,可能运行在普通的机器上,大概十几万的转发表,在高峰业务流量后很容易将ingress controller打垮,这属于一个典型的案例。

核心组件-独立部署Ingress Controller配置建议
独立部署Ingress Controller配置建议如下:

  • 选用32c/64g的配置2~3台对应一个SLB(5G入口流量) ,作为Ingress Controller节点组共同承担Pod任务;
  • 为部署的机器打上污点标签例如Taint: Ingress=:NoEexcute;
  • 设置Ingress controller的POD资源限制为request/limit: 15c/32g;
  • 设置Ingress controller使用ENI(对应Service要用cluster类型);
  • 更改对应的SLB规格(支持的并发数),以及选择按照流量计费(最大支持5G),或者使用指定已有SLB创建ingress-lb-svc。

核心组件-Ingress Controller的Nginx参数配置
Ingress controller通过configmap的key-value来配置Nginx的参数,可以使用官方的配置文档(https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/)来调节。

核心组件-Ingress Controller性能调优

image.png
默认的Controller存在一些默认的参数优化由上图左侧部分,还有一些定制化的参数优化,比如timeout的参数配置,可以通过自己修改configmap来实现。修改完的configmap是无需重新启动Pod的,可以自动地刷新配置。

核心组件-CoreDNS
CoreDNS作为内部的服务解析的组件,包括外部域名的服务解析。建议配置cluster-proportional-autoscaler,根据node数量以及vCore的数量水平自动扩展副本数;容器内打开nscd(域名缓存服务)时,可大幅提升解析性能;严禁生产环境使用alpine作为基础镜像,会导致dns解析请求异常。

核心组件-容器伸缩
image.png
HPA作为原生提供的水平伸缩,可以根据CPU或者外部的指标做外部的指标扩容。目前VPA作为还未成熟的方案,主要指容器的Pod的资源限制,包括容器垂直的伸缩。阿里云提出的定时POD伸缩能力已经开源。同样通过人为也可以进行伸缩。这些伸缩都只在集群内部的Pod伸缩,当Pod伸缩到触及整个最大容量上限时,就需要一个Cluster级别的伸缩,此伸缩为集群里的node节点。

核心组件-Cluster Autoscaler
image.png
由此产生Cluster Autoscaler核心组件,其核心在于有一个Cluster Autoscaler scheduler调度器,会监听整个调度的状态,当前集群里面有多少Pod是属于pending状态,这些pending状态的Pod需要多少资源,再根据定义的ESST弹性伸缩组里的规格配置,算出需要多少数量,自动触发购买并加入到K8S集群,最后将没有调度的Pod调度到新的节点上,完成闭环状态。

核心组件-Kubernetes日志数据采集
运用越来越多的k8s分布式,则水平扩展的Pod会越来越多,业务里需要完成一键采集、统一管理以及查看日志是必要的任务。目前阿里云的整个k8s ICK是跟整个服务组建完成无缝的连接,当创建集群时勾选了使用日志服务时,阿里就会协助日志服务的Controller,自动的帮助做一些与日志服务对接的工作。从客户应用层面来说,只需要写一个环境变量,如下图所示,实现日志统一的采集。
image.png

核心组件-多维度一体化监控体系

image.png
监控也是重要的环节,对所有运行的各种组件的状态,能够及时的监控,并且出现异常以后能够触发告警。概括来说,监控可以包含几个部分,最底层为物理主机/VM层监控,指监控系统指标、CPU内存及网络流量等。第二层为容器POD指标监控,涉及到容器本身的系统指标,同样有CPU内存等指标。还有一层指容器POD里面的应用指标,相当于容器CaaS层资源监控。再往上一层为应用层性能监控,对整个应用层进行跟踪和监控。针对不同维度会有不同对接的产品提供相应的服务能力。

核心组件-POD监控/告警
通过创建集群时选择打通云监控,会自动提供丰富的监控能力。
image.png
如上图所示可以看到在K8S节点监控:每个节点/Master维度/Node维度,Master组件/Node组件维度,Deployment维度,POD实例维度。

核心组件-应用性能管理ARMS
针对全局应用层拓扑、全局应用性能统计与分析(Dashboard)、调用链分析采用慢调用,异常调用、异常快速定位与告警、方法栈调用分析、JVM监控、快速定位与分析、告警、SQL慢调用分析、动态生效配置,生产级适配、业务日志结合,调用链与业务逻辑关联分析等业务内部生成式的各种的可观测性的指标都可以在ARMS产品上进行管理。

核心组件-ARMS“无侵入式”快捷接入(Java)
整个接入是与阿里的容器服务做controller,controller可以自动的捕捉应用Pod创建的生命周期时是否需要接ARMS,唯一需要做的是在文件里加上annotation,通知arms pilot是可以利用的,以及创建arms pilot的名字,之后arms pilot CRD的controller自动的捕捉Pod创建的生命周期,在Pod启动时,需要用到ARMS的Java探针打在容器里面。这样做的优势是对代码不需要完全的侵入。

四、集群运维

集群运维-一键升级过程

image.png
平台提供一个Kubernetes版本的一键升级能力,相当于k8s版本的一个生命周期的迭代,作为由平台方提供一键升级的能力。需要做的只是选择一个在业务低峰时做的升级操作,升级主要分为两部分:第一部分,Master节点做串行的滚动升级,可以说是一台一台升级的,升级过程中对整个业务的访问、发布和使用是没有任何影响的;第二部分,node节点并行升级,相当于很多的节点同时进行升级,在升级过程中只是升级节点3的kubelet组件,并不会引起下面运行的Pod容器的中断,所以这样一键升级的过程是安全、可控的。

集群运维-系统组件升级
image.png
针对系统内部使用的系统组件,比如application-controller、disk-controller以及Cloud Controller等一些核心的能力组件,都会定期的进行新特性能力的增强,以及提供自主升级,
只需要定期的关注需要升级的页面,查看是否需要升级的部分,然后进行一键升级就可以。

集群运维-平台审计日志
image.png

在整个k8s集群里有很多的通道都会操作集群,比如原生的控制台,镜像操作及其他日志服务等与API Server都有耦合的渠道产生日志,这些渠道的各种日志都会统一的进行监控数据的采集,并且生成平台审计的Dashboard。如下图,时间和操作都可以在Dashboard上查看到。
image.png

集群运维-利用NPD增强node错误检测

image.png
针对生产集群需要配置的NPD,是作为一个工具使用。节点问题自动化的检测及告警的过程核心是实现挖取API及node节点上的Event,查看Event是否报出。在原生的BPD的社区能力上做出一些增强,包括检测节点进程号PID是否被耗尽以及文件句柄FD 是否被耗尽。

集群运维-密切监控线程/进程和文件句柄泄漏

image.png
通过提前获知节点是否ready,知道这些节点的问题,为什么会引起节点的not ready,还是由于业务负载太高或者是运行的容器进程泄露,考虑这些问题,对整个安全区管理和掌控的整个集群的稳定性会是很好地帮助。

集群运维-K8S Event信息归档以及告警

image.png

集群默认Event保留1小时后被轮转,给查问题带来不便。建议配置eventer统一采集到SLS存储。

集群运维-查错的经典步骤

  • ECS 互通是否有异常
  • 安全组是否配置有误
  • 使用子账户,授权是否正确
  • Docker run 的方式运行,是否能正常提供服务
  • 在K8S 里通过一个POD 去访问目标的POD 是否正常
  • 通过service 方式访问是否正常
  • 通过SLB/Ingress 方式访问是否正常
  • Kubectl get event 是否有异常
  • Api server/schedule/controller 日志是否有异常
  • Docker daemon日志是否有异常

集群运维-节点NotReady查错

  • 是否被Cordon ?节点状态是”Ready, SchedulingDisabled”
  • 是否被链接不上API Server(kubelet 日志),API Server 私网SLB 是否存在?
  • PID 满?
  • 是否机器时钟没有同步?NTP 没有启动?
  • Docker Daemon, Kubelet 是否启动以及状态正常?
  • 是否磁盘满?磁盘IO 是否正常?(df –h) )
  • 安全组是否一致,是否连接不上API Server
  • Fail/completed 的容器数量过多docker ps -a | wc -l # n > 5000

集群运维-Kubelet/Docker挂死的应急恢复处理
有两种处理方法:
1.恢复办法:重启systemctl daemon-reexec重启systemctl restart docker(可选视情况定)重启systemctl restart kubelet。
2.减缓办法:对于容器的liveness/readiness使用tcp/httpget的方式,避免高频率使用exec。

本文为第三部分和第四部分,点击这里,查看第一部分和第二部分。

扫描下方二维码,加入开发与运维钉钉交流群,查看更多精彩内容。
开发与运维技术群.jpg

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
2月前
|
Kubernetes Devops 应用服务中间件
基于 Azure DevOps 与阿里云 ACK 构建企业级 CI/CD 流水线
本文介绍如何结合阿里云 ACK 与 Azure DevOps 搭建自动化部署流程,涵盖集群创建、流水线配置、应用部署与公网暴露,助力企业高效落地云原生 DevOps 实践。
303 0
|
2月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
340 2
|
7月前
|
存储 负载均衡 测试技术
ACK Gateway with Inference Extension:优化多机分布式大模型推理服务实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with Inference Extension组件,在Kubernetes环境中为多机分布式部署的LLM推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
8月前
|
存储 人工智能 Kubernetes
ACK Gateway with AI Extension:面向Kubernetes大模型推理的智能路由实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with AI Extension组件,在Kubernetes环境中为大语言模型(LLM)推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
8月前
|
存储 人工智能 物联网
ACK Gateway with AI Extension:大模型推理的模型灰度实践
本文介绍了如何使用 ACK Gateway with AI Extension 组件在云原生环境中实现大语言模型(LLM)推理服务的灰度发布和流量分发。该组件专为 LLM 推理场景设计,支持四层/七层流量路由,并提供基于模型服务器负载感知的智能负载均衡能力。通过自定义资源(CRD),如 InferencePool 和 InferenceModel,可以灵活配置推理服务的流量策略,包括模型灰度发布和流量镜像。
|
9月前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
302 10
|
8月前
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
310 0
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
9月前
|
弹性计算 监控 持续交付
面对热点事件,阿里云如何通过云上弹性与容器服务帮助客户应对流量洪峰
面对热点事件,阿里云如何通过云上弹性与容器服务帮助客户应对流量洪峰
232 0
|
1月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
221 2
|
1月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
223 89

推荐镜像

更多
下一篇
oss云网关配置