k8s之第三方组件

1 ​​Metrics Server​

​Metrics Server​​ 是一个集群范围内的资源指标聚合器,<font color="#9bbb59">它是 Kubernetes 监控体系中的重要组件之一,主要用于为 Kubernetes 的自动扩缩容(如 Horizontal Pod Autoscaler, HPA)和其他需要实时资源使用数据的控制器提供 CPU、内存等基础指标。</font>


1.1 一、Metrics Server 的作用

Metrics Server 的主要功能包括:

  1. ​收集资源使用指标​
    它会定期从每个节点上的 Kubelet 的 Summary API 中获取 CPU、内存等资源的使用情况。

  2. ​提供指标查询接口​
    通过 Kubernetes 的 API 机制(通常位于 /apis/metrics.k8s.io),其他组件(如 HPA 控制器)可以查询这些指标数据。

  3. ​支持自动扩缩容​
    HPA 控制器依赖 Metrics Server 提供的指标数据来决定是否需要扩缩容 Pod 副本数量。

⚠️ 注意:Metrics Server ​​不存储历史数据​​,它只是一个实时指标提供者。如果需要长期存储和更复杂的监控(如图表、告警),需要配合 Prometheus 等工具使用。


1.2 二、Metrics Server 的工作原理

  1. Metrics Server 作为一个 Pod 运行在 Kubernetes 集群中(通常部署在 kube-system 命名空间)。
  2. 它通过调用每个节点上 Kubelet 的 /metrics/resource 接口来获取资源使用数据。
  3. 将这些指标数据存储在内存中,并通过 Kubernetes 的 API Server 暴露给其他组件使用(如 HPA)。
  4. 其他控制器(如 HPA)通过调用 Kubernetes API 来获取这些指标,以做出扩缩容决策。

1.3 三、Metrics Server 的部署

 wget http://192.168.14.253/Resources/Kubernetes/Add-ons/metrics-server/0.6.x/high-availability-1.21%2B.yaml

		2.2 编辑配置文件
[root@master231 ~]# vim high-availability-1.21+.yaml 
...
114 apiVersion: apps/v1
115 kind: Deployment
116 metadata:
...
144       - args:
145         - --kubelet-insecure-tls  # 不要验证Kubelets提供的服务证书的CA。不配置则会报错x509。
            ...
...         image: registry.aliyuncs.com/google_containers/metrics-server:v0.7.2


		2.3 部署metrics-server组件
[root@master231 ~]# kubectl apply -f high-availability-1.21+.yaml 
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
poddisruptionbudget.policy/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
[root@master231 ~]# 
		2.4 查看镜像是否部署成功
[root@master231 metrics-server]# kubectl get pods,svc -n kube-system  -l k8s-app=metrics-server -o wide
NAME                                  READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
pod/metrics-server-57c6f647bb-727dz   1/1     Running   0          3m56s   10.100.203.130   worker232   <none>           <none>
pod/metrics-server-57c6f647bb-bm6tb   1/1     Running   0          3m56s   10.100.140.120   worker233   <none>           <none>

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE     SELECTOR
service/metrics-server   ClusterIP   10.200.10.142   <none>        443/TCP   3m56s   k8s-app=metrics-server
[root@master231 metrics-server]# 

1.4 四、验证 Metrics Server 是否工作正常

你可以使用以下命令查看某个 Pod 的资源使用情况(需安装 kubectl top 命令,它依赖 Metrics Server):

kubectl top pod

或者查看节点的资源使用情况:

kubectl top node

如果这些命令能正常返回数据,说明 Metrics Server 工作正常。


1.5 五、与 Kubernetes 监控生态的关系

组件 作用
​Metrics Server​ 提供实时资源指标(CPU/内存),用于 HPA 等控制器
​Kube-state-metrics​ 提供集群中各种资源对象的状态指标(如 Pod 数量、Deployment 状态等)
​Prometheus​ 更全面的监控系统,可采集各类指标并支持告警、历史数据存储、可视化(如 Grafana)
​kubectl top​ 基于 Metrics Server 的命令行工具,用于查看节点和 Pod 的资源使用情况

Metrics Server 是轻量级的指标聚合器,适合用于自动扩缩容;而 Prometheus 更适合用于生产环境的全面监控和告警。


1.6 六、常见限制与注意事项

  1. ​不支持历史数据查询​
    Metrics Server 只保留最近的数据,无法用于历史数据分析或趋势图表。

  2. ​依赖 Kubelet 的 metrics 接口​
    如果 Kubelet 的 metrics 接口不可用(如配置错误或安全策略限制),Metrics Server 将无法工作。

  3. ​需要 RBAC 权限​
    Metrics Server 需要有权限访问 Kubelet 的 API,因此必须正确配置 RBAC。

  4. ​不支持所有资源类型的指标​
    默认只支持 CPU 和内存,如果需要其他指标(如磁盘、网络等),需要配合其他组件(如 kube-state-metrics 或 Prometheus)。


1.7 七、总结

Metrics Server 是 Kubernetes 中一个轻量级、关键的组件,为自动扩缩容和其他需要实时资源指标的功能提供数据支持。它是 HPA 的“眼睛”,虽然功能相对简单,但在 Kubernetes 的监控体系中扮演着不可或缺的角色。对于更复杂的监控需求,可以结合 Prometheus、Grafana 等工具进行扩展。

2 coreDNS

[[k8s之services#3 附加组件coreDNS !!!!!]]

3 dashboard

- 部署dashboard极速入门
	是一款图形化管理K8S集群的解决方案。
参考链接:
	https://github.com/kubernetes/dashboard/releases?page=9
	
	
	1.下载资源清单 
[root@master231 dashboard]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml


SVIP:
[root@master231 ~]# wget http://192.168.14.253/Resources/Kubernetes/Add-ons/dashboard/01-dashboard.yaml


	2.导入镜像 
[root@worker232 ~]# wget http://192.168.14.253/Resources/Kubernetes/Add-ons/dashboard/oldboyedu-dashboard-v2.5.1.tar.gz
[root@worker232 ~]# docker load -i oldboyedu-dashboard-v2.5.1.tar.gz 
[root@worker232 ~]# docker tag harbor.oldboyedu.com/oldboyedu-add-ons/dashboard:v2.5.1 harbor250.oldboyedu.com/oldboyedu-add-ons/dashboard:v2.5.1
[root@worker232 ~]# 
[root@worker232 ~]# docker push harbor250.oldboyedu.com/oldboyedu-add-ons/dashboard:v2.5.1

[root@worker232 ~]# wget http://192.168.14.253/Resources/Kubernetes/Add-ons/dashboard/oldboyedu-metrics-scraper-v1.0.7.tar.gz
[root@worker232 ~]# docker load -i oldboyedu-metrics-scraper-v1.0.7.tar.gz 
[root@worker232 ~]# docker tag harbor.oldboyedu.com/oldboyedu-add-ons/metrics-scraper:v1.0.7 harbor250.oldboyedu.com/oldboyedu-add-ons/metrics-scraper:v1.0.7
[root@worker232 ~]# 
[root@worker232 ~]# docker push harbor250.oldboyedu.com/oldboyedu-add-ons/metrics-scraper:v1.0.7

	
	3.修改资源清单 
[root@master231 ~]# vim 01-dashboard.yaml 
	- 1.将8443的svc的类型改为LoadBalancer;
	- 2.修改2个镜像的名称即可;
	
	
	4.部署服务 
[root@master231 dashboard]# kubectl apply -f 01-dashboard.yaml 
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
[root@master231 dashboard]# 
 
	
	5.查看资源 
[root@master231 dashboard]# kubectl get pods,svc -n kubernetes-dashboard 
NAME                                            READY   STATUS    RESTARTS   AGE
pod/dashboard-metrics-scraper-9d986c98c-x8gzf   1/1     Running   0          23s
pod/kubernetes-dashboard-5ccf77bb87-sd7z7       1/1     Running   0          23s

NAME                                TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/dashboard-metrics-scraper   ClusterIP      10.200.253.69   <none>        8000/TCP       23s
service/kubernetes-dashboard        LoadBalancer   10.200.75.249   10.0.0.153    443:8443/TCP   23s
[root@master231 dashboard]# 



	6.访问Dashboard 
https://10.0.0.153/#/login

输入神秘代码: "thisisunsafe".


	
	7.基于token登录实战
		7.1 创建sa
[root@master231 dashboard]# kubectl create serviceaccount cmy -o yaml --dry-run=client > 02-sa.yaml
[root@master231 dashboard]# 
[root@master231 dashboard]# vim 02-sa.yaml 
[root@master231 dashboard]# 
[root@master231 dashboard]# cat  02-sa.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: cmy
[root@master231 dashboard]# 
[root@master231 dashboard]# kubectl apply -f 02-sa.yaml 
serviceaccount/cmy created
[root@master231 dashboard]# 
[root@master231 dashboard]# kubectl get -f 02-sa.yaml 
NAME      SECRETS   AGE
cmy   1         5s
[root@master231 dashboard]# 
[root@master231 dashboard]# kubectl get sa cmy 
NAME      SECRETS   AGE
cmy   1         13s
[root@master231 dashboard]# 
 
		7.2 将sa和内置集群角色绑定
[root@master231 dashboard]# kubectl create clusterrolebinding dashboard-cmy  --clusterrole=cluster-admin --serviceaccount=default:cmy -o yaml --dry-run=client > 03-clusterrolebinding-sa.yaml
[root@master231 dashboard]# 
[root@master231 dashboard]# vim 03-clusterrolebinding-sa.yaml 
[root@master231 dashboard]# 
[root@master231 dashboard]# cat 03-clusterrolebinding-sa.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dashboard-cmy
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: cmy
  namespace: default
[root@master231 dashboard]# 
[root@master231 dashboard]# kubectl apply -f  03-clusterrolebinding-sa.yaml 
clusterrolebinding.rbac.authorization.k8s.io/dashboard-cmy created
[root@master231 dashboard]# 
[root@master231 dashboard]# kubectl get clusterrolebindings dashboard-cmy
NAME                ROLE                        AGE
dashboard-cmy   ClusterRole/cluster-admin   11s
[root@master231 dashboard]# 
[root@master231 dashboard]# kubectl get clusterrolebindings dashboard-cmy -o wide
NAME                ROLE                        AGE   USERS   GROUPS   SERVICEACCOUNTS
dashboard-cmy   ClusterRole/cluster-admin   44s                    default/cmy
[root@master231 dashboard]# 
 
		7.3 浏览器使用token登录
 
[root@master231 dashboard]# kubectl get secrets `kubectl get sa cmy -o jsonpath='{.secrets[0].name}'` -o jsonpath='{.data.token}' |base64 -d ; echo
eyJhbGciOiJSUzI1NiIsImtpZCI6IlNCUF9mT01TOHVleGIxc1JvdzdzODhPMVg2YmExdm5weWpJZ3BLUDVNQWcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImxpbnV4OTctdG9rZW4tcGZmeHgiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoibGludXg5NyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImU4YmZkMTE0LWY5NzItNGQyZC1iYjI4LTY4NWFiZTMxMjE1OSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmxpbnV4OTcifQ.Y5UNPod7a5HyjJjia_a25lARq9aZT9sS50rH9I9-j8ldYNeoZybMC0vohPBCnEy_aVknNNzTn2WTCQaN0wKg6dIjQNCvodegmf_h8yU0u63KGB5XggkcJvSdA7OeehAViZ9c-u9vQF_WsT4PujSw73aqhbGbtazmvgCrxOTYNYE0ZyPwqibGvm7kqmSnDiE_0ajX2tNR3G-OSGUbZF-FeZeJdEJ8QJsOct63wTyBNnmlFEebuVr9QELMgtNrzIvZjIOdfb0VhV1mFLqqFQymtmRuGQDbIisgv_ci6EUjwl41A_myceuclbzcFKiO4pIk9VKQdjmj3BjpodNA1ArRUw
[root@master231 dashboard]# 





- 使用Kubeconfig授权登录实战(彩蛋)
	1.创建kubeconfig文件
cat > oldboyedu-generate-context-conf.sh <<'EOF'
#!/bin/bash
# auther: Jason Yin


# 获取secret的名称
SECRET_NAME=`kubectl get sa cmy -o jsonpath='{.secrets[0].name}'`

# 指定API SERVER的地址
API_SERVER=10.0.0.231:6443

# 指定kubeconfig配置文件的路径名称
KUBECONFIG_NAME=./oldboyedu-k8s-dashboard-admin.conf

# 获取用户的tocken
TOCKEN=`kubectl get secrets $SECRET_NAME -o jsonpath={.data.token} | base64 -d`

# 在kubeconfig配置文件中设置群集项
kubectl config set-cluster oldboyedu-k8s-dashboard-cluster --server=$API_SERVER --kubeconfig=$KUBECONFIG_NAME

# 在kubeconfig中设置用户项
kubectl config set-credentials oldboyedu-k8s-dashboard-user --token=$TOCKEN --kubeconfig=$KUBECONFIG_NAME

# 配置上下文,即绑定用户和集群的上下文关系,可以将多个集群和用户进行绑定哟~
kubectl config set-context oldboyedu-admin --cluster=oldboyedu-k8s-dashboard-cluster --user=oldboyedu-k8s-dashboard-user --kubeconfig=$KUBECONFIG_NAME

# 配置当前使用的上下文
kubectl config use-context oldboyedu-admin --kubeconfig=$KUBECONFIG_NAME
EOF

bash oldboyedu-generate-context-conf.sh



	2.注销并基于kubeconfig文件登录
略,见视频。

4 kuboard

- kuboard快速入门实战
	官网地址:
		https://kuboard.cn/

	参考链接:
		https://kuboard.cn/install/v3/install-in-k8s.html

	1.部署kuboard
[root@master231 kuboard]# wget  https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
[root@master231 kuboard]# kubectl apply -f  kuboard-v3-swr.yaml 
namespace/kuboard created
configmap/kuboard-v3-config created
serviceaccount/kuboard-boostrap created
clusterrolebinding.rbac.authorization.k8s.io/kuboard-boostrap-crb created
daemonset.apps/kuboard-etcd created
deployment.apps/kuboard-v3 created
service/kuboard-v3 created
[root@master231 kuboard]# 
[root@master231 kuboard]# kubectl get pods -n kuboard  -o wide
NAME                               READY   STATUS    RESTARTS        AGE     IP            NODE        NOMINATED NODE   READINESS GATES
kuboard-agent-2-55b9bfbb7c-89nff   1/1     Running   2 (2m43s ago)   2m55s   10.100.0.56   master231   <none>           <none>
kuboard-agent-6f4885bcd7-7xzz8     1/1     Running   2 (2m44s ago)   2m55s   10.100.0.55   master231   <none>           <none>
kuboard-etcd-trt8q                 1/1     Running   0               3m58s   10.0.0.231    master231   <none>           <none>
kuboard-v3-685dc9c7b8-bhqfw        1/1     Running   0               3m58s   10.100.0.54   master231   <none>           <none>
[root@master231 kuboard]# 


镜像地址:
	http://192.168.14.253/Resources/Kubernetes/Project/kuboard/kuboard-on-k8s/kuboard-v3-swr.yaml



	2.访问 Kuboard
[root@master231 kuboard]# kubectl get svc -n kuboard  
NAME         TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                                        AGE
kuboard-v3   NodePort   10.200.117.52   <none>        80:30080/TCP,10081:30081/TCP,10081:30081/UDP   4m36s
[root@master231 kuboard]# 


在浏览器中打开链接 http://10.0.0.233:30080

输入初始用户名和密码,并登录

用户名: admin
密码: Kuboard123





- 基于docker的方式部署kuboard
	参考链接:
		https://kuboard.cn/install/v3/install-built-in.html
		
	1.删除资源
[root@master231 kuboard]# kubectl delete -f kuboard-v3-swr.yaml 



	2.基于docker运行kuboard
[root@node-exporter43 ~]# docker run -d \
  --restart=unless-stopped \
  --name=kuboard \
  -p 80:80/tcp \
  -p 10081:10081/tcp \
  -e KUBOARD_ENDPOINT="http://0.0.0.0:80" \
  -e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
  -v /root/kuboard-data:/data \
  swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3
  
 
	3.访问kuboard 
http://10.0.0.43/

用户名: admin
密 码: Kuboard123
	
	
	4.添加K8S集群 
略,见视频。


 
其他相似产品:
	- Rancher 
	- kubesphere


5 kube-state-metrics

是 Kubernetes 的一个附加组件,它监听 Kubernetes API Server,并生成关于集群资源(如 Deployment、Pod、Service 等)的状态指标,供 Prometheus 等监控系统采集 dashboard 15661


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: kube-state-metrics
    app.kubernetes.io/version: 2.4.1
  name: kube-state-metrics
rules:
- apiGroups:
  - ""
  resources:
  - configmaps
  - secrets
  - nodes
  - pods
  - services
  - resourcequotas
  - replicationcontrollers
  - limitranges
  - persistentvolumeclaims
  - persistentvolumes
  - namespaces
  - endpoints
  verbs:
  - list
  - watch
- apiGroups:
  - apps
  resources:
  - statefulsets
  - daemonsets
  - deployments
  - replicasets
  verbs:
  - list
  - watch
- apiGroups:
  - batch
  resources:
  - cronjobs
  - jobs
  verbs:
  - list
  - watch
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  verbs:
  - list
  - watch
- apiGroups:
  - authentication.k8s.io
  resources:
  - tokenreviews
  verbs:
  - create
- apiGroups:
  - authorization.k8s.io
  resources:
  - subjectaccessreviews
  verbs:
  - create
- apiGroups:
  - policy
  resources:
  - poddisruptionbudgets
  verbs:
  - list
  - watch
- apiGroups:
  - certificates.k8s.io
  resources:
  - certificatesigningrequests
  verbs:
  - list
  - watch
- apiGroups:
  - storage.k8s.io
  resources:
  - storageclasses
  - volumeattachments
  verbs:
  - list
  - watch
- apiGroups:
  - admissionregistration.k8s.io
  resources:
  - mutatingwebhookconfigurations
  - validatingwebhookconfigurations
  verbs:
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - networkpolicies
  - ingresses
  verbs:
  - list
  - watch
- apiGroups:
  - coordination.k8s.io
  resources:
  - leases
  verbs:
  - list
  - watch

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: kube-state-metrics
    app.kubernetes.io/version: 2.4.1
  name: kube-state-metrics
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kube-state-metrics
subjects:
- kind: ServiceAccount
  name: kube-state-metrics
  namespace: kube-system
---

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: kube-state-metrics
    app.kubernetes.io/version: 2.4.1
  name: kube-state-metrics
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: kube-state-metrics
  template:
    metadata:
      labels:
        app.kubernetes.io/component: exporter
        app.kubernetes.io/name: kube-state-metrics
        app.kubernetes.io/version: 2.4.1
    spec:
      automountServiceAccountToken: true
      containers:
      - image: harbor.cmy.cn/kube-state-metrics/kube-state-metrics:v2.4.2
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 5
          timeoutSeconds: 5
        name: kube-state-metrics
        ports:
        - containerPort: 8080
          name: http-metrics
        - containerPort: 8081
          name: telemetry
        readinessProbe:
          httpGet:
            path: /
            port: 8081
          initialDelaySeconds: 5
          timeoutSeconds: 5
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          readOnlyRootFilesystem: true
          runAsUser: 65534
      nodeSelector:
        kubernetes.io/os: linux
      serviceAccountName: kube-state-metrics
---

apiVersion: v1
automountServiceAccountToken: false
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: kube-state-metrics
    app.kubernetes.io/version: 2.4.1
  name: kube-state-metrics
  namespace: kube-system
---

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: kube-state-metrics
    app.kubernetes.io/version: 2.4.1
  name: kube-state-metrics
  namespace: kube-system
spec:
  type: LoadBalancer
  ports:
  - name: http-metrics
    port: 8080
    targetPort: http-metrics
  - name: telemetry
    port: 8081
    targetPort: telemetry
  selector:
    app.kubernetes.io/name: kube-state-metrics


6 VPA

​Vertical Pod Autoscaler(VPA)​​ 是 Kubernetes 的一个自动扩缩容组件,它​​根据容器的实际资源使用情况,动态调整 Pod 的资源请求(requests)和限制(limits)​​,而不是像 HPA(Horizontal Pod Autoscaler)那样通过增加或减少 Pod 的副本数来扩展应用。
一文带你掌握Kubernetes VPA(Pod纵向自动扩缩)-腾讯云开发者社区-腾讯云

VPA 的工作原理

VPA 主要由三个核心组件组成:

  1. ​VPA Recommender​​:

    • 分析历史资源使用数据(来自 Metrics Server 或其他监控系统)。
    • 根据分析结果,计算出推荐的资源请求(requests)和限制(limits)。
  2. ​VPA Updater​​:

    • 监控 Pod 的资源设置。
    • 当推荐的资源与当前设置不一致时,​​更新 Pod 的资源请求和限制​​(可能需要重建 Pod)。
  3. ​VPA Admission Controller​​(可选):

    • 在 Pod 创建时,自动应用推荐的资源设置,避免手动配置。

VPA 通常与 ​​Metrics Server​​(或 Prometheus + Kube-state-metrics)配合使用,以获取容器的资源使用数据。


VPA 的更新策略

VPA 支持三种更新策略,用于控制如何应用资源更新:

  1. ​Auto​​(自动):

    • VPA 会自动删除并重新创建 Pod,以应用新的资源设置。
    • ​适用于无状态应用​​,因为 Pod 会被重建。
  2. ​Initial​​:

    • 只在 Pod 创建时应用推荐的资源设置,之后不再更新。
    • 适用于希望初始资源设置合理,但不希望后续自动调整的场景。
  3. ​Off​​:

    • VPA 仅提供资源推荐,不进行任何自动更新。
    • 适用于需要人工审核后再调整资源的场景。
下一篇