月度归档: 2021 年 5 月

K3S环境下接入Prometheus,grafana,等监控套件

背景

因为常规的监控都是用K8S做的,而K3S上的监控方案少之又少,如果直接用rancher上的prometheus监控,会消耗至少2G的内存,于是我们就自己做了K3S和pg数据库的监控,并且通过我们自己做的监控,可以减少一些不必要的性能开销。主要监控容器资源消耗,宿主机资源消耗,pg数据库资源消耗

这个是资源使用情况,大约会用掉600M内存和100MCPU

user@user:/$ kubectl top pod -n kube-ops
NAME CPU(cores) MEMORY(bytes)
grafana-0 1m 47Mi
kube-state-metrics-594fb7bc84-5mg6g 3m 10Mi
node-exportor-prometheus-node-exporter-sznls 31m 8Mi
node-exportor-prometheus-node-exporter-tx7rm 13m 7Mi
prometheus-0 46m 565Mi
prometheus-postgres-exporter-6c858f47d4-dj9hj 13m 6Mi

prometheus监控组件参考helm chart

https://github.com/prometheus-community/helm-charts/tree/main/charts
我魔改的github连接
https://github.com/lizhenwei/k3s-prometheus


Prometheus的安装

1.创建一个命名空间kube-ops,把监控用的东西都放在这个命名里面。
2.使用我魔改的chart进行安装,默认版本是v2.26.0,默认启用上图提到的

cadvisor,kube_state_metrics,node_exportor,postgres_exporter

 

kubectl create ns kube-ops
helm install -n kube-ops prometheus lizhenwei-prometheus

如果要关闭其中的某个监控项,安装时参考添加变量 –set node_exportor.enable=false,
prometheus的数据会用默认的storageClass生成PVC,如果没有默认的,参考手动设置nfs存储 –set persistence.storageClass=nfs-client
安装成功后,因为我是nodeport暴露出来的,所以可以通过浏览器去检查一下配置,例如这里我们暴露出来是32331端口可以访问,例如:

$ kubectl get svc -n kube-ops
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus NodePort 10.43.178.128 <none> 9090:32331/TCP 2d4h

访问http://master机器IP:32331/targets,可以看到prometheus自己已经是成功起来了,我们也可以去http://master机器IP:32331/config页面看看配置项是否都正确
要启用或停用某些监控功能,可以修改lizhenwei-prometheus/valuse.yaml里的配置,修改成true或false


kube-state-metrics的安装

kube-state-metrics是用来收集k8s集群的CPU,内存等信息的收集器,这里我用的是v1.9.7版本。
使用我github上的helm进行安装:

helm install -n kube-ops prometheus lizhenwei-kube-state-metrics

要想验证部署kube-state-metrics之后,是否能成功使用,我们可以看prometheus的target页面是不是显示kube-state-metrics(X/X up) x为机器节点数量。
然后我们去graph页面看看,http://master机器IP:32331/graph。可以参考官网给的promql文档,输入几个语句试试

PromQL参考链接

https://github.com/kubernetes/kube-state-metrics/tree/master/docs

例如输入kube_configmap_info,点击execute会返回一些结果,如下图


K3S自带的CADVISOR

K3S自带kubelet ,而cadvisor已经集成在kubelet里了,prometheus可以通过配置找到本地安装的cadvisor,例如下列代码:

- job_name: 'cadvisor'
  scheme: https
  tls_config:
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  kubernetes_sd_configs:
  - role: node
  relabel_configs:
  - action: labelmap
    regex: __meta_kubernetes_node_label_(.+)
  - target_label: __address__
    replacement: kubernetes.default.svc:443
  - source_labels: [__meta_kubernetes_node_name]
    regex: (.+)
    target_label: __metrics_path__
    replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor

接入prometheus的时候,可以根据以下链接,查看PromQL语句

PromQL参考链接

https://github.com/google/cadvisor/blob/master/docs/storage/prometheus.md


node-exportor的安装

这个使用官方网站给的一个公共库就可以了

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install node-exportor prometheus-community/prometheus-node-exporter

grafana参考链接https://grafana.com/grafana/dashboards/1860


postgres-exportor

下载代码https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-postgres-exporter 到机器上
修改valuse.yaml里的queries里的参数,在最后面加上

pg_stat_activity:
      query: |
        SELECT
          datname,
          SUM(EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - state_change))::bigint)::float AS process_idle_seconds_sum,
          COUNT(*) AS process_idle_seconds_count
        FROM pg_stat_activity
        WHERE state = 'idle'
        GROUP BY datname
      metrics:
        - datname:
            usage: "LABEL"
            description: "datname"
        - process_idle_seconds:
            usage: "COUNTER"
            description: "Idle time of server processes"
        - process_idle_seconds_sum:
            usage: "GUAGE"
            description: "sum of Idle time of server processes"

在valuse.yaml文件的config.datasource部分添加我们的postgres超管用户信息。

helm安装语句

helm install -n kube-ops prometheus-postgres-exporter prometheus-postgres-exporter

Grafana导入dashboard

可以参考这位大神的github链接https://github.com/starsliao/Prometheus


页面截图

 

rancher备份K8S集群数据到minio方案

1 安装minio

使用自定义证书,并且提供https
docker安装,数据和配置挂载到宿主机上

1.1 证书生成命令

# 制作两个目录用于存放minio数据
mkdir -p /home/lizhenwei/minio/data
mkdir -p /home/lizhenwei/minio/config/certs
# 进入minio证书目录
cd  /home/sfere/lizhenwei/config/certs
# 使用openssl产生伪随机字节
openssl rand -writerand .rnd
# 创建私钥
openssl genrsa -out private.key 2048
# 创建证书文件
openssl req -new -x509 -days 3650 -key private.key -out public.crt -subj "/C=CN/ST=NanJing/L=YuHua/O=LZW/CN=192.168.0.237"

完成之后,/home/lizhenwei/minio/config/certs目录下应该会有CAs  private.key  public.crt 三个文件或目录,其中public.crt 是我们后面要填入rancher中的证书文件

1.2 docker运行minio

docker run -d -p 443:443 --name minio-rancher   -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE"   -e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"   -v /home/lizhenwei/minio/data:/data   -v /home/lizhenwei/minio/config:/root/.minio   minio/minio server --address ":443" /data

2 rancher中配置集群数据备份到minio

2.1.登录minio,创建bucket

2.2 在rancher中设置etcd备份到S3存储(minio)

Docker安装redis环形集群

背景

因为有需求要3台机器来做一个redis高可用(o(╥﹏╥)哭o~~~),没办法,只能用一个奇怪的方式安装redis集群了。这里我们用的不是主从哨兵哦,阅读本文的作者不要误会啦。再就是,真不推荐用3个机器来做redis集群。

因为配置里的cluster-announce-ip不能用域名,只能用ip,而pod的IP在K8S里经常变,所以不能用K8S部署了,我们这里使用docker和docker-compose部署,总得来说还是很简单的,代码我上传至github上了
https://github.com/lizhenwei/redis-cluster-in-docker.git

拓扑图

假设我们用3台机器,IP地址192.168.0.94,192.168.0.95,192.168.0.96 ;分别是node1,node2,node3

-------    -------    -------
|node1| ---|node2|----|node3|
-------    -------    -------
master1    master2    master3
slaver2    slaver3    slaver1

安装完毕之后,需要我们手动通过`CLUSTER REPLICATE`命令调节master和slaver所处的容器,形成如上拓扑,这样假使node1挂掉的时候,我们的node2上能运行一个master2,node3上运行master3,master1(此处的master1是由slaver1变过来的)

安装方法

1.在每台机器上安装docker和docker-compose。国内可以用daocloud去下载。会比较快http://get.daocloud.io/
2. 在每台机器上下载该代码,进入代码目录,运行shell命令,会根据IP地址更改配置文件,并且创建redis的docker应用:

# 在每台机器上输入该命令,注意替换IP地址
bash docker-init.sh 192.168.0.94
3. 在任意一台机器上通过redis-cli创建集群
# 在每台机器上输入该命令,注意替换IP地址
bash redis-init.sh 192.168.0.94 192.168.0.95 192.168.0.96
# 弹出来的提示直接输入yes
4. 完成之后执行命令,检查集群是否运行成功
#进入redis容器
docker exec -it redis-cluster bash
#检查集群是否运行成功
redis-cli -a 92F1q99f9CnrkAuwJPItdj8brqeMtN3r -p 7000 cluster nodes

python代码访问redis-cluster

$ pip install redis-py-cluster
```
测试代码
```
>>> from rediscluster import RedisCluster
>>> # Requires at least one node for cluster discovery. Multiple nodes is recommended.
>>> startup_nodes = [{"host": "192.168.0.94", "port": "7000"}, {"host": "192.168.0.94", "port": "7001"},{"host": "192.168.0.95", "port": "7000"}, {"host": "192.168.0.95", "port": "7001"},{"host": "192.168.0.96", "port": "7000"}, {"host": "192.168.0.96", "port": "7001"}]
>>> rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True,password='password')
>>> rc.set("foo", "bar")
True
>>> print(rc.get("foo"))
'bar'

苏ICP备18047533号-1