Ingress Controller(Nginx)是深受Kubernetes开发者欢迎的接入层网关方案,具有功能丰富、配置简单等特点,特别是对于从前使用Nginx的开发者而言,可以快速掌握驾轻就熟。
当服务对外的流量被Ingress Controller统一接管后,如何更好的运维管理Ingress Controller,成为了很多运维开发者需要关心的重要内容。通常运维一个网关型的产品,我们需要关心的整体的流量状况、请求的时延、DAU的分布等等。在之前的文章中,向大家介绍了如何通过SLS进行Ingress的流量可视化,今天我们会介绍如何消费采集上来的这些Ingress指标,并实现一条完整的弹性闭环。
HPA云指标的数据源 - alibaba-cloud-metrics-adapter
当通过SLS将Ingress的请求日志进行采集、分析并展现为数据大盘后,一些单位时间PV很高(QPS高)、部分接口时延很长的应用都无处遁形,有经验的运维同学会根据具体的场景进行应用的调优,例如内核参数的调优,网关配置的调优等等,同时对于RT较高的应用同时也会增加相应的副本数,提高应用的响应速度。那么是否有自动的方式可以将这些对副本的调整进行标准化呢?
这里我们就要引出今天的主角alibaba-cloud-metrics-adapter了,在Kubernetes中,监控数据除了用来展现具体的指标和数据,还有一个重要的用途就是通过HPA进行数据消费。为了满足开发者不同层次的监控需求,Kubernetes定义了三种不同的监控数据接口,分别是Resource Metric,Custom Metric以及external Metric。Resource Metric通常是Metrics-Server进行采集的,提供的主要是Pod、Node、Namespcae等Kubernetes中内置逻辑对象的监控;Custom Metric顾名思义是客户自定义的监控指标,通常是通过Prometheus进行采集,在通过HPA进行消费;External Metric主要针对外部指标,通常是面向云场景的,例如如果希望在Kubernetes集群中获取SLB的最大连接数作为弹性指标或者其他云服务的监控指标,那么通常是通过云厂商的External Metric实现来提供的。
alibaba-cloud-metrics-adapter也不例外,目前提供了SLB、SLS(Ingress)、云监控等指标的透出,开发者可以通过alibaba-cloud-metrics-adapter使用云指标进行HPA。今天的例子,我们主要是通过alibaba-cloud-metrics-adapter实现Ingress指标的HPA。
使用Ingress QPS与RT指标进行弹性伸缩步骤一:安装alibaba-cloud-metrics-adapter
在容器服务的应用目录中选择ack-alibaba-cloud-metrics-adapter,选择需要安装的集群,点击创建进行安装。
步骤二:创建一个通过Ingress暴露服务的应用
首先,我们创建一个应用,并暴露一个ClusterIP的Service。
apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1kind: Deploymentmetadata: name: nginx-deployment-basic labels: app: nginxspec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80---apiVersion: v1kind: Servicemetadata: name: nginx namespace: defaultspec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: ClusterIP通过控制台将刚才创建的Service,通过Ingress的方式进行暴露。
此时,我们可以通过生成的Ingress地址进行访问,确认部署的应用已经可以对外服务。
步骤三:使用PTS进行压力测试
PTS是阿里云上的一款压力测试的工具,提供一键压测的能力,开发者只需简单的配置,即可实现大部分通用场景的压测,今天我们测试的场景比较简单,使用PTS的快速压测即可。
压测配置中,我们设置最大并发为20,设置压测时长为10分钟,点击右上角保存去压测。
此时可以在PTS中查看到当前的QPS状态如下图所示。
在Ingress Dashboard中,我们可以实时看到对应路由的数据盯屏。
步骤四:设置HPA进行弹性伸缩
apiVersion: autoscaling/v2beta2kind: HorizontalPodAutoscalermetadata: name: ingress-hpaspec: scaleTargetRef: apiVersion: apps/v1beta2 kind: Deployment name: nginx-deployment-basic minReplicas: 2 maxReplicas: 10 metrics: - type: External external: metric: name: sls_ingress_qps selector: matchLabels: sls.project: "k8s-log-c550367cdf1e84dfabab013b277cc6bc2" sls.logstore: "nginx-ingress" sls.ingress.route: "default-nginx-80" target: type: AverageValue averageValue: 10 - type: External external: metric: name: sls_ingress_latency_p9999 selector: matchLabels: # default ingress log project is k8s-log-clusterId sls.project: "k8s-log-c550367cdf1e84dfabab013b277cc6bc2" # default ingress logstre is nginx-ingress sls.logstore: "nginx-ingress" # namespace-svc-port sls.ingress.route: "default-nginx-80" target: type: Value # sls_ingress_latency_p9999 > 10ms value: 10sls_ingress_qps与sls_ingress_latency_p9999是本次伸缩使用的两个指标,在target的type中,我们为sls_ingress_qps设置的是AverageValue,表示QPS要除以Pod的数目进行判断。而sls_ingress_latency_p9999这个指标使用时,我们使用的是Value,表示无需除以Pod的数目,这两种不同的type会在HPA的设置中经常用到。
其他HPA的配置主要涉及如下三个参数:
sls.project: "k8s-log-c550367cdf1e84dfabab013b277cc6bc2"sls.logstore: "nginx-ingress"sls.ingress.route: "default-nginx-80"sls.project是指创建集群时开启日志服务的project地址,sls.logstore默认为nginx-ingress,sls.ingress.route是指具体要进行观测的路由,规则为namespace-svc-port。
设置好HPA后,我们通过命令行kubectl describe hpa ingress-hpa进行伸缩状态的检查。
Name: ingress-hpaNamespace: defaultLabels: Annotations: CreationTimestamp: Fri, 09 Aug 2019 23:31:07 0800Reference: Deployment/nginx-deployment-basicMetrics: ( current / target ) "sls_ingress_qps" (target average value): 8223m / 10 "sls_ingress_latency_p9999" (target value): 7 / 10Min replicas: 2Max replicas: 10Deployment pods: 9 current / 9 desiredConditions: Type Status Reason Message ---- ------ ------ ------- AbleToScale True ScaleDownStabilized recent recommendations were higher than current one, applying the highest recent recommendation ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from external metric sls_ingress_qps(&LabelSelector{MatchLabels:map[string]string{sls.ingress.route: default-nginx-80,sls.logstore: nginx-ingress,sls.project: k8s-log-c550367cdf1e84dfabab013b277cc6bc2,},MatchExpressions:[],}) ScalingLimited False DesiredWithinRange the desired count is within the acceptable rangeEvents: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 18s horizontal-pod-autoscaler New size: 4; reason: external metric sls_ingress_qps(&LabelSelector{MatchLabels:map[string]string{sls.ingress.route: default-nginx-80,sls.logstore: nginx-ingress,sls.project: k8s-log-c550367cdf1e84dfabab013b277cc6bc2,},MatchExpressions:[],}) above target Normal SuccessfulRescale 12s horizontal-pod-autoscaler New size: 8; reason: external metric sls_ingress_qps(&LabelSelector{MatchLabels:map[string]string{sls.ingress.route: default-nginx-80,sls.logstore: nginx-ingress,sls.project: k8s-log-c550367cdf1e84dfabab013b277cc6bc2,},MatchExpressions:[],}) above target Normal SuccessfulRescale 7s horizontal-pod-autoscaler New size: 9; reason:可以发现Pod已经正常伸缩,这样一个应用基于Ingress QPS的伸缩就已经完成。
最后alibaba-cloud-metrics-adapter已经正式开源,更多的伸缩指标和参数配置,可以访问github仓库获取更多信息,同业也欢迎开发者提交issue与PR。
作者:莫源
本文为云栖社区内容,未经允许不得转载。
Kubernetes如何入门?
一、初级1.了解Kubernetes 基础架构与核心组件功能
2.了解Docker基本概念和用法
3.理解Docker与Kubernetes的基本关系
4.能够安装、部署与配置 Kubernetes 集群
5.熟练使用 kubectl 命令操作各种 Kubernetes 资源对象,了解基本概念和使用方法
6.能够在 Kubernetes 上部署、运行、管理工作负载并了解其调度算法
7.能够使用 Service、Ingress 等访问工作负载
8.深入理解Pod相关的配置及使用
9.了解Kubernetes生态相关工具及其作用
二、中级
1.理解Kubernetes的资源管理,资源分配、优先级、QoS等
2.能够使用 Flannel、Calico、Macvlan 等常用 CNI 插件配置集群网络
3.能够排查 Kubernetes 集群系统组件、网络、日志、监控告警与存储的故障
4.能够使用 EFK 搭建容器日志系统
5.能够使用 Prometheus、AlertManager 等搭建容器监控告警系统
6.能够配置应用使用持久性存储并了解 Ceph、NFS、GlusterFS 等常见存储工作原理
7.应用生命周期管理
8.理解Kubernetes容器调度的基本流程和使用方法
9.Kubernetes集群日常维护
10.理解并使用Kubernetes的用户认证及授权体系(RBAC)
11.理解弹性伸缩(HPA)的基本原理
三、高级
1.理解Kubernets核心组件的工作原理,并能够进行问题定位及提供解决方案
2.掌握Kubernetes的admission 控制器,audit,镜像gc,Pod驱赶行为等相关工作原理
3.可以扩展和定制Kubernetes调度器
4.能够用 Operator/CRD 对 Kubernetes 作定制化开发
5.理解 Kubernetes 多可用区/多集群管理模式
6.灵活掌握Kubernetes的扩展机制,可以按需定制,包括CNI、CSI、Ingress、自定义控制器等扩展定制
7.可以解决日志、监控等核心组件的问题定位以及进行性能调优
四、专家
1.能够对 Kubernetes 集群、操作系统、镜像、应用做安全加固
2.能够排查 Linux 内核、Docker 容器运行时故障
3.能够基于 Kubernetes、Jenkins等工具构建云原生DevOps方案
4.理解Kubernetes生态主要工具的作用及优缺点,可以在不同场景下灵活运用相关工具并确定最佳实施方案
5.具备对大规模集群支持的相关经验,包括架构设计、性能调优等稳定性保障
6.理解Kubernetes社区运作模式,能够为社区提供PR
7.理解Kubernetes各组件源代码,并能排查、分析相关问题
作为国内领先的全栈云原生技术服务提供商,时速云特别推出了Kubernetes培训课程,对于刚接触Kubernetes技术、企业计划使用容器及Kubernetes集群、以及计划考取CKA证书的人群会是一个不错的选择。
简述Kubernetes ingress?
Kubernetes的Ingress资源对象,用于将不同URL的访问请求转发到后端不同的Service,以实现HTTP层的业务路由机制。Kubernetes使用了Ingress策略和Ingress Controller,两者结合并实现了一个完整的Ingress负载均衡器。使用Ingress进行负载分发时,Ingress Controller基于Ingress规则将客户端请求直接转发到Service对应的后端Endpoint(Pod)上,从而跳过kube-proxy的转发功能,kube-proxy不再起作用,全过程为:ingress controller + ingress 规则 ----> services。
同时当Ingress Controller提供的是对外服务,则实际上实现的是边缘路由器的功能。我推荐你去看看时速云,他们是一家全栈云原生技术服务提供商,提供云原生应用及数据平台产品,其中涵盖容器云PaaS、DevOps、微服务治理、服务网格、API网关等。大家可以去体验一下。 如果我的回答能够对您有帮助的话,求给大大的赞。