写在开篇
kubeadm工具快速部署k8s集群实现故障自动发现、转移及修复,集群中部署prometheus+grafan可实现自动收集集群的各项新性能指标数据,可视化界面提升客户对各项性能指标的直观感知,实现高效快速故障排查及解决。
一、kubeadm搭建k8s集群
1、Kubeadm简介:
(1)什么是kebeadm?
作为Kubernetes官方提供的集群部署管理工具,采用“一键式”指令进行集群的快速初始化和安装,极大地简化了部署过程,消除了集群安装的痛点。可以快速部署一套k8s集群。
(2)Kubeadm基本原理:
在启动的过程可以查看到拉取组件镜像的过程。之所以kubeadm能成为最快搭建k8s集群的工具就在于它将组件都容器化部署。
使用两条命令可以快捷部署一套k8s集群:
kubeadm init:初始化集群并启动master相关组件,在计划用做master的节点上执行。
kubeadm join:将节点加入上述集群,在计划用做node的节点上执行。
(3)K8s集群角色中包含的组件:
K8s-master:
kube-apiserver
controller-manager
Scheduler
Etcd
K8s-node:
Kubelet
Kube-proxy
Docker
1.1 项目实验环境要求
可根据实际生产环境的需求配备适配的基础环境,本次项目仅作为实验参考
集群角色 | 机器数量 | 操作系统 | 硬件配置 | iP地址 | 网络策略 | 备注 |
K8s-master | 1台 | CentOS7.x-86_x64 | 2个cpu2GB内存40GB硬盘 | 192.168.1.15 | 配置弹性公网;集群间网络可互访 | 禁止swap分区 |
K8s-node1 | 1台 | CentOS7.x-86_x64 | 2个cpu2GB内存40GB硬盘 | 192.168.1.16 | 配置弹性公网;集群间网络可互访 | 禁止swap分区 |
K8s-node2 | 1台 | CentOS7.x-86_x64 | 2个cpu2GB内存40GB硬盘 | 192.168.1.17 | 配置弹性公网;集群间网络可互访 | 禁止swap分区 |
1.2 实操步骤
1.2.1 环境准备
###三台机器均执行以下操作
###关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
###关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时操作
###关闭swap:
swapoff -a # 临时操作
vim /etc/fstab # 永久操作
###关闭swap:
swapoff -a # 临时
vim /etc/fstab # 永久
###设置主机名:
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
###将桥接的ipv4流量传递到iptables的链:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
###时间同步:假设时间不同步可以使用date set保证节点时间同步
1.2.2 安装docker
官网建议安装docker-19.03.9版本适配k8s集群
内网建议使用二进制安装,外网可以使用ali源或清华源进行安装
###三台机器均执行以下操作
###使用ali源下载并安装
Wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker
###使用二进制包安装
外网机器下载二进制包(下载完毕可使用文件传输工具将包传送到内网机器上):
Wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
###内网机器安装部署docker:
tar zxvf docker-19.03.9.tgz
mv docker/* /usr/bin
###配置system管理docker:
cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
###配置docker加速器:
mkdir /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
###后台加载daemon.json
systemctl daemon-reload
###启动docker
systemctl start docker
1.2.3 安装kubeadm
获取yum软件源安装kubeadm
本人使用华为云自带的yum软件源安装部署,仅作为实验参考
###外网环境安装kubeadm:
添加ali yum软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet
###内网环境安装kubeadm:
1、可以使用外网机器下载网络yum源并制作成本地源打包上传到内网机器上安装。
2、外网机器部署kubeadm获取到组件的镜像。Docker save将其保存为本地镜像供给内网使用(这里不详细解读操作,可以百度获取相关信息)
安装部署k8s-master:
###yum软件包完成kubeadm安装后通过命令行传参的方式初始化master。(当然也可以通过配置文件kubeadm.conf的方式进行初始化(即将命令行的参数写在配置文件中,通过配置文件引导初始化集群,本实验为了方便选择命令传参进行初始化)
kubeadm init \
--apiserver-advertise-address=192.168.1.15 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \ 指定版本
--service-cidr=10.96.0.0/12 \ #cidr网段指的是插件的网段.配置的网段和集群内的物理网段不可以起冲突
--pod-network-cidr=10.244.0.0/16 \ #pod分配的网段,配置的网段和集群内的物理网段不可以起冲突
--ignore-preflight-errors=all #指的是忽略错误信息
###在集群初始化的过程中,底层都历经哪些步骤呢?
1、[preflight]环境检查 #前期环境的部署情况
2、[kubelet-start]生成配置文件并启动 配置文件所在路径/var/lib/kubelet/config.yml
3、[cert]有apiserver,etcd,proxy证书
4、[kubeconfig]这个格式都用于K8S的认证文件 是组件之间的相互链接的关键
5、[control-plan] 静态创建pod静态pod目录 /etc/kubenetes/mainfests 用于拉取pod
6、[etcd]etcd静态pod启动etcd
实现kubelet开机自启:
Systemctl enable kubelet
###Master初始化的过程中会提示在其他节点执行自主添加进集群的命令
在node节点上输入以下命令可自主添加进k8s集群
kubeadm join 192.168.1.15:6443 --token 0exccz.8q01ow3wqgmw5d6o \
--discovery-token-ca-cert-hash sha256:83003fe9ea8097c62610b35904f2ea1b23832bbd7f98e2a3fbe4c03ee912ed2d
###token是有效期的,关闭终端找不到此提示命令,可以通过一条命令再次生成。
kubeadm token create --print-join-command
###加上--ttl ,可以设置永久不过期。
###查看token的有效时间 kubeadm token list
1.2.4 部署容器网络cni
Calico是一个纯三层的数据中心网络方案,calico支持广泛的平台,包括kubernets,openstack等等。
Calico在每个计算节点利用linux kernel实现一个高效的虚拟路由器来负责数据转发,而每个vrouter通过bgp协议负责把自己上运行的workload的路由信息向整个calico网络内传播
###外网环境:
wget https://docs.projectcalico.org/manifests/calico.yaml
vim calico.yaml
/192
去注释 - name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
/169
去注释
kubectl apply -f calico.yaml
Kubectl get pods -n kube-system -w 动态查看pod状态
###内网环境:
1、可以使用外网机器下载网络yum源并制作成本地源打包上传到内网机器上安装。
2、外网机器部署calico获取到组件的镜像。Docker save将其保存为本地镜像供给内网使用(这里不详细解读操作,可以百度获取相关信息)
1.2.5 部署dashboar
是默认k8s UI界面,主要用于查看集群资源
###下载并编辑dashboar的文本文档
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
vim recommended.yaml
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
nodePort: 30001(添加的)
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
type: NodePort(添加的)
###创建pod
kubectl apply -f recommended.yaml
###查看pod状态信息
kubectl get pods -n kubernetes-dashboard
###登录UI界面:
火狐浏览器登录https://公网ip:30001,选择tonken验证
我们可以创建一个用户拿到token值
###创建用户
创建service account并绑定默认cluster-admin管理员集群角色:
kubectl create serviceaccount dashboard-admin -n kube-system
###用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
###将token粘贴在网页验证的位置
###获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
1.2.6 Keepalived搭建Master高可用
Nginx是一个主流Web服务和反向代理服务器,这里用四层实现对apiserver实现负载均衡
Keepalived基于VIP绑定实现服务器双机热备
Keepalived主要根据Nginx运行状态判断是否需要故障转移(偏移VIP),例如当Nginx主节点挂掉,VIP会自动绑定在Nginx备节点,从而保证VIP一直可用,实现Nginx高可用。
###主/备安装软件包
yum install epel-release -y
yum install nginx keepalived -y
主/备nginx配置文件
cat > /etc/nginx/nginx.conf << "EOF"
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
#四层负载均衡,为两台Master apiserver组件提供负载均衡
stream {
log_format main '$remote_addr $upstream_addr - [$time_local] $status
$upstream_bytes_sent';
access_log /var/log/nginx/k8s-access.log main;
upstream k8s-apiserver {
server 192.168.31.71:6443; # Master1 APISERVER IP:PORT
server 192.168.31.74:6443; # Master2 APISERVER IP:PORT
}
server {
listen 6443;
proxy_pass k8s-apiserver;
}
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80 default_server;
server_name _;3. keepalived配置文件(Nginx Master)
vrrp_script:指定检查nginx工作状态脚本(根据nginx状态判断是否故障转移)
virtual_ipaddress:虚拟IP(
VIP)
检查nginx状态脚本:
location / {
}
}
}
EOF
主Keepalived配置文件
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
}
vrrp_script check_nginx {
#指定检查nginx工作状态脚本(根据nginx状态判断是否故障转移
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
state MASTER
interface ens33 # 修改为实际网卡名
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
priority 100 # 优先级,备服务器设置 90
advert_int 1 # 指定VRRP 心跳包通告间隔时间,默认1秒
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP
virtual_ipaddress {
#虚拟IP(VIP)
192.168.31.88/24
}
track_script { #
check_nginx
}
}
EOF
Nginx健康检查脚本
cat > /etc/keepalived/check_nginx.sh << "EOF"
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
exit 1
else
exit 0
fi
EOF
chmod +x /etc/keepalived/check_nginx.sh
备Keepalived配置文件
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_BACKUP
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.31.88/24
}
track_script {
check_nginx
}
}
EOF
### 备nginx健康检查脚本如主所示,不重复解释
二、k8s搭建Prometheus
1.promethues简介
(1)什么是prometheus?
是一套开源监控、报警、时间序列、数据库的组合采集的样本,以时间序列的方式存在内存(TSDB时序数据库,不属于非关系型或关系型数据库)中,并定时持久化存储在硬盘中。
(2)Prometheus适用场景和不适用场景
天生适用于k8s,promethus可以很好记录任何纯数据自时间序列,适用于以机器为中心的监视,也适用于高度动态的面向服务的体系结构的监视。
适用于为微服务架构,优势在于每个 prometheus server是独立的,不依赖与任何介质,当它挂掉的时候自己会书写一份日志。用户可以通过日志排除故障并重启prometheus。
不适合用于一些精准性需求很高的场合
(3)Prometheus关键组件
*Promethus server*
Promethus server 是promethus组件的核心部分
负责实现监控数据的获取、存储以及查询,提供PromQL查询语言支持
Retrieval:采样模块,prometheus的服务器在哪里拉取数据,检索拉取到的数据分发给 TSDB进行存储
TSDB:存储模块默认本地存储为TSDB
HTTP server : 提供http接口查询和面板,默认端口为9090
*Nodeport业务数据源*
业务数据源通过pull/push两种方式推送数据到promethus server
支持其他数据源的指标导入到prometheus,支持数据库,硬件,消息中间件,存储系统。http服务器,jmx等
负责收集目标对象的性能数据,并通过http接口供prometheus server获取
只要符合接口格式,就可以被采集
*Mysqld_exporter*
用于监控mysql指标的一个导出器,支持对mysql5.5以上进行监控。
*altermanager报警管理器*
Promethus通过配置报警规则,如果符合报警规则,那么就将报警推送到altermanager。
*可视化监控界面*
promethus收集到数据之后,由webui界面进行可视化图标展示,目前我们可以通过自定义的api客户端进行调用数据展示,也可以直接使用grafana解决方案来展示。
*short-lived jobs:*
存在时间不足以被删除的短暂或批量业务,无法通过pull的方式拉取,需要使用push的方式,与pushgeteway结合使用。
*Service Discovery:*
服务发现,prometheus支持多种服务发现机制: 文件,DNS,k8s,openstack,等,基于服务发现的过程,通过第三方接口,prometheus查询到需要监控的target列表,然后轮询这些target获取监控数据。
*客户端SDK*
官方提供的客户端类库有go,java,python,ruby
*pushgateway*
支持临时性的job主动推送指标的中间网关,prometheus默认通过pull方式从exporters拉取,但有些情况我们是不允许promethes
与exporters直接进行通信的,这时候我们可以使用pushgateway由客户端主动push数据到pushgateway,在由prometheus拉取。很
多时候我们需要自定义一些组件来采集
*proDash*
使用rails开发的dashboard,用于可视化指标数据
(4)工作过程
- prometheus server 定期从配置好的jobs或者exporters中拉metrics.或者接受来自pushgateway发过来的metrics,或者从其他的 prometheus server中拉取metrics。
- prometheus server 在本地存储收集到的metrics,并运行已经定义好的arlt.rules,记录新的时间序列或者向alertmanager推送报警。
- Alertmanager根据配置文件,对接受的警报进行处理,发出告警。
- 在图形界面中,可视化采集数据,可以使用别人写好的grafana模板。
1.1实操步骤
1.1.2 master创建一个命名空间
### master创建namespace
[root@k8s-master-01]#Vim prometheus_grafana_namespaces.yaml
apiVersion: v1
kind: Namespace
metadata:
name: prom-grafana
labels:
name: prom-grafana
[root@k8s-master-01 ]# kubectl create -f prom-grafana-namespaces.yaml
### master创建一个SA账号
[root@k8s-master-01]# kubectl create serviceaccount drifter -n prom-grafana
### matser节点把sa 账号drifter通过clusterrolebing绑定到clusterrole上
[root@k8s-master-01 ]# kubectl create clusterrolebinding drifter-clusterrolebinding -n prom-grafana --clusterrole=cluster-admin --serviceaccount=prom-grafana:drifter
####在集群的任意节点上创建一个数据目录
mkdir /data
chmod 777 /data/
1.1.3 master创建一个configmap存储卷,用来存放prometheus配置信息
[root@k8s-master-01]#vim prometheus-cfg.yaml
---
kind: ConfigMap
apiVersion: v1
metadata:
labels:
app: prometheus
name: prometheus-config
namespace: monitor-sa
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 1m
scrape_configs:
- 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_(.+)
- job_name: 'kubernetes-node-cadvisor'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
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
- job_name: 'kubernetes-apiserver'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
- 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
### 创建存储卷pod
kubectl create -f prometheus-cfg.yaml
1.1.4通过deployment部署prometheus server
[root@k8s-master-01]#Vim prometheus-deployment.yaml
[root@k8s-master-01 ]# more prometheus-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-server
namespace: prom-grafana
labels:
app: prometheus
spec:
replicas: 1
selector:
matchLabels:
app: prometheus
component: server
#matchExpressions:
#- {key: app, operator: In, values: [prometheus]}
#- {key: component, operator: In, values: [server]}
template:
metadata:
labels:
app: prometheus
component: server
annotations:
prometheus.io/scrape: 'false'
spec:
nodeName: k8s-node-02 #prometheus调度到这个节点上。
serviceAccountName: drifter
containers:
- name: prometheus
image: prom/prometheus:v2.2.1
imagePullPolicy: IfNotPresent
command:
- prometheus
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus
- --storage.tsdb.retention=720h
ports:
- containerPort: 9090
protocol: TCP
volumeMounts:
- mountPath: /etc/prometheus/prometheus.yml
name: prometheus-config
subPath: prometheus.yml
- mountPath: /prometheus/
name: prometheus-storage-volume
volumes:
- name: prometheus-config
configMap:
name: prometheus-config
items:
- key: prometheus.yml
path: prometheus.yml
mode: 0644
- name: prometheus-storage-volume
hostPath:
path: /data
type: Directory
###创建prometheus server pod
kubectl create -f prometheus-deployment.yaml
###查看prometheus server pod状态信息
kubectl get pod -n prom-grafana
1.1.5 对外暴露prometheus端口
###prometheus pod创建一个service
[root@k8s-master-01]#vim prometheus-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
name: prometheus-server
namespace: prom-grafana
labels:
app: prometheus
spec:
# type: NodePort
type: ClusterIP
ports:
- port: 9090
targetPort: 9090
# protocol: TCP
selector:
app: prometheus
component: prometheus-server
###对外暴露prometheus端口
[root@k8s-master-01]#kubectl create -f prometheus-svc.yaml
###查看pod状态信息
[root@k8s-master-01]#kubectl get svc -n prom-grafana
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus-server ClusterIP 10.103.172.209 <none> 9090/TCP 4m57s
1.1.6prometheus热更新
为了每次修改配置文件可以热加载prometheus,也就是不停止prometheus,就可以使配置生效,如修改prometheus-cfg.yaml,想要使配置生效可用如下热加载命令:
curl -X POST http://100.119.255.145:9090/-/reload
###热加载速度比较慢,可以暴力重启prometheus,如修改上面的prometheus-cfg.yaml文件之后,可执行如下强制删除:
[root@k8s-master-01]#kubectl delete -f prometheus-cfg.yaml
[root@k8s-master-01]#kubectl delete -f prometheus-deployment.yaml
###然后再通过apply更新:
[root@k8s-master-01]#kubectl apply -f prometheus-cfg.yaml
[root@k8s-master-01]#kubectl apply -f prometheus-deployment.yaml
注意:线上最好热加载,暴力删除可能造成监控数据的丢失
1.1.7 master节点部署node-porter组件
采集机器(物理机、虚拟机、云主机等)的监控指标数据,能够采集到的指标包括CPU, 内存,磁盘,网络,文件数等信息。
[root@k8s-master-01]#vim node-export.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: prom-grafana
labels:
name: node-exporter
spec:
selector:
matchLabels:
name: node-exporter
template:
metadata:
labels:
name: node-exporter
spec:
hostPID: true
hostIPC: true
hostNetwork: true
containers:
- name: node-exporter
image: prom/node-exporter:v0.16.0
ports:
- containerPort: 9100
resources:
requests:
cpu: 0.15
securityContext:
privileged: true
args:
- --path.procfs
- /host/proc
- --path.sysfs
- /host/sys
- --collector.filesystem.ignored-mount-points
- '"^/(sys|proc|dev|host|etc)($|/)"'
volumeMounts:
- name: dev
mountPath: /host/dev
- name: proc
mountPath: /host/proc
- name: sys
mountPath: /host/sys
- name: rootfs
mountPath: /rootfs
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
volumes:
- name: proc
hostPath:
path: /proc
- name: dev
hostPath:
path: /dev
- name: sys
hostPath:
path: /sys
- name: rootfs
hostPath:
path: /
[root@k8s-master-01]#kubectl create -f node-export.yaml
[root@k8s-master-01]#kubectl get pods -n prom-grafana 查看到pod处于running状态则证明pod创建成功
node-export默认的监听端口是9100,可以看到当前主机获取到的所有监控数据(如图)
三、k8s搭建Grafana
1.grafana介绍
(1)什么是grafana
简单来说,是一个多用途的监控工具,同时邮件等方式进行有效的预警通知,丰富直观的可视化界面,是一种数据源配置是其优点所在,是一个跨平台的源的度量分析和可视化工具,可与通过将采集的数据查询然后可视化的展示并及时通知。
1、展示方式:
客户端可视化有丰富的仪表盘比如热图、折线图等多种展示方式
2、数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等
3、通知提醒:可视方式展示重要指标的报警规则,它将不断计算发送通知,在数据达到阈值时Slack、PagerDuty等获得通知
4、混合展示:在同一图表中混合使用不同数据源,可以基于每个查询指定数据源,甚至自定义数据源
5、注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记
6、过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。
(2)Grafana结构
(3)通俗解释工作过程
Export监控指标并获取指标数据推送到prometheus,prometheus拉取数据并连接到grafana,直观展示被监控状态。
1.2 实操步骤
1.2.1 master上安装grafana
外网可以自动下载镜像,内网可以上传下载好镜像
[root@k8s-master-01]#vim grafana.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana-server
namespace: prom-grafana
spec:
replicas: 1
selector:
matchLabels:
task: monitoring
k8s-app: grafana
template:
metadata:
labels:
task: monitoring
k8s-app: grafana
spec:
imagePullSecrets:
- name: registry-pps
containers:
- name: grafana-server
image: registry.drifter.net/grafana:5.0.4
ports:
- containerPort: 3000
protocol: TCP
volumeMounts:
- mountPath: /etc/ssl/certs
name: ca-certificates
readOnly: true
- mountPath: /var
name: grafana-storage
env:
- name: INFLUXDB_HOST
value: monitoring-influxdb
- name: GF_SERVER_HTTP_PORT
value: "3000"
- name: GF_AUTH_BASIC_ENABLED
value: "false"
- name: GF_AUTH_ANONYMOUS_ENABLED
value: "true"
- name: GF_AUTH_ANONYMOUS_ORG_ROLE
value: Admin
- name: GF_SERVER_ROOT_URL
value: /
volumes:
- name: ca-certificates
hostPath:
path: /etc/ssl/certs
- name: grafana-storage
emptyDir: {}
1.2.2 创建pod
[root@k8s-master-01]#kubectl create -f grafana.yaml
deployment.apps/grafana-server created
1.2.3 查看grafana pod 状态 ,处于running状态则pod创建成功
[root@k8s-master-01]#kubectl get pods -n prom-grafana
NAME READY STATUS RESTARTS AGE
grafana-server-657495c99d-x5hnn 1/1 Running 0 23s
1.2.4 对外暴露grafana端口
[root@k8s-master-01]# vim grafana-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
labels:
kubernetes.io/cluster-service: 'true'
kubernetes.io/name: grafana-server
name: grafana-server
namespace: prom-grafana
spec:
ports:
- port: 80
targetPort: 3000
selector:
k8s-app: grafana
# type: NodePort
type: ClusterIP
[root@k8s-master-01]# kubectl create -f grafana-svc.yaml
1.2.5 查看暴露的端口
[root@k8s-master-01]# kubectl get svc -n prom-grafana
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana-server ClusterIP 10.102.129.245 <none> 3000/TCP 2m3s
prometheus-server ClusterIP 10.96.17.72 <none> 9090/TCP 12m
1.2.6 访问效果
- 访问prometheus
- 访问grafana