前言
我们现在想要达到的效果是以可视化数据来展示 Kubernetes 集群的资源,并且能够实现 HPA(Pod 水平自动扩缩)功能,至于什么是 HPA 可以看我之前的文章, 《K8s-Pod 水平自动扩缩实践(简称HPA)》其实这篇文章已经很好的实现 HPA 功能,但是没有可视化监控数据。
由于 Prometheus 已经集成了 Metrics-Server,所以需要把之前单独部署的 Metrics-Server 给移除即可。
![image-20210723140241545](https://img-blog.csdnimg.cn/img_convert/9d28fa422c33d09b8a0e0670db68b8ff.png)
下载相关配置文件
GitHub下载地址:https://github.com/prometheus-operator/kube-prometheus
这里需要注意的是根据你部署的 Kubernetes 版本来选择对应的版本号。
![image-20210723140555767](https://img-blog.csdnimg.cn/img_convert/2620223d2ed1aa813159e051ae0268fb.png)
Kubernetes v1.14.0 之前的版本要选择 release-0.1 版本来部署。
![image-20210723140627725](https://img-blog.csdnimg.cn/img_convert/3bca62bfa117d6d4577ff28a473b725a.png)
修改配置文件,使用 NodePort 方式访问
grafana-service.yaml 配置文件
[root@k8s-master01 manifests]# pwd
/root/kube-prometheus-release-0.1/manifests
[root@k8s-master01 manifests]# cat 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
# 新添加
nodePort: 30100
selector:
app: grafana
prometheus-service.yaml 配置文件
[root@k8s-master01 manifests]# cat 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
# 新添加
nodePort: 30200
selector:
app: prometheus
prometheus: k8s
sessionAffinity: ClientIP
alertmanager-service.yaml 配置文件
[root@k8s-master01 manifests]# cat 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
# 新添加
nodePort: 30300
selector:
alertmanager: main
app: alertmanager
sessionAffinity: ClientIP
开始构建
[root@k8s-master01 manifests]# pwd
/root/kube-prometheus-release-0.1/manifests
[root@k8s-master01 manifests]# kubectl apply -f .
namespace/monitoring created
....
如果出现如下错误,重新再执行一遍即可。
![image-20210723143345658](https://img-blog.csdnimg.cn/img_convert/87be198557a517957cee58ad04cd3414.png)
创建完成之后查看 Pod 状态,全部都在 monitoring 名称空间里,这里需要等待一段时间下载镜像,后面会有个别镜像下载失败,因为镜像仓库在国外,需要我们手动下载。
![image-20210723143857635](https://img-blog.csdnimg.cn/img_convert/fcfa1e30b4c137270025e3e711b2527a.png)
等待了蛮久的一段时间后,发现只有一个 Pod 镜像下载失败,需要我们手动去对应的 Node 下载这个镜像,镜像名称可以通过 describe 来查看。
![image-20210723144826893](https://img-blog.csdnimg.cn/img_convert/84a4cd5b0a92acc5bc2dd1b951b8df2b.png)
查看 kube-state-metrics 需要的镜像
[root@k8s-master01 ~]# kubectl describe pod kube-state-metrics-69c95c6466-4jxqr -n monitoring
...
Normal BackOff 11m (x2 over 12m) kubelet, k8s-node02 Back-off pulling image "k8s.gcr.io/addon-resizer:1.8.4"
Warning Failed 11m (x3 over 12m) kubelet, k8s-node02 Failed to pull image "k8s.gcr.io/addon-resizer:1.8.4": rpc error: code = Unknown desc = Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Normal Pulling 10m (x4 over 13m) kubelet, k8s-node02 pulling image "k8s.gcr.io/addon-resizer:1.8.4"
Warning Failed 5m39s (x6 over 12m) kubelet, k8s-node02 Error: ErrImagePull
Warning Failed 46s (x45 over 12m) kubelet, k8s-node02 Error: ImagePullBackOff
每个节点都下载一下,防止重构后它被分配到另外节点,手动下载还是失败,需要先下载国内的镜像源,再通过 docker tag 来实现。
[root@k8s-node02 ~]# docker pull registry.cn-beijing.aliyuncs.com/minminmsn/addon-resizer:1.8.4
[root@k8s-node02 ~]# docker tag registry.cn-beijing.aliyuncs.com/minminmsn/addon-resizer:1.8.4 k8s.gcr.io/addon-resizer:1.8.4
此时再次查看就已经全部 Running
![image-20210723145521172](https://img-blog.csdnimg.cn/img_convert/cc93429d86e9da2fbd581892b7f7b46c.png)
可以通过命令来查看 Node 和 Pod 相关资源
[root@k8s-master01 ~]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master01 168m 8% 1422Mi 76%
k8s-node01 108m 5% 1120Mi 60%
k8s-node02 85m 4% 985Mi 52%
[root@k8s-master01 ~]# kubectl top pod -n kube-system
NAME CPU(cores) MEMORY(bytes)
coredns-78d4cf999f-25wzl 2m 16Mi
coredns-78d4cf999f-dc8xs 1m 16Mi
etcd-k8s-master01 13m 99Mi
访问 Dashboard 仪表盘界面
![image-20210723150023848](https://img-blog.csdnimg.cn/img_convert/14f10c705cd89f6dacc4d41c9f22f2c6.png)
访问各组件 Web 界面
![image-20210723150439031](https://img-blog.csdnimg.cn/img_convert/c3d7a8a572bbfe2033d48c257e5fdde1.png)
访问 Prometheus
![image-20210723150642602](https://img-blog.csdnimg.cn/img_convert/f67f73357e043eac650688d17c1e82bd.png)
访问 Grafana 进行配置
http://MasterIP:30100,初始用户/密码都是 admin
![image-20210723150730593](https://img-blog.csdnimg.cn/img_convert/263ae85d15b538c3d7ed1b9f4d5a16a7.png)
添加 Prometheus 数据源
![image-20210723150958193](https://img-blog.csdnimg.cn/img_convert/23fe002db0f4b17c637074723221dbd3.png)
添加数据看板
![image-20210723151057913](https://img-blog.csdnimg.cn/img_convert/898dab5c75653a67f8646ec95e48e86b.png)
就可以查看到对应的数据了
![image-20210723151145672](https://img-blog.csdnimg.cn/img_convert/9d020ddece46a9a9d372a2ba244e7d2e.png)
HPA 功能测试
首先创建 Pod,直接使用阿里源的 hpa-example 镜像,谷歌的拉取不了
[root@k8s-master01 ~]# kubectl run php-apache --image=registry.cn-beijing.aliyuncs.com/google_registry/hpa-example --requests=cpu=200m --expose --port=80
这个镜像比较大,稍微等一会
![image-20210723152029689](https://img-blog.csdnimg.cn/img_convert/48771c4c4a8ccc6af669fd10a5f72d04.png)
创建对应 HPA
[root@k8s-master01 ~]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
![image-20210723152148552](https://img-blog.csdnimg.cn/img_convert/20bdcbb12092bfbd3a05bafcb8d7fbee.png)
开始增加负载进行测试
[root@k8s-master01 ~]# kubectl run -i --tty load-generator --image=busybox /bin/sh/
/# while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done
![image-20210723152425671](https://img-blog.csdnimg.cn/img_convert/5806d0f2979683111eb1dff8a2b78abe.png)
此时 Pod 负载持续增加,已经自动扩容到七个 Pod 来应对
![image-20210723152700519](https://img-blog.csdnimg.cn/img_convert/814659e93bc89334bd9370becd44c3d8.png)
查看 Pod 现在的个数,已经升至九个了
![image-20210723152755928](https://img-blog.csdnimg.cn/img_convert/4b3c88c965bfff62982d9ac032986d9e.png)
开始减压,测试是否自动收缩
![image-20210723152852015](https://img-blog.csdnimg.cn/img_convert/b8c2bd70992aac2495e15ec7dce74bee.png)
需要等待较长的时间,已经收缩为最小 Pod 数量
![image-20210723153444974](https://img-blog.csdnimg.cn/img_convert/55bada6fe240af1c36de366a83485878.png)
到此就完成整套的 K8s 监控系统,全部以实操为主,其他具体的配置、概念、理论可以查阅对应组件的官网,由于时间原因这里就不做赘述。