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

本文涉及的产品
云拨测,每月3000次拨测额度
简介: 阿里云智能容器平台解决方案架构师徐征讲解阿里云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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
3天前
|
存储 运维 Kubernetes
Kubernetes 集群的持续性能优化实践
【4月更文挑战第22天】在动态且复杂的微服务架构中,确保 Kubernetes 集群的高性能运行是至关重要的。本文将深入探讨针对 Kubernetes 集群性能优化的策略与实践,从节点资源配置、网络优化到应用部署模式等多个维度展开,旨在为运维工程师提供一套系统的性能调优方法论。通过实际案例分析与经验总结,读者可以掌握持续优化 Kubernetes 集群性能的有效手段,以适应不断变化的业务需求和技术挑战。
14 4
|
26天前
|
Kubernetes 网络协议 应用服务中间件
K8S二进制部署实践-1.15.5
K8S二进制部署实践-1.15.5
34 0
|
1月前
|
存储 Kubernetes Docker
容器服务ACK常见问题之阿里云控制台进不去了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
1月前
|
SQL 分布式计算 关系型数据库
阿里云E-MapReduce Trino专属集群外连引擎及权限控制踩坑实践
本文以云厂商售后技术支持的角度,从客户的需求出发,对于阿里云EMR-Trino集群的选型,外连多引擎的场景、Ldap以及Kerberos鉴权等问题进行了简要的实践和记录,模拟客户已有的业务场景,满足客户需求的同时对过程中的问题点进行解决、记录和分析,包括但不限于Mysql、ODPS、Hive connector的配置,Hive、Delta及Hudi等不同表格式读取的兼容,aws s3、阿里云 oss协议访问异常的解决等。
|
24天前
|
Kubernetes 监控 数据安全/隐私保护
K8s好看的管理页面Rancher管理K8S
K8s好看的管理页面Rancher管理K8S
36 4
|
1月前
|
SQL 安全 数据管理
在阿里云数据管理DMS(Data Management Service)中,您可以按照以下步骤来创建和管理数据库
【2月更文挑战第33天】在阿里云数据管理DMS(Data Management Service)中,您可以按照以下步骤来创建和管理数据库
37 7
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群监控与日志管理实践
【2月更文挑战第29天】 在微服务架构日益普及的当下,Kubernetes 已成为容器编排的事实标准。然而,随着集群规模的扩大和业务复杂度的提升,有效的监控和日志管理变得至关重要。本文将探讨构建高效 Kubernetes 集群监控系统的策略,以及实施日志聚合和分析的最佳实践。通过引入如 Prometheus 和 Fluentd 等开源工具,我们旨在为运维专家提供一套完整的解决方案,以保障系统的稳定性和可靠性。
|
27天前
|
SQL 存储 API
阿里云实时计算Flink的产品化思考与实践【下】
本文整理自阿里云高级产品专家黄鹏程和阿里云技术专家陈婧敏在 FFA 2023 平台建设专场中的分享。
110715 86
阿里云实时计算Flink的产品化思考与实践【下】
|
11天前
|
Kubernetes 监控 Cloud Native
构建高效云原生应用:基于Kubernetes的微服务治理实践
【4月更文挑战第13天】 在当今数字化转型的浪潮中,企业纷纷将目光投向了云原生技术以支持其业务敏捷性和可扩展性。本文深入探讨了利用Kubernetes作为容器编排平台,实现微服务架构的有效治理,旨在为开发者和运维团队提供一套优化策略,以确保云原生应用的高性能和稳定性。通过分析微服务设计原则、Kubernetes的核心组件以及实际案例,本文揭示了在多变的业务需求下,如何确保系统的高可用性、弹性和安全性。
16 4
|
12天前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
24 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用

推荐镜像

更多