k8s监控相关

K8s监控相关介绍

一、k8s的UI访问界面dashboard
	在dashboard中,虽然可以做到创建、删除、修改资源等操作,但通常情况下,只会把它当做监控k8s集群的软件。

    1.GitHub主页搜索"dashboard"
	直接远程运行对应的yaml文件,不过可以看下yaml文件内都有什么内容,然后将svc资源类型更改为NodePort,所以先将yaml文件下载到本地。
    
[root@master]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
[root@master]# vim recommended.yaml
...
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
...

运行后查看对应的svc暴露端口,注意这个是基于https的访问。
[root@master]# kubectl apply -f recommended.yaml
[root@master]# kubectl get pod -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-76679bc5b9-7xl96   1/1     Running   0          57s
kubernetes-dashboard-7f9fd5966c-7s7vb        1/1     Running   0          57s
[root@master]# kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.100.248.104   <none>        8000/TCP        60s
kubernetes-dashboard        NodePort    10.106.19.193    <none>        443:30843/TCP   60s

	2.基于token的方法登录dashboard
	(1)创建一个dashboard的管理用户
[root@master]# kubectl create serviceaccount dashboard-admin -n kube-system
# 如果是是放在了自己创建的kubernetes-dashboard命名空间下,相应修改就行。
	(2)绑定用户为集群管理用户
[root@master]# kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
	(3)获取token
[root@master]# kubectl get secrets -n kube-system | grep dashboard-admin
dashboard-admin-token-sj7fr                      kubernetes.io/service-account-token   3      106s
[root@master]# kubectl describe secrets -n kube-system dashboard-admin-token-sj7fr
Name:         dashboard-admin-token-sj7fr
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-admin
              kubernetes.io/service-account.uid: c729286e-6580-4ad1-8c91-ce0002bb203a

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tc2o3ZnIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYzcyOTI4NmUtNjU4MC00YWQxLThjOTEtY2UwMDAyYmIyMDNhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.N6TmR7V7osgUs9gxC3kWwlPPJqEEdzDBsPJY71swx5DpTgSVj3MO4o3aMid2Q_ctCSLKFTxwkXobrqMoH3T4Q05ddWgkWnZ8yoiaBaNRnMOJ2p8FnEyETuUysybjt3MZ8HvWFHidPVk3zlQEIyiNH7nPcJZQsXMTrqoIQC44XOig7Apx9Mg8CK19GC8YeAwD8ePC9mqjYhPthV3LisRPEk3Qxu8SnnRUb1RlbX26JGqiaVZDKdTvUg8C1NUAFIUnQnRF5c6v1Tu-2Dz7TqUH5a2CYiU3tmLx9k3o0rYMQrBmjZPVDpoWxqGkUJ0ry-KVVzvbhX1daRACGJVSQi7dIw
	(4)在浏览器上使用token登录
curl https://192.168.229.187:30843

     3.基于kubeconfig配置文件的方法登录dashboard
    (1)获取token
[root@master]# kubectl get secrets -n kube-system | grep dashboard-admin
# 注意,有可能dashboard所在命名空间不同,部署kube-system,而是kubernetes-dashboard
# kubectl get secrets -n kubernetes-dashboard | grep dashboard-admin
dashboard-admin-token-sj7fr                      kubernetes.io/service-account-token   3      106s
[root@master]# kubectl describe secrets -n kube-system dashboard-admin-token-sj7fr
# 注意,有可能dashboard所在命名空间不同,部署kube-system,而是kubernetes-dashboard
# kubectl describe secrets -n kubernetes-dashboard dashboard-admin-token-xhjt6
Name:         dashboard-admin-token-sj7fr
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-admin
              kubernetes.io/service-account.uid: c729286e-6580-4ad1-8c91-ce0002bb203a

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tc2o3ZnIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYzcyOTI4NmUtNjU4MC00YWQxLThjOTEtY2UwMDAyYmIyMDNhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.N6TmR7V7osgUs9gxC3kWwlPPJqEEdzDBsPJY71swx5DpTgSVj3MO4o3aMid2Q_ctCSLKFTxwkXobrqMoH3T4Q05ddWgkWnZ8yoiaBaNRnMOJ2p8FnEyETuUysybjt3MZ8HvWFHidPVk3zlQEIyiNH7nPcJZQsXMTrqoIQC44XOig7Apx9Mg8CK19GC8YeAwD8ePC9mqjYhPthV3LisRPEk3Qxu8SnnRUb1RlbX26JGqiaVZDKdTvUg8C1NUAFIUnQnRF5c6v1Tu-2Dz7TqUH5a2CYiU3tmLx9k3o0rYMQrBmjZPVDpoWxqGkUJ0ry-KVVzvbhX1daRACGJVSQi7dIw
	(2)生成kubeconfig配置文件
设置一个环境变量代表获取的token。
[root@master]# DASH_TOKEN=$(kubectl get secrets -n kube-system dashboard-admin-token-sj7fr -o jsonpath={.data.token} | base64 -d)
# 注意,有可能dashboard所在命名空间不同,部署kube-system,而是kubernetes-dashboard
# DASH_TOKEN=$(kubectl get secrets -n kubernetes-dashboard dashboard-admin-token-xhjt6 -o jsonpath={.data.token} | base64 -d)

将k8s集群的配置信息写入kubeconfig配置文件中。
[root@master]# kubectl config set-cluster kubernetes --server=192.168.229.187:6443 --kubeconfig=/root/.dashboard-admin.conf
[root@master]# kubectl config set-credentials dashboard-admin --token=$DASH_TOKEN --kubeconfig=/root/.dashboard-admin.conf
[root@master]# kubectl config set-context dashboard-admin@kubernetes --cluster=kubernetes --user=dashboard-admin --kubeconfig=/root/.dashboard-admin.conf
[root@master]# kubectl config use-context dashboard-admin@kubernetes --kubeconfig=/root/.dashboard-admin.conf
    (3)将生成的/root/.dashboard-admin.conf的配置文件导出并保存。
    zhangjiedeMacBook-Pro:~ zhangjie$ scp -r [email protected]:/root/jiankong/config.conf /Users/zhangjie/Desktop
    # 这里使用ll命令是看不到上面那一群.开头的文件的,我采用重命名的方式,就可以看到。
    cp .dashboard-admin.conf dashboard-admin-118.conf
    # 再使用其它软件传出去
	(4)浏览器选择kubeconfig的登录方式,然后导入配置文件即可。
	# https:可以
	# http:不可以
        
    二、scope相关介绍
	1.github上搜索scope
    2.安装scope
[root@master]# kubectl apply -f "https://cloud.weave.works/k8s/scope.yaml?k8s-version=$(kubectl version | base64 | tr -d '\n')"
## 修改端口方式为NotePort
[root@master]# kubectl apply -f "https://cloud.weave.works/k8s/scope.yaml?k8s-version=$(kubectl version | base64 | tr -d '\n')&k8s-service-type=NodePort"
[root@master]# kubectl get namespaces
[root@master]# kubectl get svc -n weave
[root@master]# kubectl edit svc -n weave weave-scope-app
...
spec:
  clusterIP: 10.96.76.173
  ports:
  - name: app
    port: 80
    protocol: TCP
    targetPort: 4040
  selector:
    app: weave-scope
    name: weave-scope-app
    weave-cloud-component: scope
    weave-scope-component: app
  sessionAffinity: None
  type: NodePort
...
[root@master]# kubectl get svc -n weave
NAME              TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
weave-scope-app   NodePort   10.96.76.173   <none>        80:30026/TCP   7m37s
    3.浏览器访问
curl 192.168.229.187:30026
# http:可以
# https:不可以

# 如果部署的服务太分散,很容易忘记而找不到对应服务的NotePort
# kubectl get namespace
# kubectl get svc -n <namespace>

     三、prometheus
	1.获取压缩包  
[root@master]# wget https://github.com/prometheus-operator/kube-prometheus/archive/v0.3.0.tar.gz
MetricsServer:k8s集群资源使用情况的聚合器,收集数据给k8s集群内使用。
如kubectl,hpa,scheduler;
Prometheus Operator:是一个系统检测和警报工具箱,用来存储监控数据;
Prometheus node-exporter:收集k8s集群资源的数据,指定告警规则;
Prometheus:收集apiserver,scheduler,controller-manager,kubelet组件的数据,通过http协议传输;
Grafana:可视化数据统计和监控平台;
	2.解压压缩包
[root@master]# tar zxf v0.3.0.tar.gz
[root@master]# cd kube-prometheus-0.3.0/
[root@master kube-prometheus-0.3.0]# ls
build.sh            go.sum                 manifests
code-of-conduct.md  hack                   NOTICE
DCO                 jsonnet                OWNERS
docs                jsonnetfile.json       README.md
example.jsonnet     jsonnetfile.lock.json  scripts
examples            kustomization.yaml     sync-to-internal-registry.jsonnet
experimental        LICENSE                tests
go.mod              Makefile               test.sh
[root@master kube-prometheus-0.3.0]# cd manifests/
[root@master manifests]# ls
alertmanager-alertmanager.yaml
alertmanager-secret.yaml
alertmanager-serviceAccount.yaml
alertmanager-serviceMonitor.yaml
alertmanager-service.yaml
grafana-dashboardDatasources.yaml
grafana-dashboardDefinitions.yaml
grafana-dashboardSources.yaml
grafana-deployment.yaml
grafana-serviceAccount.yaml
grafana-serviceMonitor.yaml
grafana-service.yaml
kube-state-metrics-clusterRoleBinding.yaml
kube-state-metrics-clusterRole.yaml
kube-state-metrics-deployment.yaml
kube-state-metrics-roleBinding.yaml
kube-state-metrics-role.yaml
kube-state-metrics-serviceAccount.yaml
kube-state-metrics-serviceMonitor.yaml
kube-state-metrics-service.yaml
node-exporter-clusterRoleBinding.yaml
node-exporter-clusterRole.yaml
node-exporter-daemonset.yaml
node-exporter-serviceAccount.yaml
node-exporter-serviceMonitor.yaml
node-exporter-service.yaml
prometheus-adapter-apiService.yaml
prometheus-adapter-clusterRoleAggregatedMetricsReader.yaml
prometheus-adapter-clusterRoleBindingDelegator.yaml
prometheus-adapter-clusterRoleBinding.yaml
prometheus-adapter-clusterRoleServerResources.yaml
prometheus-adapter-clusterRole.yaml
prometheus-adapter-configMap.yaml
prometheus-adapter-deployment.yaml
prometheus-adapter-roleBindingAuthReader.yaml
prometheus-adapter-serviceAccount.yaml
prometheus-adapter-service.yaml
prometheus-clusterRoleBinding.yaml
prometheus-clusterRole.yaml
prometheus-operator-serviceMonitor.yaml
prometheus-prometheus.yaml
prometheus-roleBindingConfig.yaml
prometheus-roleBindingSpecificNamespaces.yaml
prometheus-roleConfig.yaml
prometheus-roleSpecificNamespaces.yaml
prometheus-rules.yaml
prometheus-serviceAccount.yaml
prometheus-serviceMonitorApiserver.yaml
prometheus-serviceMonitorCoreDNS.yaml
prometheus-serviceMonitorKubeControllerManager.yaml
prometheus-serviceMonitorKubelet.yaml
prometheus-serviceMonitorKubeScheduler.yaml
prometheus-serviceMonitor.yaml
prometheus-service.yaml
setup
	3.修改yaml文件,更改为nodePort的暴露方式。
[root@master manifests]# vim grafana-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: grafana
  name: grafana
  namespace: monitoring
spec:
  type: NodePort # 我增加的
  ports:
  - name: http
    port: 3000
    targetPort: http
  selector:
    app: grafana
[root@master manifests]# vim prometheus-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    prometheus: k8s
  name: prometheus-k8s
  namespace: monitoring
spec:
  type: NodePort # 我增加的
  ports:
  - name: web
    port: 9090
    targetPort: web
  selector:
    app: prometheus
    prometheus: k8s
  sessionAffinity: ClientIP
[root@master manifests]# vim alertmanager-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    alertmanager: main
  name: alertmanager-main
  namespace: monitoring
spec:
  type: NodePort # 我增加的
  ports:
  - name: web
    port: 9093
    targetPort: web
  selector:
    alertmanager: main
    app: alertmanager
  sessionAffinity: ClientIP
    
 	4.将setup目录中的yaml文件全部运行是运行manifests目录中yaml文件的基础环境配置。有可能因为目录内yaml文件过多而不能一次性全部运行,所以多运行几遍。
[root@master manifests]# kubectl apply -f setup/
[root@master manifests]# cd ..
[root@master kube-prometheus-0.3.0]# kubectl apply -f manifests/
	5.部署成功后,可以运行一条命令,查看资源使用情况(MetricsServer必须部署成功)[root@master kube-prometheus-0.3.0]# kubectl top node
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
master   505m         25%    1554Mi          42%
node1    564m         28%    1482Mi          40%
node2    432m         21%    1349Mi          36%	
	6.查看映射端口
[root@master kube-prometheus-0.3.0]# kubectl get svc -n monitoring
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
alertmanager-main       NodePort    10.96.137.18    <none>        9093:30229/TCP               8m10s
alertmanager-operated   ClusterIP   None            <none>        9093/TCP,9094/TCP,9094/UDP   8m10s
grafana                 NodePort    10.111.12.62    <none>        3000:32270/TCP               8m10s
kube-state-metrics      ClusterIP   None            <none>        8443/TCP,9443/TCP            8m9s
node-exporter           ClusterIP   None            <none>        9100/TCP                     8m9s
prometheus-adapter      ClusterIP   10.100.13.144   <none>        443/TCP                      8m9s
prometheus-k8s          NodePort    10.104.140.58   <none>        9090:30894/TCP               8m7s
prometheus-operated     ClusterIP   None            <none>        9090/TCP                     8m8s
prometheus-operator     ClusterIP   None            <none>        8080/TCP                     10m
	7.浏览器访问grafana
    
    四、HPA的相关介绍
	根据当前Pod资源的使用率,比如说CPU、磁盘、内存等进行副本Pod的动态扩容与缩容。
	前提条件:系统应该能获取到当前Pod的资源使用情况(指可以执行kubectl top pod命令,并且能够得到反馈信息)。
	heapster:这个组件之前是集成在k8s集群的,不过在1.12版本之后被移除了。如果还想使用此功能,应该部署metricsServer这个k8s集群资源使用情况的聚合器。
	这里使用一个测试镜像,这个镜像基于php-apache制作的docker镜像,包含了一些可以运行cpu密集计算任务的代码。
	1.模拟运行一个Deployment资源对象和SVC资源对象,等会要对它进行HPA控制。
[root@master ~]# kubectl run php-apache --image=mirrorgooglecontainers/hpa-example --requests=cpu=200m --expose --port=80
[root@master ~]# kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
php-apache-55447747db-hpd2f   1/1     Running   0          13s
[root@master ~]# kubectl top pod php-apache-55447747db-hpd2f
NAME                          CPU(cores)   MEMORY(bytes)
php-apache-55447747db-hpd2f   0m           17Mi
	2.创建HPA控制器    
[root@master ~]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
[root@master ~]# kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          97s
	3.创建一个应用,用来不停的访问刚刚创建的php-apache的svc资源。
[root@master ~]# kubectl run -i --tty load-generator --image=busybox /bin/sh
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
If you don't see a command prompt, try pressing enter.
/ #
    4.进入Pod内执行此命令,用来模拟访问php-apache的svc资源。
/ # while true; do wget -q -O- http://php-apache.default.svc.cluster.local ;done
 	上述Deployment对php-apache这个SVC不停的访问,查看对应的HPA资源它的CPU使用率明显升高,这时再去观察php-apache这个Deployment,就会看到它的Pod数量也会不停的增加,直到设置的HPA资源的最大Pod数量。
[root@master ~]# kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   97%/50%   1         10        2          92m
[root@master ~]# kubectl get deployments. -w
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
load-generator   1/1     1            1           87m
php-apache       2/2     2            2           104m
     当然Pod数量不会继续增加时,将访问界面的服务停止,观察php-apache这个Deployment资源的Pod数量的变化。当php-apache的CPU使用率完全降下来之后,hpa资源控制的Pod数量并没有马上降下来,这是因为它要维护这个Pod数量一段时间,保证大量的访问流量继续访问。
资源限制。

requests:代表容器启动请求的资源限制,分配的资源必须要达到此要求;
limits:代表最多可以请求多少资源;
单位m:CPU的计量单位叫毫核(m)。一个节点的CPU核心数量乘以1000,得到的就是节点总的CPU总数量;
如一个节点有两个核,那么该节点的CPU总量为2000m。

基于pod
Kubernetes对资源的限制实际上是通过cgroup来控制的,cgroup是容器的一组用来控制内核如何运行进程的相关属性接。针对内存、CPU和各种设备都有对应的cgroup。
默认情况下,Pod运行没有CPU和内存限额。这意味着系统中的任何Pod将能够像执行该Pod所在接地那一样,消耗足够多的CPU和内存。一般会针对某些应用的Pod资源进行资源限制,这个资源限制是通过resources和requests和limits来实现。

[root@master ~]# vim cgroup-pod.yaml
spec:
  containers:
  - name: xxxx
    imagePullPolicy: Always
    image: xxx
    ports:
    - protocol: TCP
      containerPort: 80
    resources:
      limits:
        cpu: 4
        memory: 2Gi
      requests:
        cpu: 260m
        memory: 260Mi

requests:要分配的资源,limits为最高请求的资源值。可以简单的理解为初始值和最大值。
基于名称空间
1.计算资源配额  
[root@master ~]# vim compute-resources.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-resources
spec:
  hard:
    pods: 20
    requests.cpu: 20
    requests.memory: 100Gi
    limits.cpu: 40
    limits.memory: 200Gi

2.配置对象数量配额限制
[root@master ~]# vim object-counts.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-counts
spec:
  hard:
    configmaps: 10
    persistentvolumeclaims: 4
    replicationcontrollers: 20
    secrets: 10
    service.loadbalancers: 2

3.配置CPU和内存的LimitRange
[root@master ~]# vim limitRange.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 50Gi
      cpu: 5
    defaultRequest:
      memory: 1Gi
      cpu: 1
    type: Container
default即limit的值,defaultRequest即request的值。


k8s系统的监控即HPA控制器
	一、资源监控及资源指标
	资源监控系统是容器编排系统必不可少的组件,它为用户提供了快速了解系统资源分配和利用状态的有效途径,同时也是系统编排赖以实现的基础要件。
    
    1、资源监控及Heapster
	kubernetes有多个数据指标需要采集相关的数据,而这些指标大体上由监控集群本身和监控Pod对象两部分组成,监控集群需要监控节点资源状态、节点数量、运行的pod数量;监控Pod资源对象需要监控kubernetes指标,容器指标和应用程序指标。
	kubernetes系统与kubelet程序中集成相关的工具程序cAdisorder用于对节点上的资源及容器进行实时监控及指标数据采集,这类监控的实现方式有Heapster。从kubernetes1.11开始Heapster被废弃不再使用,metrics-server代替了heapster。
    
    2、新一代的监控架构
    新一代的kubernetes监控系统架构主要由核心指标流水线和监控指标流水线协同组成。核心指标流水线由kubelet、资源评估器、metrics-server及API server提供的API群组组成,可用于为kubernetes系统提供核心指标从而能够了解其内部组件和核心程序。监控指标流水线用于从系统收集各种指标数据并提供给终端用户、存储系统及HPA控制器使用。
    资源指标API主流的实现是metrics-server,自定义指标API以构建在监控系统Prometheus之上到k8s-prometheus-adapter使用最为广泛。
    
    二、资源指标及应用
    1、部署metrics-server
    Metrics-server是集群级别的资源利用率数据的聚合器。Metrics-server通过kubernetes聚合器(kube-aggregator)注册到主API server之上,然后基于kubelet的summary api收集每个节点上的指标数据,并将它们存储于内存中然后以指标API格式提供。Metrics-server的部署步骤如下:
    自己查......

# 补充知识,
# Metrics-server:k8s集群资源使用情况的聚合器,收集数据给k8s集群内使用。
# 如kubectl,hpa,scheduler
# Prometheus Operator:是一个系统检测和报警工具箱,用来存储监控数据。
# Prometheus node-exporter:收集k8s集群资源的数据,指定告警规则。
# Prometheus:收集apiserver,scheduler,controller-manager,kubelet组件的数据,通过http协议传输
# grafana:可视化数据统计和监控平台

prometheus operator数据保留天数一定要改,否则虚拟机就分分钟磁盘爆满。
修改prometheus operator的deployment文件
nano /root/kube-prometheus-0.3.0/manifests/prometheus-prometheus.yaml 
在spec.下面添加
retention: 2h

修改后:
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  labels:
    prometheus: k8s
  name: k8s
  namespace: monitoring
spec:
  retention: 2h # 我添加的地方
  alerting:
    alertmanagers:
    - name: alertmanager-main
      namespace: monitoring
      port: web
  baseImage: quay.io/prometheus/prometheus
  nodeSelector:
    kubernetes.io/os: linux
  podMonitorSelector: {
    
    }
  replicas: 2
  resources:
    requests:
      memory: 400Mi
  ruleSelector:
    matchLabels:
      prometheus: k8s
      role: alert-rules
  securityContext:
    fsGroup: 2000
    runAsNonRoot: true
    runAsUser: 1000
  serviceAccountName: prometheus-k8s

如果已经安装了可以直接修改prometheus-prometheus.yaml 然后通过kubectl apply -f 刷新即可
修改完毕后检查pod运行状态是否正常
kubectl  get all -n monitoring
接下来可以访问grafana或者prometheus ui进行检查 (我这里修改完毕后等待2天,检查数据是否正常)


metrics-server可以用来收集集群中的资源使用情况
# 安装git
[root@k8s-master01 ~]# yum install git -y
# 获取metrics-server, 注意使用的版本
[root@k8s-master01 ~]# git clone -b v0.3.6 https://github.com/kubernetes-incubator/metrics-server
# 修改deployment, 注意修改的是镜像和初始化参数
[root@k8s-master01 ~]# cd /root/metrics-server/deploy/1.8+/
[root@k8s-master01 1.8+]# vim metrics-server-deployment.yaml
按图中添加下面选项
hostNetwork: true
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
args:
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

# 安装metrics-server
[root@k8s-master01 1.8+]# kubectl apply -f ./

# 查看pod运行情况
[root@k8s-master01 1.8+]# kubectl get pod -n kube-system
metrics-server-6b976979db-2xwbj   1/1     Running   0          90s

# 使用kubectl top node 查看资源使用情况
[root@k8s-master01 1.8+]# kubectl top node
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
k8s-master01   289m         14%    1582Mi          54%       
k8s-node01     81m          4%     1195Mi          40%       
k8s-node02     72m          3%     1211Mi          41%  
[root@k8s-master01 1.8+]# kubectl top pod -n kube-system
NAME                              CPU(cores)   MEMORY(bytes)
coredns-6955765f44-7ptsb          3m           9Mi
coredns-6955765f44-vcwr5          3m           8Mi
etcd-master                       14m          145Mi
...
# 至此,metrics-server安装完成

猜你喜欢

转载自blog.csdn.net/weixin_44716147/article/details/119839003
今日推荐