性能分析和调优的基本工具: 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

http://192.168.118.20:30900/

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

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐