kubernetes监控搭建
·
性能分析和调优的基本工具: kubectl top
不过默认情况下这个命令不会生效,必须要安装一个插件 Metrics Server 才可以。
自动伸缩
HPA Horizontal Pod Autoscaler 水平 Pod 自动伸缩
VPA Vertical Pod Autoscaler 垂直 Pod 自动伸缩
伸缩的目标:
Deployment
statefulSet
安装插件 Metrics Server
kubectl apply -f metrics-server-1.21+.yaml
kubectl -n kube-system get pods # 放在了kube-system的命名空间下
#然后就可以采集显示了
kubectl top pods

HorizontalPodAutoscaler 的能力完全基于 Metrics Server,它从 Metrics Server 获取当前应用的运行指标,主要是 CPU 使用率,再依据预定的策略增加或者减少 Pod 的数量。
定时从 kubelet cAdvisor 采集监控数据
使用HPA
vim nginx-hpa-v2.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
maxReplicas: 10 # Pod 数量的最大值,也就是扩容的上限。
minReplicas: 2 # Pod 数量的最小值,也就是缩容的下限。
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-hpa # deployment name
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 5 # 60%;CPU 使用率指标,当大于这个值时扩容,小于这个值时缩容。
#需要创建一个deployment
vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-hpa
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx-hpa
template:
metadata:
labels:
app: nginx-hpa
spec:
containers:
- name: nginx
image: registry.cn-beijing.aliyuncs.com/xxhf/nginx:1.22.1
ports:
- containerPort: 80
resources:
requests:
cpu: 50m
memory: 10Mi
limits:
cpu: 100m
memory: 20Mi
---
apiVersion: v1
kind: Service
metadata:
name: nginx-hpa-svc
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx-hpa
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-hpa-v2.yaml
kubectl get hpa
压测测试
压测工具
ab (apache httpd )
Jmeter
# 进入测试环境
kubectl run test -it --image=httpd:alpine -- sh
# 使用ab压测
ab -c 10 -t 60 -n 100000 'http://nginx-hpa-svc/'
-c : 代表并发量
-t : 请求多久,这里是60秒
-n : 请求数量
搭建Prometheus监控+kubernetes集群
利用job和service discovery服务发现
Kube-prometheus 包含的组件:
- The Prometheus Operator
- Highly available Prometheus
- Highly available Alertmanager
- Prometheus node-exporter
- Prometheus Adapter for Kubernetes Metrics APIs #可以代替 Metrics Server 做HPA
- kube-state-metrics
- Grafana

Operator
Operator 是由 CoreOS 开发的,用来扩展 Kubernetes API(原生的有50多个对象),特定的应用程序的控制器,它用来创建、配置和管理复杂的有状态应用,如数据库、缓存和监控系统。
怎样实现kubectl get mysql、kubectl get Prometheus?
通过 CRD(Custom Resource Definition) 自定义资源定义/声明
kubectl api-resources | grep customresourcedefinitions
vim resourcedefinition.yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
# 名字必需与下面的 spec 字段匹配,并且格式为 '<名称的复数形式>.<组名>'
name: crontabs.stable.example.com
spec:
# 组名称,用于 REST API: /apis/<组>/<版本>
group: stable.example.com
# 列举此 CustomResourceDefinition 所支持的版本
versions:
- name: v1
# 每个版本都可以通过 served 标志来独立启用或禁止
served: true
# 其中一个且只有一个版本必需被标记为存储版本
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
cronSpec:
type: string
image:
type: string
replicas:
type: integer
# 可以是 Namespaced 或 Cluster
scope: Namespaced
names:
# 名称的复数形式,用于 URL:/apis/<组>/<版本>/<名称的复数形式>
plural: crontabs
# 名称的单数形式,作为命令行使用时和显示时的别名
singular: crontab
# kind 通常是单数形式的驼峰命名(CamelCased)形式。你的资源清单会使用这一形式。
kind: CronTab
# shortNames 允许你在命令行使用较短的字符串来匹配资源
shortNames:
- ct
kubectl apply -f resourcedefinition.yaml
kubectl api-resources | grep crontabs #自定义的资源
kubectl explain crontabs.spec

# 使用 CRD 就可以自定义资源 mysql、prometheus
CR 代表 自定义资源(Custom Resource)是一种扩展 Kubernetes API 的方式,允许用户定义自己的资源类型和规范。它们允许用户在Kubernetes中创建和管理自定义资源对象,这些对象可以与Kubernetes核心资源(如Pod、Service、Deployment等)一样进行操作。
CRD(Custom Resource Definition)是一种 Kubernetes 资源,用于定义 CR 的结构和行为。通过创建CRD对象,用户可以定义新的 CR 类型,包括它们的API结构、字段、验证规则和操作行为。
通过使用CR和CRD,用户可以扩展Kubernetes的功能,以适应特定的应用需求。它们提供了一种自定义资源的机制,使用户能够以声明的方式定义和操作自己的资源类型,而无需修改Kubernetes核心代码。
# 安装 Operator
kubectl create -f 01-bundle.yaml # 写不来,直接用就行了
kubectl apply -f 02-rbac.yaml # Prometheus监控取数据用的
kubectl api-resources | grep monitoring
# 可以get prometheus和alertmanager了
kubectl get prometheus/alertmanager
# 部署一个Prometheus
vim prometheus.yaml
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
spec:
replicas: 1
serviceAccountName: prometheus
serviceMonitorSelector: # 找ServiceMonitor,通过标签定位
matchLabels:
team: frontend # 归哪个Prometheus管理
podMonitorSelector:
matchLabels:
team: frontend
resources:
requests:
memory: 400Mi
enableAdminAPI: false
kubectl get pods
Prometheus Operator 就是一个控制器控制刚才kubectl api-resources | grep monitoring 的一堆CR的
# 同样的alertmanager也能起来
vim alertmanager.yaml
apiVersion: monitoring.coreos.com/v1
kind: Alertmanager
metadata:
name: example
spec:
replicas: 1
kubectl get statefulsets.apps # 有状态应用,应该有statefulsets
# 创建一个svc暴露 Prometheus和alertmanager,加配置
vim prometheus-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: prometheus
spec:
type: NodePort
ports:
- name: web
nodePort: 30900
port: 9090
protocol: TCP
targetPort: web
selector:
prometheus: prometheus
kubectl get svc
http://192.168.118.20:30900/
# 开始添加job来寻找监控对象
监控 pod,如何找到 pod, Service Discovery
servicemonitors(重点) 和 podMonitor
servicemonitors 找到要监控的 Pod IP 信息,通过标签
servicemonitors 创建之后,自动在 prometheus 配置文件中添加 Job

vim serviceMonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: example-app
labels:
team: frontend # 和上方prometheus.yaml有关联
spec:
selector:
matchLabels:
app: example-app # 这是我们要监控的svc lable
endpoints:
- port: web
kubectl apply -f serviceMonitor.yaml
# 监控的目标
vim example-app-dep.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-app
spec:
replicas: 3
selector:
matchLabels:
app: example-app
template:
metadata:
labels:
app: example-app
spec:
containers:
- name: example-app
image: registry.cn-beijing.aliyuncs.com/xxhf/instrumented_app
imagePullPolicy: IfNotPresent
ports:
- name: web
containerPort: 8080
vim example-app-svc.yaml
kind: Service
apiVersion: v1
metadata:
name: example-app
labels:
app: example-app
spec:
selector:
app: example-app
ports:
- name: web
port: 8080
kubectl apply -f example-app-dep.yaml -f example-app-svc.yaml
kubectl get svc -l app=example-app
kubectl describe svc example-app
部署 prometheus.yaml
修改配置文件 servicemonitors 自动在 prometheus 配置文件中添加 Job
云拨测

This content is available in Anytype.
Follow link to ask a permission to get the content
更多推荐



所有评论(0)