k8s资源监控
Metrics-Server是集群核心监控数据的聚合器,用来替换之前的heapster。
容器相关的 Metrics 主要来自于 kubelet 内置的 cAdvisor 服务,有了Metrics-Server之后,用户就可以通过标准的 Kubernetes API 来访问到这些监控数据。
Metrics API 只可以查询当前的度量数据,并不保存历史数据。
Metrics API URI 为 /apis/metrics.k8s.io/,在 k8s.io/metrics 维护。
必须部署 metrics-server 才能使用该 API,metrics-server 通过调用 Kubelet Summary API 获取数据。
示例:
http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/nodes
http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/nodes/
http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/namespace//pods/
Metrics Server 并不是 kube-apiserver 的一部分,而是通过 Aggregator 这种插件机制,在独立部署的情况下同 kube-apiserver 一起统一对外服务的。
kube-aggregator 其实就是一个根据 URL 选择具体的 API 后端的代理服务器。
- Metrics-server属于Core metrics(核心指标),提供API metrics.k8s.io,仅提供Node和Pod的CPU和内存使用情况。而其他Custom Metrics(自定义指标)由Prometheus等组件来完成。
资源下载:https://github.com/kubernetes-incubator/metrics-server
Metrics-server部署
$ kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/latest/components.yaml
#建议下载文件到本地,下载相应镜像,存放至habor仓库中,能更好的修改文件,以便运行
docker pull bitnami/metrics-server:0.4.2
状态必须是running
[root@server2 监控]# kubectl get pod -n kube-system
metrics-server-7f9d59986d-tsjg4 1/1 Running 12 13m
部署后改错
部署后查看Metrics-server的Pod日志:
eg:kubectl logs -n kube-system metrics-server-7f9d59986d-tsjg4
-
错误1:dial tcp: lookup server2 on 10.96.0.10:53: no such host
-
这是因为没有内网的DNS服务器,所以metrics-server无法解析节点名字。可以直接修改coredns的configmap,讲各个节点的主机名加入到hosts中,这样所有Pod都可以从CoreDNS中解析各个节点的名字。
-
$ kubectl edit configmap coredns -n kube-system
apiVersion: v1
data:
Corefile: |
…
ready
hosts {
172.25.0.11 server1
172.25.0.12 server2
172.25.0.13 server3
fallthrough
}
kubernetes cluster.local in-addr.arpa ip6.arpa {
-
解析后
删掉pod,重载
[root@server2 metrics]# kubectl delete pod -n kube-system coredns-7f89b7bc75-6qrcp
pod "coredns-7f89b7bc75-6qrcp" deleted
[root@server2 metrics]# kubectl delete pod -n kube-system coredns-7f89b7bc75-slwxx --force
- 报错2:x509: certificate signed by unknown authority
启用TLS Bootstrap 证书签发
需要在master端和每个节点处都进行此操作
-
vim /var/lib/kubelet/config.yaml
…
serverTLSBootstrap: true -
systemctl restart kubelet
-
$ kubectl get csr
NAME AGE REQUESTOR CONDITION
csr-f29hk 5s system:node:node-standard-2 Pending
csr-n9pvr 3m31s system:node:node-standard-3 Pending
-
$
kubectl certificate approve csr-n9pvr
certificatesigningrequest.certificates.k8s.io/csr-n9pvr approved -
报错3: Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)
如果metrics-server正常启动,没有错误,应该就是网络问题。修改metrics-server的Pod 网络模式:
hostNetwork: true -
部署成功后就可以看到
-
server2: master端
- $
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/server2"
- $
{"kind":"NodeMetrics","apiVersion":"metrics.k8s.io/v1beta1","metadata":{"name":"server2","selfLink":"/apis/metrics.k8s.io/v1beta1/nodes/server2","creationTimestamp":"2021-03-25T21:52:12Z"},"timestamp":"2021-03-25T21:51:51Z","window":"30s","usage":{"cpu":"136114266n","memory":"1324632Ki"}}
- $
kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
server2 137m 6% 1293Mi 68%
server3 62m 3% 594Mi 66%
Dashboard部署
Dashboard可以给用户提供一个可视化的 Web 界面来查看当前集群的各种信息。用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。
网址:https://github.com/kubernetes/dashboard
下载部署文件:
- $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc5/aio/deploy/recommended.yaml
[root@server2 监控]# kubectl -n kubernetes-dashboard get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.99.152.77 <none> 8000/TCP 56s
kubernetes-dashboard ClusterIP 10.104.113.243 <none> 443/TCP 56s
修改为NodePort方式,以便外部访问
kubectl -n kubernetes-dashboard edit svc kubernetes-dashboard
Type: NodePort
通过节点ip: port的方式访问
[root@server2 监控]# kubectl -n kubernetes-dashboard get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.99.152.77 <none> 8000/TCP 2m59s
kubernetes-dashboard NodePort 10.104.113.243 <none> 443:32100/TCP 2m59s
登陆dashboard需要认证,需要获取dashboard pod的token:
$ kubectl describe secrets kubernetes-dashboard-token-**** -n kubernetes-dashboard
[root@server2 监控]# kubectl get secrets -n kubernetes-dashboard
NAME TYPE DATA AGE
default-token-dcx2k kubernetes.io/service-account-token 3 5m4s
kubernetes-dashboard-certs Opaque 0 5m4s
kubernetes-dashboard-csrf Opaque 1 5m4s
kubernetes-dashboard-key-holder Opaque 2 5m4s
kubernetes-dashboard-token-24mbr kubernetes.io/service-account-token 3 5m4s
[root@server2 监控]# kubectl describe secrets kubernetes-dashboard-token-24mbr -n kubernetes-dashboard
默认dashboard对集群没有操作权限,需要授权:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard
能图形化动态管理
-
Dashboard如果无法展示metrics-server的数据指标,可以通过以下两种方式解决:
-
修改dashboard-metrics-scraper 的Pod网络模式: hostNetwork: true
-
通过node或pod的亲和性设置,让dashboard-metrics-scraper和metrics-server的Pod处于同一个node节点。