tshxawen

kubernetes第八次课

prometheus采用pull方式拉取指定目标实例的监控数据,也就是定时去目标主机上抓取metrics数据,每一个被抓取的目标需要暴露一个HTTP接口,prometheus通过这个暴露的接口就可以获取到相应的指标数据,这种方式需要由目标服务决定采集的目标有哪些,通过配置在scrape_configs中指定目标节点,但是无法动态感知新的节点,即如果后面增加了节点或者删除节点,就得手动修promrtheus的配置文件,并重启 promethues,因此后期维护很不方便,所以出现了动态服务发现机制,动态服务发现能够使prometheus自动发现集群中的新目标,并对其进行数据采集,通过服务发现机制使Prometheus能自动获取到需要监控的Target列表,然后轮询这些Target获取监控数据。
prometheus常用的服务发现类型:
 
kubernetes_sd_configs: #基于Kubernetes API实现的服务发现,让prometheus动态发现kubernetes中被监控的目标static_configs: #静态服务发现,基于prometheus配置文件指定的监控目标
发现的目标得有数据指标暴漏接口  数据指标收集器把数据指标收集起来  通过一个api暴露出来
例如采集node 节点数据  普罗米修斯找k8s的api,api有node信息 pod信息 都存在了etcd, k8s的api会到etcd中查找数据,查完之后返回普鲁米修斯 根据查到的目标信息进行数据采集 
dns_sd_configs: #DNS 服务发现监控目标
consul_sd_configs: #Consul 服务发现,基于consul服务动态发现监控目标
file_sd_configs: #基于指定的文件实现服务发现,基于指定的文件发现监控目标
 
服务发现网站
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#configuration-file
label类型:
source_labels:源标签,没有经过relabel处理之前的标签名字
target_label:通过action处理之后的新的标签名字
regex:给定的值或正则表达式匹配,匹配源标签的值
replacement:通过分组替换后标签(
target_label)对应的/()/() $1:$2
 

 

 

服务发现

什么地方做服务发现, 发现什么(通过正则匹配),数据是否需要重新  

发现node

    - job_name: 'kubernetes-node'
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)

 

 

基于apiserver做发现

root@k8s-master2:~/1.prometheus-case-files# kubectl exec -it busybox sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ls /var/run/secrets/kubernetes.io/serviceaccount/ca.crt

/ # md5sum /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
e4f29a8484064c151cfac6a556f7e755 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
/ # exit
root@k8s-master2:~/1.prometheus-case-files# md5sum /etc/kubernetes/ssl/ca.pem
e4f29a8484064c151cfac6a556f7e755 /etc/kubernetes/ssl/ca.pem

- job_name: 'kubernetes-apiserver' #job名称
  kubernetes_sd_configs: #基于kubernetes_sd_configs实现服务发现
  - role: endpoints #发现类型为endpoints
  scheme: https #当前jod使用的发现协议
  tls_config: #证书配置
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt #容器里的证书路径
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token #容器里的token路径
  relabel_configs: #重新re修改标签label配置configs
  - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] #源标签,
  即对哪些标签进行操作
    action: keep #action定义了relabel的具体动作,action支持多种
    regex: default;kubernetes;https #指定匹配条件、只发现default命名空间的kubernetes服务后面的endpoint并且是https协议
 
 
Prometheus服务发现基础:
action简介:
replace: #替换标签值,根据regex正则匹配到源标签的值,使用replacement来引用表达式匹配的分组。
keep: #满足regex正则条件的实例进行采集,把source_labels中没有匹配到regex正则内容的Target实例丢掉,即只采集匹配成功的实例。
drop: #满足regex正则条件的实例不采集,把source_labels中匹配到regex正则内容的Target实例丢掉,即只采集没有匹配到的实例。
labelmap:#匹配regex所有标签名称,然后复制匹配标签的值进行分组,可以通过replacement分组引用(${1},${2},…)替代
labelkeep:匹配regex所有标签名称,其它不匹配的标签都将从标签集中删除
labeldrop:匹配regex所有标签名称,其它匹配的标签都将从标签集中删除
hashmod:使用hashmod计算source_labels的Hash值并进行对比,基于自定义的模数取模,以实现对目标进行分类、重新赋值等功能:

root@k8s-master2:~/1.prometheus-case-files# kubectl get ep
NAME         ENDPOINTS                                                            AGE
kubernetes 10.4.7.134:6443,10.4.7.135:6443,10.4.7.136:6443 3d4h

Prometheus服务发现示例:
api-server的主要指标数据:
Apiserver组件是k8s集群的入口,所有请求都是从apiserver进来的,所以对apiserver指标做监控可以用来判断集群的健康状况。
apiserver_request_total:
以下promQL语句为查询apiserver最近一分钟不同方法的请求数量统计,apiserver_request_total为请求各个服务的访问详细统计:
sum(rate(apiserver_request_total[10m])) by (resource,subresource,verb)

 

基于service做发现

通过service发现端点

    - job_name: 'kubernetes-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: kubernetes_name
 

关于annotation_prometheus_io_scrape及kubernetes_service_annotation_prometheus_io_port:
在k8s中,如果deployment的yaml文件指定了annotation_prometheus_io_scrape及kubernetes_service_annotation_prometheus_io_port,那么基于prometheus的发现规则,需要在被发现
的目的target定义注解匹配annotation_prometheus_io_scrape的值为true和kubernetes_service_annotation_prometheus_io_port对应的端口号如9153,且必须匹配成功该注解才会
保留监控target,然后再进行数据抓取并进行标签替换,主要用于精确匹配目的target(过滤掉不匹配的其它target):
查看注解信息

查看cadvisor数据

curl --cacert /etc/kubernetes/ssl/ca.pem -H "Authorization: Bearer $" https://10.4.7.134:6443/api/v1/nodes/10.4.7.137/proxy/metrics/cadvisor
 
基于pod做服务发现
    - job_name: 'kubernetes-nginx-pods'
      kubernetes_sd_configs:
      - role: pod
        namespaces: #可选指定namepace,如果不指定就是发现所有的namespace中的pod
          names:
          - myserver
          - magedu
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: kubernetes_pod_name
 
root@k8s-master2:~/1.prometheus-case-files# cat case3-4-nginx.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    app: magedu-nginx-deployment-label
  name: magedu-nginx-deployment
  namespace: magedu
spec:
  replicas: 1
  selector:
    matchLabels:
      app: magedu-nginx-selector
  template:
    metadata:
      labels:
        app: magedu-nginx-selector
      annotations:
        prometheus.io/port: "9913"
        prometheus.io/scrape: "true"
    spec:
      containers:
      - name: magedu-nginx-container
        image: gaciaga/nginx-vts:1.11.12-alpine-vts-0.1.14
        #imagePullPolicy: IfNotPresent
        imagePullPolicy: Always
        ports:
        - containerPort: 80
          protocol: TCP
          name: http
        - containerPort: 443
          protocol: TCP
          name: https
        env:
          - name: "password"
            value: "123456"
          - name: "age"
            value: "20"
        #resources:
        #  limits:
        #    cpu: 500m
        #    memory: 512Mi
        #  requests:
        #    cpu: 500m
        #    memory: 256Mi
      - name: magedu-nginx-exporter-container
        image: sophos/nginx-vts-exporter
        args:
          - '-nginx.scrape-uri=http://127.0.0.1/status/format/json'
        ports:
          - containerPort: 9113

---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: magedu-nginx-service-label
  name: magedu-nginx-service
  namespace: magedu
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30092
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
    nodePort: 30093
  selector:
    app: magedu-nginx-selector
 
root@k8s-master2:~/1.prometheus-case-files# kubectl apply -f case3-4-nginx.yaml 

查看nginx指标数据

 

prometheus 部署在k8s集群以外并实现服务发现:
创建prometheus 用于发现的账号
root@k8s-master2:~/1.prometheus-case-files# cat case4-prom-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: monitoring

---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: monitoring-token
  namespace: monitoring
  annotations:
    kubernetes.io/service-account.name: "prometheus"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  - services
  - endpoints
  - pods
  - nodes/proxy
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - "extensions"
  resources:
    - ingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - configmaps
  - nodes/metrics
  verbs:
  - get
- nonResourceURLs:
  - /metrics
  verbs:
  - get
---
#apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: monitoring

 

root@k8s-master2:~/1.prometheus-case-files# kubectl apply -f case4-prom-rbac.yaml
serviceaccount/prometheus created
secret/monitoring-token created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
root@k8s-master2:~/1.prometheus-case-files# kubectl get secrets -n monitoring
NAME                               TYPE                                                   DATA    AGE
default-token-x4vf9           kubernetes.io/service-account-token   3          3d21h
monitor-token-qvn4x         kubernetes.io/service-account-token   3          3d20h
monitoring-token               kubernetes.io/service-account-token   3          28s
prometheus-token-xvg8t   kubernetes.io/service-account-token   3          28s

root@k8s-ansible-harbor:~# vim /apps/prometheus/k8s.token
eyJhbGciOiJSUzI1NiIsImtpZCI6IjFteE1PM1dkRTVCdFNLQnBOSGU4WWdyQ1B6eEY1RHBIMkZBODV4empYTlkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5p
by9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJtb25pdG9yaW5nIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InByb21ldGhldXMtdG9rZW4iLCJrdWJlcm5ldGVzLml
vL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoicHJvbWV0aGV1cyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjE2NjY1M2EyLTJiNz
ktNGE3Zi05YzY5LTFlYTQyMWQ3ZWRkNCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDptb25pdG9yaW5nOnByb21ldGhldXMifQ.WxmhAuM2yt90tCDle3Algb-b3OYY1nmAmBlqcqFiVoSgrwVWH-
FnrdB7rYdgtkSULyM2FNBubY2gZUHE3mQ22OGlUbKcVrI5O6ipyJwwQyAgijV-Tz1d0tlMtNm_4fX1ZGSyOZbd2Qyk59z-Qsxq80crASNYQAFYetIaeyxMSPPZqVUfwKJJJ0EaAVAKbiaS9QLrj3lA9RwiB
_OSErIK1wTtDxmgyz2LvzP-UEXrW2Dku-x1k5OtCJv0TDL370k2aVaxN7zkD8BqwrgCvy9M_XoMFUml_41iOFl4WmFI9m5oPfHCJQyF1D6Djn-oS15lCi7LxFoRHgdDg1RX7PchZw

 

root@k8s-ansible-harbor:/apps/prometheus# cat prometheus.yml 

  #node节点发现
  - job_name: 'kubernetes-nodes-monitor'
    scheme: http
    tls_config:
      insecure_skip_verify: true
    bearer_token_file: /apps/prometheus/k8s.token
    kubernetes_sd_configs:
    - role: node
      api_server: https://10.4.7.134:6443  
      tls_config:
        insecure_skip_verify: true
      bearer_token_file: /apps/prometheus/k8s.token
    relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - source_labels: [__meta_kubernetes_node_label_failure_domain_beta_kubernetes_io_region]
        regex: '(.*)'
        replacement: '${1}'
        action: replace
        target_label: LOC
      - source_labels: [__meta_kubernetes_node_label_failure_domain_beta_kubernetes_io_region]
        regex: '(.*)'
        replacement: 'NODE'
        action: replace
        target_label: Type
      - source_labels: [__meta_kubernetes_node_label_failure_domain_beta_kubernetes_io_region]
        regex: '(.*)'
        replacement: 'K8S-test'
        action: replace
        target_label: Env
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
 

 

联邦集群

root@k8s-ansible-harbor:/apps/prometheus# vi prometheus.yml

  - job_name: 'prometheus-federate-k8s-cluster'
    scrape_interval: 10s
    honor_labels: true
    metrics_path: '/federate'
    params:
      'match[]':
       - '{job="prometheus"}'
       - '{__name__=~"job:.*"}'
       - '{__name__=~"node.*"}'
    static_configs:
      - targets:
        - '10.4.7.134:30090'
 
root@k8s-ansible-harbor:/apps/prometheus# systemctl restart prometheus
 
Pod伸缩简介:
根据当前pod的负载,动态调整 pod副本数量,业务高峰期自动扩容pod的副本数以尽快响应pod的请求。
在业务低峰期对pod进行缩容,实现降本增效的目的。
公有云支持node级别的弹性伸缩。
 
默认根据pod的cpu内存的利用率进行弹性伸缩 假如定义一个最低是3个(业务低峰期)最多是20个 这个范围内  hpa控制器对deployment中的资源利用率进行统计,
统计发现超出规定值(hpa设置阈值)以后 就扩容
 
也可以基于prometheus指标做扩容
 

手动扩容

root@k8s-master1:~# kubectl scale deployment magedu-tomcat-app1-deployment --replicas=2  -n magedu

 
#命令使用帮助

root@k8s-master1:~# kubectl --help | grep scale 
scale Set a new size for a deployment, replica set, or replication controller
autoscale Auto-scale a deployment, replica set, stateful set, or replication controller

 
动态伸缩控制器类型:
 
水平pod自动缩放器(HPA):
基于pod 资源利用率横向调整
 
pod副本数量。
垂直pod自动缩放器(VPA):
基于pod资源利用率,调整对单个pod的最大资源限制,不能与HPA同时使用。
 
集群伸缩(Cluster Autoscaler,CA)
基于集群中node 资源使用情况,动态伸缩node节点,从而保证有CPU和内存资源用于创建pod。

 

 

 hpa控制器,每隔一段时间像向api查询数据,如果没有触发hpa的条件就不会有操作。如果有触发hpa的操作就会对应的扩缩容,

HPA控制器简介:
Horizontal Pod Autoscaling (HPA)控制器,根据预定义好的阈值及pod当前的资源利用率,自动控制在k8s集群中运行的pod数量(自动弹性水平自动伸
缩).
--horizontal-pod-autoscaler-sync-period #默认每隔15s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况。
--horizontal-pod-autoscaler-downscale-stabilization #缩容间隔周期,默认5分钟。
--horizontal-pod-autoscaler-sync-period #HPA控制器同步pod副本数的间隔周期
--horizontal-pod-autoscaler-cpu-initialization-period #初始化延迟时间,在此时间内 pod的CPU 资源指标将不会生效,默认为5分钟。
--horizontal-pod-autoscaler-initial-readiness-delay #用于设置 pod 准备时间, 在此时间内的 pod 统统被认为未就绪及不采集数据,默认为30秒。
--horizontal-pod-autoscaler-tolerance #HPA控制器能容忍的数据差异(浮点数,默认为0.1),即新的指标要与当前的阈值差异在0.1或以上,即要大于
1+0.1=1.1,或小于1-0.1=0.9,比如阈值为CPU利用率50%,当前为80%,那么80/50=1.6 > 1.1则会触发扩容,分之会缩容。
即触发条件:avg(CurrentPodsConsumption) / Target >1.1 或 <0.9=把N个pod的数据相加后根据pod的数量计算出平均数除以阈值,大于1.1就扩容,小
于0.9就缩容。
计算公式:TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target) #ceil是一个向上取整的目的pod整数。   pod扩容数量和当前pod数量有关,相乘不足1向上取整。
指标数据需要部署metrics-server,即HPA使用metrics-server作为数据源。
https://github.com/kubernetes-sigs/metrics-server
在k8s 1.1引入HPA控制器,早期使用Heapster组件采集pod指标数据,在k8s 1.11版本开始使用Metrices Server完成数据采集,然后将采集到的数据通过
API(Aggregated API,汇总API),例如metrics.k8s.io、custom.metrics.k8s.io、external.metrics.k8s.io,然后再把数据提供给HPA控制器进行查询,
以实现基于某个资源利用率对pod进行扩缩容的目的。

 

root@k8s-master2:~/2.hpa-metrics-server-0.6.1-case# cat hpa-autoscaling-v2.yaml
apiVersion: autoscaling/v2  #定义API版本
kind: HorizontalPodAutoscaler #定义资源对象类型为HorizontalPodAutoscaler
metadata: #定义元数据
  namespace: magedu #创建到指定的namespace
  name: magedu-tomcat-app1-podautoscaler #HPA控制器名称
  labels: #自定义标签
    app: magedu-tomcat-app1 #标签1
    version: v2 #标签2
spec: #定义对象具体信息
  scaleTargetRef: #定义水平伸缩的目标对象,Deployment、ReplicationController/ReplicaSet
    kind: Deployment #指定伸缩目标类型为Deployment控制器
    apiVersion: apps/v1 #Deployment API版本
    name: magedu-tomcat-app1-deployment #目标Deployment名称
  minReplicas: 3 #最小pod副本数
  maxReplicas: 10 #最大pod副本数
  metrics: #基于指定的指标数据进行pod副本自动伸缩
    - type: Resource #定义指标资源
      resource: #定义指标资源具体信息
        name: memory #资源名称为memory
        target: #目标阈值
          type: Utilization #触发类型为利用率
          averageUtilization: 50 #平均利用率50%
    - type: Resource #定义指标资源
      resource: #定义指标资源具体信息
        name: cpu #资源名称为cpu
        target: ##目标阈值
          type: Utilization #触发类型为利用率
          averageUtilization: 40 #平均利用率50%
 

root@k8s-master2:~/2.hpa-metrics-server-0.6.1-case# kubectl apply -f hpa-autoscaling-v2.yaml
horizontalpodautoscaler.autoscaling/magedu-tomcat-app1-podautoscaler created

这里必须有数据,一个yaml文件资源限制,一个安装metrics-server组件,这里前边是内存后边是cpu

 

 

 

posted on 2023-03-29 07:18  倔强不屈的阿文  阅读(0)  评论(0)    收藏  举报

导航