写点什么

Fluid 给数据弹性一双隐形的翅膀 -- 自定义弹性伸缩,多线程面试题 2021

用户头像
极客good
关注
发布于: 刚刚

192.168.1.204 93m 2% 1455Mi 10%


192.168.1.205 125m 3% 1925Mi 13%


192.168.1.206 96m 2% 1689Mi 11%


否则手动执行以下命令:


kubectl create -f integration/metrics-server


[](


)6. 部署 custom-metrics-api 组件。




为了基于自定义指标进行扩展,你需要拥有两个组件:


  • 第一个组件是从应用程序收集指标并将其存储到 Prometheus 时间序列数据库。

  • 第二个组件使用收集的度量指标来扩展 Kubernetes 自定义 metrics API,即 k8s-prometheus-adapter。


第一个组件在第三步部署完成,下面部署第二个组件。


如果已经配置了 custom-metrics-api,在 adapter 的 configmap 配置中增加与 dataset 相关的配置:


apiVersion: v1


kind: ConfigMap


metadata:


name: adapter-config


namespace: monitoring


data:


config.yaml: |


rules:


  • seriesQuery: '{name=~"Cluster_(CapacityTotal|CapacityUsed)",fluid_runtime!="",instance!="",job="alluxio runtime",namespace!="",pod!=""}'


seriesFilters:


  • is: ^Cluster_(CapacityTotal|CapacityUsed)$


resources:


overrides:


namespace:


resource: namespace


pod:


resource: pods


fluid_runtime:


resource: datasets


name:


matches: "^(.*)"


as: "capacity_used_rate"


metricsQuery: ceil(Cluster_CapacityUsed{<<.LabelMatchers>>}*100/(Cluster_CapacityTotal{<<.LabelMatchers>>}))


否则手动执行以下命令:


kubectl create -f integration/custom-metrics-api/namespace.yaml


kubectl create -f integration/custom-metrics-api


注意:因为 custom-metrics-api 对接集群中的 Prometheous 的访问地址,请替换 prometheous url 为你真正使用的 Prometheous 地址。


检查自定义指标:


$ kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq


{


"kind": "APIResourceList",


"apiVersion": "v1",


"groupVersion": "custom.metrics.k8s.io/v1beta1",


"resources": [


{


"name": "pods/capacity_used_rate",


"singularName": "",


"namespaced": true,


"kind": "MetricValueList",


"verbs": [


"get"


]


},


{


"name": "datasets.data.fluid.io/capacity_used_rate",


"singularName": "",


"namespaced": true,


"kind": "MetricValueList",


"verbs": [


"get"


]


},


{


"name": "namespaces/capacity_used_rate",


"singularName": "",


"namespaced": false,


"kind": "MetricValueList",


"verbs": [


"get"


]


}


]


}


[](


)7. 提交测试使用的 Dataset。




$ cat<<EOF >dataset.yaml


apiVersion: data.fluid.io/v1alpha1


kind: Dataset


metadata:


name: spark


spec:


mounts:


  • mountPoint: https://mirrors.bit.edu.cn/apache/spark/


name: spark




apiVersion: data.fluid.io/v1alpha1


kind: AlluxioRuntime


metadata:


name: spark


spec:


replicas: 1


tieredstore:


levels:


  • mediumtype: MEM


path: /dev/shm


quota: 1Gi


high: "0.99"


low: "0.7"


properties:


alluxio.user.streaming.data.timeout: 300sec


EOF


$ kubectl create -f dataset.yaml


dataset.data.fluid.io/spark created


alluxioruntime.data.fluid.io/spark created


[](


)8. 查看这个 Dataset 是否处于可用状态。



[](

)可以看到该数据集的数据总量为 2.71GiB, 目前 Fluid 提供的缓存节点数为 1,可以提供的最大缓存能力为 1GiB。此时数据量是无法满足全量数据缓存的需求。


$ kubectl get dataset


NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE


spark 2.71GiB 0.00B 1.00GiB 0.0% Bound 7m38s


[](


)9. 当该 Dataset 处于可用状态后,查看是否已经可以从 custom-metrics-api 获得监控指标。




kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/datasets.data.fluid.io/*/capacity_used_rate" | jq


{


"kind": "MetricValueList",


"apiVersion": "custom.metrics.k8s.io/v1beta1",


"metadata": {


"selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/datasets.data.fluid.io/%2A/capacity_used_rate"


},


"items": [


{


"describedObject": {


"kind": "Dataset",


"namespace": "default",


"name": "spark",


"apiVersion": "data.fluid.io/v1alpha1"


},


"metricName": "capacity_used_rate",


"timestamp": "2021-04-04T07:24:52Z",


"value": "0"


}


]


}


[](


)10. 创建 HPA 任务。




$ cat<<EOF > hpa.yaml


apiVersion: autoscaling/v2beta2


kind: HorizontalPodAutoscaler


metadata:


name: spark


spec:


scaleTargetRef:


apiVersion: data.fluid.io/v1alpha1


kind: AlluxioRuntime


name: spark


minReplicas: 1


maxReplicas: 4


metrics:


  • type: Object


object:


metric:


name: capacity_used_rate


describedObject:


apiVersion: data.fluid.io/v1alpha1


kind: Dataset


name: spark


target:


type: Value


value: "90"


behavior:


scaleUp:


policies:


  • type: Pods


value: 2


periodSeconds: 600


scaleDown:


selectPolicy: Disabled


EOF


首先,我们解读一下从样例配置,这里主要有两部分一个是扩缩容的规则,另一个是扩缩容的灵敏度:


  • 规则:触发扩容行为的条件为 Dataset 对象的缓存数据量占总缓存能力的 90%;扩容对象为 AlluxioRun


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


time,最小副本数为 1,最大副本数为 4;而 Dataset 和 AlluxioRuntime 的对象需要在同一个 namespace。


  • 策略:可以 K8s 1.18 以上的版本,可以分别针对扩容和缩容场景设置稳定时间和一次扩缩容步长比例。比如在本例子, 一次扩容周期为 10 分钟(periodSeconds),扩容时新增 2 个副本数,当然这也不可以超过 maxReplicas 的限制;而完成一次扩容后,冷却时间(stabilizationWindowSeconds)为 20 分钟;而缩容策略可以选择直接关闭。


[](


)11. 查看 HPA 配置, 当前缓存空间的数据占比为 0。远远低于触发扩容的条件。




$ kubectl get hpa


NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE


spark AlluxioRuntime/spark 0/90 1 4 1 33s


$ kubectl describe hpa


Name: spark


Namespace: default


Labels: <none>


Annotations: <none>


CreationTimestamp: Wed, 07 Apr 2021 17:36:39 +0800


Reference: AlluxioRuntime/spark


Metrics: ( current / target )


"capacity_used_rate" on Dataset/spark (target value): 0 / 90


Min replicas: 1


Max replicas: 4


Behavior:


Scale Up:


Stabilization Window: 0 seconds


Select Policy: Max


Policies:


  • Type: Pods Value: 2 Period: 600 seconds


Scale Down:


Select Policy: Disabled


Policies:


  • Type: Percent Value: 100 Period: 15 seconds


AlluxioRuntime pods: 1 current / 1 desired


Conditions:


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 Dataset metric capacity_used_rate


ScalingLimited False DesiredWithinRange the desired count is within the acceptable range


Events: <none>


[](


)12. 创建数据预热任务。




$ cat<<EOF > dataload.yaml


apiVersion: data.fluid.io/v1alpha1


kind: DataLoad


metadata:


name: spark


spec:


dataset:


name: spark


namespace: default


EOF


$ kubectl create -f dataload.yaml


$ kubectl get dataload


NAME DATASET PHASE AGE DURATION


spark spark Executing 15s Unfinished


[](


)13. 此时可以发现缓存的数据量接近了 Fluid 可以提供的缓存能力(1GiB)同时触发了弹性伸缩的条件。




$ kubectl get dataset


NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE


spark 2.71GiB 1020.92MiB 1.00GiB 36.8% Bound 5m15s


从 HPA 的监控,可以看到 Alluxio Runtime 的扩容已经开始, 可以发现扩容的步长为 2。


$ kubectl get hpa

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Fluid 给数据弹性一双隐形的翅膀 -- 自定义弹性伸缩,多线程面试题2021