kubernetes中metrics-server与HPA
一、K8S监控组件metrics-server安装步骤1.添加开源社的仓库[root@k8s-master ~]# helm repo add kaiyuanshe http://mirror.kaiyuanshe.cn/kubernetes/charts/#搜索metrics-server[root@k8s-master ~]# helm search repo metrics-server2.
一、 K8S监控组件metrics-server
安装步骤
1.添加开源社的仓库
[root@k8s-master ~]# helm repo add kaiyuanshe http://mirror.kaiyuanshe.cn/kubernetes/charts/
#搜索metrics-server
[root@k8s-master ~]# helm search repo metrics-server
2.下载metrics-server包
helm pull kaiyuanshe/metrics-server
3.解压
tar -xf metrics-server-2.11.4.tgz
4.修改values.yaml文件
cd metrics-server
vim values.yaml
# 替换成下面的镜像源和版本号
image:
repository: registry.cn-hangzhou.aliyuncs.com/linxiaowen/metrics-server
tag: v0.4.1
args: [] # 删掉括号,换行写入下方内容,经测试,下面缩不缩进都没关系,如果端口冲突则在下方修改。
- --cert-dir=/tmp
- --secure-port=6443
- --metric-resolution=30s
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,externalDNS
- --requestheader-username-headers=X-Remote-User
- --requestheader-group-headers=X-Remote-Group
- --requestheader-extra-headers-prefix=X-Remote-Extra-
# 如果出现端口被占用了,改端口的话,需要改两个文件三处地方一起改端口(注:必须同时修改以下端口)
[root@k8s-m-01 metrics-server]# grep -R '8443' ./
./templates/metrics-server-deployment.yaml: - --secure-port=6443
./templates/metrics-server-deployment.yaml: - containerPort: 6443
./values.yaml: - --secure-port=6443
5.创建用户
[root@k8s-master metrics-server]# kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous
6.安装metrics-server
[root@k8s-master metrics-server]# helm install metrics-server ./
7.查看metrics-server的pod服务跑起来没有
[root@k8s-master metrics-server]# kubectl get pod
metrics-server-675ccccb46-84pbm 1/1 Running 0 19m
7.服务起来后测试命令
[root@k8s-m-01 metrics-server]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 110m 5% 948Mi 32%
k8s-node1 41m 2% 1013Mi 35%
k8s-node2 60m 3% 1228Mi 42%
[root@k8s-m-01 metrics-server]# kubectl top pod
NAME CPU(cores) MEMORY(bytes)
nfs-nfs-client-provisioner-8557b8c764-lc4nx 3m 6Mi
二、HPA自动伸缩
在生产环境中,总会有一些意想不到的事情发生,比如公司网站流量突然升高,此时之前创建的Pod已不足以撑住所有的访问,而运维人员也不可能24小时守着业务服务,这时就可以通过配置HPA,实现负载过高的情况下自动扩容Pod副本数以分摊高并发的流量,当流量恢复正常后,HPA会自动缩减Pod的数量。HPA是根据CPU的使用率、内存使用率自动扩展Pod数量的,所以要使用HPA就必须定义Requests参数。
HPA全称是Horizontal Pod Autoscaler,翻译成中文是POD水平自动伸缩HPA可以基于CPU利用率对replication controller、deployment和replicaset中的pod数量进行自动扩缩容(除了CPU利用率也可以基于其他应程序提供的度量指标custom metrics进行自动扩缩容)。pod自动缩放不适用于无法缩放的对象,比如DaemonSets。HPA由Kubernetes API资源和控制器实现。资源决定了控制器的行为。控制器会周期性的获取平均CPU利用率,并与目标值相比较后来调整replication controller或deployment中的副本数量。
# 编写pod资源清单
kind: Deployment
apiVersion: apps/v1
metadata:
name: hpa
spec:
selector:
matchLabels:
app: hpa
template:
metadata:
labels:
app: hpa
spec:
containers:
- name: hpa
image: alvinos/django:v1
resources:
requests: # 最少使用多少资源
cpu: 100m # cpu最少给100m
memory: 100Mi # 内存最少给100Mi
limits: # 最多使用多少资源
cpu: 200m # cpu最多给200m,最多不能超过
memory: 200Mi # 内存最多给200Mi,最多不能超过
---
# 配置HPA资源清单
kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2beta1
metadata:
name: hpa
namespace: default
spec:
# HPA的最小pod数量和最大pod数量
maxReplicas: 10
minReplicas: 2
# HPA的伸缩对象描述,HPA会动态修改该对象的pod数量
scaleTargetRef:
kind: Deployment
name: hpa
apiVersion: apps/v1
# 监控的指标数组,支持多种类型的指标共存
metrics:
- type: Resource
# 核心指标,包含cpu和内存两种(被弹性伸缩的pod对象中容器的requests和limits中定义的指标。)
resource:
name: cpu
# CPU 阈值
# 计算公式:所有目标pod的metric的使用率(百分比)的平均值,
# 例如limit.cpu=1000m,实际使用500m,则utilization=50%
# 例如(副本数)deployment.replica=3, limit.cpu=1000m,则pod1实际使用cpu=500m, pod2=300m, pod=600m
## 则averageUtilization=(500/1000+300/1000+600/1000)/3 = (500 + 300 + 600)/(3*1000))=0.4666666666666667
# 例如limit设置200m 40 41 42 计算的结果是:(40+41+42)/600=0.205
targetAverageUtilization: 40 # 注:表示cpu使用率超过40%,cpu超过40就立即扩容,cpu最多扩容10个,最小2个。200*0.4=80(80以下都是它的安全范围)
---
# 编写service资源清单
kind: Service
apiVersion: v1
metadata:
name: hpa
spec:
ports:
- port: 80
targetPort: 80
selector:
app: hpa
单位解释
requests:代表容器启动请求的资源限制,分配的资源必须要达到此要求
limits:代表最多可以请求多少资源
单位m:CPU的计量单位叫毫核(m)。一个节点的CPU核心数量乘以1000,得到的就是节点总的CPU总数量。如,一个节点有两个核,那么该节点的CPU总量为2000m。
下面拿双核举例:
resources:
requests:
cpu: 50m #等同于0.05
memory: 512Mi
limits:
cpu: 100m #等同于0.1
memory: 1Gi
含义:该容器启动时请求50/2000的核心(2.5%)并且允许最多使用100/2000核心(5%)
0.05个核除总核数量2就是2.5%了,0.1个核除总核数就2是5%了
resources:
requests:
cpu: 100m #等同于0.1
memory: 512Mi
limits:
cpu: 200m #等同于0.2
memory: 1Gi
cpu单位m的含义:该容器启动时请求100/2000的核心(5%)并且允许最多使用200/2000核心(10%)
0.1个核除总核数量2就是5%了,0.2个核除总核数2就是10%了
应用
2、# 应用资源
[root@k8s-master ~]# kubectl apply -f hpa.yaml
deployment.apps/hpa created
# 查看hpa监控cpu的使用率
[root@k8s-master ~]#kubectl get horizontalpodautoscalers.autoscaling
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa Deployment/hpa 24%/40% 2 10 2 53s
3、# 查看主机资源使用率
[root@k8s-master ~]# kubectl top pods
NAME CPU(cores) MEMORY(bytes)
hpa-5cb8bcdc4f-xvkkf 11m 54Mi
# 查看pod运行详情
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
hpa-5cb8bcdc4f-xvkkf 1/1 Running 0 7m4s
# 查看svc运行详情
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hpa ClusterIP 10.1.159.102 <none> 80/TCP 6m50s
# 给集群上每个节点输入下面的命令,进行压力测试
[root@k8s-master ~]# while true; do curl 10.1.159.102/index; echo ''; done
# 再次查看本pod的CPU运行状态(cpu流量会增大,如下所示)
[root@k8s-master ~]# kubectl top pods
NAME CPU(cores) MEMORY(bytes)
hpa-5cb8bcdc4f-xvkkf 163m 56Mi
# 再次查看pod的数量会增加(这就实现了用HPA监控cpu使用率,随着cpu的使用率的增大会自动扩容pod容器)
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
hpa-7f5d745bf9-45fkj 1/1 Running 0 4m39s
hpa-7f5d745bf9-5qb4d 1/1 Running 0 4m55s
hpa-7f5d745bf9-5vnfl 1/1 Running 0 4m40s
hpa-7f5d745bf9-fh66r 1/1 Running 0 4m55s
hpa-7f5d745bf9-fnlx4 1/1 Running 0 15m
hpa-7f5d745bf9-g7r5c 1/1 Running 0 4m55s
hpa-7f5d745bf9-qdrc7 1/1 Running 0 4m39s
hpa-7f5d745bf9-s2sbx 1/1 Running 0 4m39s
hpa-7f5d745bf9-sz9zz 1/1 Running 0 6m56s
hpa-7f5d745bf9-zw778 1/1 Running 0 16m
可以看到自动伸缩到十个。
更多推荐
所有评论(0)