从Kubernetes 1.11开始,不推荐从Heapster获取指标。
metrics-server目前支持的api版本
- autoscaling/v1
- autoscaling/v2beta1
- autoscaling/v2beta2
我这边镜像/yaml上传到码云仓库,直接拉取创建即可。但不建议这样熟悉下操作流程与问题最好。
git clone https://gitee.com/cainiao555/metrics-server.git && \
cd metrics-server && \
docker load < metrics-server.tar.gz && \
kubectl apply -f components.yaml
一、下载metrics-server插件
git clone https://github.com/kubernetes-sigs/metrics-server.git
你会发现git下来速度比较慢,直接找需要的文件吧,登录到github上找到components.yaml文件
OK,接下就是下载文件即可
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml
二、修改下载下来的文件
1、修改components.yaml镜像名称
registry.cn-hangzhou.aliyuncs.com/kubernets-imags/metrics-server-amd64:v0.3.3
2、获取阿里的metrics-server-amd64镜像
获取容器服务的阿里云仓账号并且登录
登录成功。
3、镜像加速
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vgljcdk8.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4、拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/kubernets-imags/metrics-server-amd64:v0.3.3
三、生成metrics-server插件清单
1、执行yaml文件命令
kubectl apply -f components.yaml
2、查看是否生成
kubectl get po,svc -A |grep metrics-server
3、执行查看是否生效
kubectl top nodes
提示信息: error: metrics not available yet
4、修改components.yaml文件:
- –kubelet-preferred-address-types -确定连接到特定节点的地址时使用的节点地址类型的优先级(默认[主机名,内部DNS,内部IP,外部DNS,外部IP]),
直接使用节点IP地址获取数据
- –kubelet-insecure-tls-不要验证Kubelets提供的服务证书的CA。仅用于测试目的,
不验证客户端证书
- –requestheader-client-ca-file -指定根证书捆绑包,以验证传入请求上的客户端证书。
最后components.yaml文件格式如下:
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:aggregated-metrics-reader
labels:
rbac.authorization.k8s.io/aggregate-to-view: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rules:
- apiGroups: ["metrics.k8s.io"]
resources: ["pods", "nodes"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding #集群绑定
metadata:
name: metrics-server:system:auth-delegator #集群绑定名称
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole #集群角色名称
name: system:auth-delegator #允许代理身份认证和鉴权, 它通常用在插件式 API 服务器上,以实现统一的身份认证和鉴权。
subjects:
- kind: ServiceAccount #绑定sa
name: metrics-server #sa的名称叫做metrics-server
namespace: kube-system #kube-system名称空间
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding #角色绑定
metadata:
name: metrics-server-auth-reader #角色绑定名称
namespace: kube-system #名称空间
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role #角色
name: extension-apiserver-authentication-reader #以你命令空间中的服务账号创建一个 Kubernetes 集群角色绑定,绑定到 extension-apiserver-authentication-reader 角色。 这将让你的扩展 api-server 能够访问 extension-apiserver-authentication configmap。
subjects:
- kind: ServiceAccount #绑定sa
name: metrics-server #sa的名称叫做metrics-server
namespace: kube-system #kube-system名称空间
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1beta1.metrics.k8s.io
spec:
service:
name: metrics-server
namespace: kube-system
group: metrics.k8s.io
version: v1beta1
insecureSkipTLSVerify: true
groupPriorityMinimum: 100
versionPriority: 100
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: metrics-server
namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
labels:
k8s-app: metrics-server
spec:
selector:
matchLabels:
k8s-app: metrics-server
template:
metadata:
name: metrics-server
labels:
k8s-app: metrics-server
spec:
serviceAccountName: metrics-server
volumes:
# mount in tmp so we can safely use from-scratch images and/or read-only containers
- name: tmp-dir
emptyDir: {}
containers:
- name: metrics-server
image: registry.cn-hangzhou.aliyuncs.com/kubernets-imags/metrics-server-amd64:v0.3.3
imagePullPolicy: IfNotPresent
args:
- --cert-dir=/tmp
- --secure-port=4443
- --metric-resolution=30s
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
- --logtostderr
ports:
- name: main-port
containerPort: 4443
protocol: TCP
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- name: tmp-dir
mountPath: /tmp
nodeSelector:
kubernetes.io/os: linux
---
apiVersion: v1
kind: Service
metadata:
name: metrics-server
namespace: kube-system
labels:
kubernetes.io/name: "Metrics-server"
kubernetes.io/cluster-service: "true"
spec:
selector:
k8s-app: metrics-server
ports:
- port: 443
protocol: TCP
targetPort: main-port
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:metrics-server
rules:
- apiGroups:
- ""
resources:
- pods
- nodes
- nodes/stats
- namespaces
- configmaps
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: system:metrics-server
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:metrics-server
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
再次执行
kubectl apply -f components.yaml
四、kubernetes配置文件(超级注意点切勿修改)
五、等待几分钟再次执行
kubectl top nodes
六、Horizontal Pod Autoscaler 演示
1、定义了一个index.php 页面来执行一些 CPU 密集型计算:
vim index.php
<?php
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++) {
$x += sqrt($x);
}
echo "OK!";
?>
2、定制 Docker 镜像
cat << EOF | tee php-apache.df
FROM php:5-apache
COPY index.php /var/www/html/index.php
RUN chmod a+rx index.php
EOF
docker build -f php-apache.df -t phpapache:latest ./
3、镜像分发给节点(没有上传镜像仓库,节点无法拉取镜像)
打包:
docker save phpapache:latest > phpapache.tar.gz
分发所有节点:
scp -r phpapache.tar.gz 用户@IP:绝对路径
4、无状态资源清单(HPA autoscaling/v1 API 版本)
vim deployment_pha.yaml
apiVersion: apps/v1 #api版本
kind: Deployment #控制器
metadata:
labels:
app: phpapache
name: phpapache #Pod名称
spec:
replicas: 3 #启动副本数
selector: #设置标签
matchLabels:
app: phpapache #必须匹配.spec.template.metadata标签相同,查看标签(kubectl get pods --show-labels)
minReadySeconds: 5 #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
revisionHistoryLimit: 3 #要保留以允许回滚的旧复制集数
strategy: #策略
type: RollingUpdate #默认为滚动更新
rollingUpdate: #滚动更新
maxSurge: 1 #滚动升级时会先启动1个pod
maxUnavailable: 1 #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
template: #模板(相当于定义好的一个python中的模块)
metadata:
labels:
app: phpapache #必须匹配match .spec.selector.matchLabels标签相同。
spec:
terminationGracePeriodSeconds: 60 #k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒
containers: #模板(容器模板)
- image: phpapache:latest #镜像名字
name: phpapache #node节点启动的容器名字,容器名称(docker ps)查看格式k8s_容器名称_Pod名称
imagePullPolicy: IfNotPresent #拉取镜像(选择方式——直接使用本地拥有的镜像)
ports:
- name: phpapache #SVC_名称,并且在pod中是唯一的(与svc的ports名称必须对应)
containerPort: 80 #容器开放的监听端口
resources: #资源
limits: #限制
memory: 500Mi
cpu: 200m #0.2代表200m
requests: #请求
memory: 250Mi
cpu: 100m #0.1代表100m
restartPolicy: Always #重新启动pod中所有容器的策略
---
apiVersion: v1
kind: Service #控制器
metadata:
labels:
app: phpapache #svc的标签名称
name: phpapache #svc名称
spec:
ports:
- name: phpapache #服务中此端口的名称。这必须是DNS标签全部ServiceSpec中的端口必须具有唯一的名称(与Pod的ports名称必须对应)
# 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
port: 80 #Port 的请求端口
protocol: TCP #TCP协议
targetPort: 80 #请求代理到使用TCP端口80,并且具有标签"app=phpapache" 的Pod上,默认情况下,targetPort 将被设置为与 port 字段相同的值。
nodePort: 30080 #宿主机暴露的服务端口,默认情况下随机分配一个端口号(默认:30000-32767)
selector:
app: phpapache #具有标签"app=phpapache" 的Pod加入到该svc中
type: NodePort #对外集群的外部访问
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler #kind控制器
metadata:
name: phpapache #HPA的名字
spec:
scaleTargetRef:
apiVersion: apps/v1 #api版本
kind: Deployment #Deployment控制器
name: phpapache #Deployment控制器名字
minReplicas: 3 #最小的副本数
maxReplicas: 7 #最大的副本数
targetCPUUtilizationPercentage: 10 #触发HPA值
5、资源清单生成
kubectl apply -f deployment_pha.yaml
6、查看各资源信息(hpa、svc、pod)
kubectl top pod && kubectl get hpa
7、增加Pod负载
- 获取svc的IP:
kubectl get svc
- 通过一个循环向 php-apache 服务器发送无限的查询请求
while true; do wget -q -O- http://10.99.144.228; done
- 另外一个窗口观看情况
8、停止负载
输入 + C 来终止负载的产生。
然后我们可以再次查看负载状态(自动扩缩完成副本数量的改变可能需要几分钟的时间
):
kubectl get hpa
这时,CPU 利用率已经降到1%,所以 HPA 将自动缩减副本数量至 3。
七、基于多项度量指标和自定义度量指标自动扩缩
自定义度量指标自动扩缩 利用 autoscaling/v2beta2 API 版本
,你可以在自动扩缩 php-apache 这个 Deployment 时使用其他度量指标。
cpu测试:
1、新建文件目录
mkdir -p /root/kubernetes/HPA/metrics-server/hpav2beta2/cpu
2、书写资源清单
vim deployment_phav2_cpu.yaml
apiVersion: apps/v1 #api版本
kind: Deployment #控制器
metadata:
labels:
app: phpapache
name: phpapache #Pod名称
spec:
replicas: 3 #启动副本数
selector: #设置标签
matchLabels:
app: phpapache #必须匹配.spec.template.metadata标签相同,查看标签(kubectl get pods --show-labels)
minReadySeconds: 5 #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
revisionHistoryLimit: 3 #要保留以允许回滚的旧复制集数
strategy: #策略
type: RollingUpdate #默认为滚动更新
rollingUpdate: #滚动更新
maxSurge: 1 #滚动升级时会先启动1个pod
maxUnavailable: 1 #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
template: #模板(相当于定义好的一个python中的模块)
metadata:
labels:
app: phpapache #必须匹配match .spec.selector.matchLabels标签相同。
spec:
terminationGracePeriodSeconds: 60 #k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒
containers: #模板(容器模板)
- image: phpapache:latest #镜像名字
name: phpapache #node节点启动的容器名字,容器名称(docker ps)查看格式k8s_容器名称_Pod名称
imagePullPolicy: IfNotPresent #拉取镜像(选择方式——直接使用本地拥有的镜像)
ports:
- name: phpapache #SVC_名称,并且在pod中是唯一的(与svc的ports名称必须对应)
containerPort: 80 #容器开放的监听端口
resources: #资源
limits: #限制
memory: 500Mi
cpu: 200m #0.2代表200m
requests: #请求
memory: 250Mi
cpu: 100m #0.1代表100m
restartPolicy: Always #重新启动pod中所有容器的策略
---
apiVersion: v1
kind: Service #控制器
metadata:
labels:
app: phpapache #svc的标签名称
name: phpapache #svc名称
spec:
ports:
- name: phpapache #服务中此端口的名称。这必须是DNS标签全部ServiceSpec中的端口必须具有唯一的名称(与Pod的ports名称必须对应)
# 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
port: 80 #Port 的请求端口
protocol: TCP #TCP协议
targetPort: 80 #请求代理到使用TCP端口80,并且具有标签"app=phpapache" 的Pod上,默认情况下,targetPort 将被设置为与 port 字段相同的值。
nodePort: 30080 #宿主机暴露的服务端口,默认情况下随机分配一个端口号(默认:30000-32767)
selector:
app: phpapache #具有标签"app=phpapache" 的Pod加入到该svc中
type: NodePort #对外集群的外部访问
---
apiVersion: autoscaling/v2beta2 #api版本 autoscaling/v2beta2
kind: HorizontalPodAutoscaler #kind控制器
metadata:
name: phpapache #HPA的名字
spec:
scaleTargetRef:
apiVersion: apps/v1 #api版本
kind: Deployment #Deployment控制器
name: phpapache #Deployment控制器名字
minReplicas: 3 #最小的副本数
maxReplicas: 7 #最大的副本数
metrics:
- type: Resource #资源度量指标
resource:
name: cpu
target:
type: Utilization #利用率
averageUtilization: 10 #资源的百分比显示
3、生成资源清单
kubectl apply -f deployment_phav2_cpu.yaml
4、增加Pod负载
while true; do wget -q -O- http://10.110.149.220; done
5、停止负载
如上结果,不多说明
内存测试:
1、新建文件目录
mkdir -p /root/kubernetes/HPA/metrics-server/hpav2beta2/mem
2、书写资源清单
- configmap文件
vim configmapmem.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: increase-mem-config
data:
increase-mem.sh: |
#!/bin/bash
mkdir /tmp/memory
mount -t tmpfs -o size=500M tmpfs /tmp/memory
dd if=/dev/zero of=/tmp/memory/block
sleep 60
rm /tmp/memory/block
umount /tmp/memory
rmdir /tmp/memory
- deployment内存文件
vim deployment_phamem.yaml
apiVersion: apps/v1 #api版本
kind: Deployment #控制器
metadata:
labels:
app: phpapache
name: phpapache #Pod名称
spec:
replicas: 3 #启动副本数
selector: #设置标签
matchLabels:
app: phpapache #必须匹配.spec.template.metadata标签相同,查看标签(kubectl get pods --show-labels)
minReadySeconds: 5 #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
revisionHistoryLimit: 3 #要保留以允许回滚的旧复制集数
strategy: #策略
type: RollingUpdate #默认为滚动更新
rollingUpdate: #滚动更新
maxSurge: 1 #滚动升级时会先启动1个pod
maxUnavailable: 1 #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
template: #模板(相当于定义好的一个python中的模块)
metadata:
labels:
app: phpapache #必须匹配match .spec.selector.matchLabels标签相同。
spec:
terminationGracePeriodSeconds: 60 #k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒
containers: #模板(容器模板)
- image: phpapache:latest #镜像名字
#command: [ "bash","/etc/scrip/increase-mem.sh" ]
name: phpapache #node节点启动的容器名字,容器名称(docker ps)查看格式k8s_容器名称_Pod名称
imagePullPolicy: IfNotPresent #拉取镜像(选择方式——直接使用本地拥有的镜像)
ports:
- name: phpapache #SVC_名称,并且在pod中是唯一的(与svc的ports名称必须对应)
containerPort: 80 #容器开放的监听端口
resources: #资源
limits: #限制
memory: 500Mi
cpu: 200m #0.2代表200m
requests: #请求
memory: 250Mi
cpu: 100m #0.1代表100m
volumeMounts:
- name: increase-mem-script
mountPath: /etc/scrip
securityContext: #特权模式
privileged: true
volumes:
- name: increase-mem-script
configMap:
name: increase-mem-config
restartPolicy: Always #重新启动pod中所有容器的策略
---
apiVersion: v1
kind: Service #控制器
metadata:
labels:
app: phpapache #svc的标签名称
name: phpapache #svc名称
spec:
ports:
- name: phpapache #服务中此端口的名称。这必须是DNS标签全部ServiceSpec中的端口必须具有唯一的名称(与Pod的ports名称必须对应)
# 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
port: 80 #Port 的请求端口
protocol: TCP #TCP协议
targetPort: 80 #请求代理到使用TCP端口80,并且具有标签"app=phpapache" 的Pod上,默认情况下,targetPort 将被设置为与 port 字段相同的值。
nodePort: 30080 #宿主机暴露的服务端口,默认情况下随机分配一个端口号(默认:30000-32767)
selector:
app: phpapache #具有标签"app=phpapache" 的Pod加入到该svc中
type: NodePort #对外集群的外部访问
---
apiVersion: autoscaling/v2beta2 #autoscaling/v2beta2 的api
kind: HorizontalPodAutoscaler #kind控制器
metadata:
name: phpapache #HPA的名字
spec:
scaleTargetRef:
apiVersion: apps/v1 #api版本
kind: Deployment #Deployment控制器
name: phpapache #Deployment控制器名字
minReplicas: 3 #最小的副本数
maxReplicas: 7 #最大的副本数
metrics:
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 10
3、 生成资源清单
kubectl apply -f configmapmem.yaml -f deployment_phamem.yaml
4、登录容器测试
kubectl exec -it phpapache-55d498fd68-mf5wz -- sh /etc/scrip/increase-mem.sh
5、观察HPA的更新过程
其他查看官方简介
九、不同api版本HPA的yaml格式
百分比格式:
autoscaling/v1
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler #kind控制器
metadata:
name: phpapache #HPA的名字
spec:
scaleTargetRef:
apiVersion: apps/v1 #api版本
kind: Deployment #Deployment控制器
name: phpapache #Deployment控制器名字
minReplicas: 3 #最小的副本数
maxReplicas: 7 #最大的副本数
targetCPUUtilizationPercentage: 10 #触发HPA值
autoscaling/v2beta1
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler #kind控制器
metadata:
name: phpapache #HPA的名字
spec:
scaleTargetRef:
apiVersion: apps/v1 #api版本
kind: Deployment #Deployment控制器
name: phpapache #Deployment控制器名字
minReplicas: 3 #最小的副本数
maxReplicas: 7 #最大的副本数
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
name: memory
targetAverageUtilization: 50
autoscaling/v2beta2
apiVersion: autoscaling/v2beta2 #autoscaling/v2beta2 的api
kind: HorizontalPodAutoscaler #kind控制器
metadata:
name: phpapache #HPA的名字
spec:
scaleTargetRef:
apiVersion: apps/v1 #api版本
kind: Deployment #Deployment控制器
name: phpapache #Deployment控制器名字
minReplicas: 3 #最小的副本数
maxReplicas: 7 #最大的副本数
metrics:
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 10
name: cpu
target:
type: Utilization #利用率
averageUtilization: 20 #资源的百分比显示
显示值:
apiVersion: autoscaling/v2beta2 #autoscaling/v2beta2 的api
kind: HorizontalPodAutoscaler #kind控制器
metadata:
name: phpapache #HPA的名字
spec:
scaleTargetRef:
apiVersion: apps/v1 #api版本
kind: Deployment #Deployment控制器
name: phpapache #Deployment控制器名字
minReplicas: 3 #最小的副本数
maxReplicas: 7 #最大的副本数
metrics:
- type: Resource
resource:
name: cpu
target:
type: AverageValue #利用率
averageValue: 10 #资源的直接值显示