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

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
传统型负载均衡 CLB,每月750个小时 15LCU
云解析 DNS,旗舰版 1个月
简介: 阿里云智能容器平台解决方案架构师徐征讲解阿里云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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1天前
|
Kubernetes 算法 调度
阿里云 ACK FinOps成本优化最佳实践
本文源自2024云栖大会梁成昊演讲,讨论了成本优化策略的选择与实施。文章首先介绍了成本优化的基本思路,包括优化购买方式、调整资源配置等基础策略,以及使用弹性、资源混部等高级策略。接着,文章详细探讨了集群优化和应用优化的具体方法,如使用抢占式实例降低成本、通过资源画像识别并优化资源配置,以及利用智能应用弹性策略提高资源利用效率。
|
1天前
|
弹性计算 调度 数据中心
阿里云 ACK One 注册集群云上弹性:扩展业务新利器
随着企业数字化转型深入,传统IDC数据中心因物理容量限制,难以实现动态扩容,缺乏弹性能力。阿里云ACK One注册集群凭借其高度灵活性和丰富资源选择,成为解决此问题的最佳方案。通过与阿里云资源的整合,ACK One不仅实现了计算资源的按需扩展,提高了资源利用率,还通过按需付费模式降低了成本,使企业能够更高效地应对业务增长和高峰需求。
|
1天前
|
运维 Kubernetes Serverless
阿里云Argo X K8s玩转工作流引擎,实现大规模并行计算
本文基于2024云栖大会田双坤的演讲,介绍了Kubernetes作为云原生操作系统的角色及其在各类任务中的应用,重点探讨了Argo Workflows在Kubernetes上编排并行任务的能力。面对自建Argo Workflows的挑战,如稳定性、成本和安全性等问题,阿里巴巴云推出了全托管的Serverless Argo工作流,提供全托管、免运维、可观测和易集成的特点,显著提升了任务编排的效率和稳定性。适用于数据处理、科学计算、自动驾驶仿真等多个领域。
|
1天前
|
Kubernetes 容灾 调度
阿里云 ACK 高可用稳定性最佳实践
本文整理自2024云栖大会刘佳旭的演讲,主题为《ACK高可用稳定性最佳实践》。文章探讨了云原生高可用架构的重要性,通过Kubernetes的高可用案例分析,介绍了ACK在单集群高可用架构设计、产品能力和最佳实践方面的方法,包括控制面和数据面的高可用策略、工作负载高可用配置、企业版容器镜像服务高可用配置等内容,旨在帮助企业构建更加可靠和高效的应用运行环境。
|
1天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
容器 Kubernetes Perl
阿里云Kubernetes平台构建和管理实践(上)
阿里云智能容器平台解决方案架构师徐征讲解阿里云Kubernetes平台构建和管理实践,徐征主要从事帮助企业在面向云原生的应用转型的过程中提供解决方案和相应的工作。
10900 0
|
22天前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
56 1
|
2月前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
2月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
2月前
|
Kubernetes Ubuntu Linux
Centos7 搭建 kubernetes集群
本文介绍了如何搭建一个三节点的Kubernetes集群,包括一个主节点和两个工作节点。各节点运行CentOS 7系统,最低配置为2核CPU、2GB内存和15GB硬盘。详细步骤包括环境配置、安装Docker、关闭防火墙和SELinux、禁用交换分区、安装kubeadm、kubelet、kubectl,以及初始化Kubernetes集群和安装网络插件Calico或Flannel。
194 4