干货速看!同行盆友来稿:一文带你搭建K8S高可用集群,以及在上面搭建Prometheus和Grafana。1

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
可观测监控 Prometheus 版,每月50GB免费额度
简介: 干货速看!同行盆友来稿:一文带你搭建K8S高可用集群,以及在上面搭建Prometheus和Grafana。

写在开篇

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。

不适合用于一些精准性需求很高的场合

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1天前
|
存储 数据采集 Prometheus
Grafana Prometheus Altermanager 监控系统
Grafana、Prometheus 和 Alertmanager 是一套强大的开源监控系统组合。Prometheus 负责数据采集与存储,Alertmanager 处理告警通知,Grafana 提供可视化界面。本文简要介绍了这套系统的安装配置流程,包括各组件的下载、安装、服务配置及开机自启设置,并提供了访问地址和重启命令。适用于希望快速搭建高效监控平台的用户。
38 20
|
3天前
|
Prometheus 运维 监控
Prometheus+Grafana+NodeExporter:构建出色的Linux监控解决方案,让你的运维更轻松
本文介绍如何使用 Prometheus + Grafana + Node Exporter 搭建 Linux 主机监控系统。Prometheus 负责收集和存储指标数据,Grafana 用于可视化展示,Node Exporter 则采集主机的性能数据。通过 Docker 容器化部署,简化安装配置过程。完成安装后,配置 Prometheus 抓取节点数据,并在 Grafana 中添加数据源及导入仪表盘模板,实现对 Linux 主机的全面监控。整个过程简单易行,帮助运维人员轻松掌握系统状态。
35 3
|
3天前
|
Prometheus 监控 前端开发
Grafana 安装配置教程,让你的 Prometheus 监控数据变得更美观
《Grafana安装配置教程,让你的Prometheus监控数据变得更美观》简介: Grafana是一个开源的度量分析与可视化工具,支持多种数据源(如Prometheus),提供丰富的可视化功能和警报机制。本文详细介绍了Grafana的安装、汉化方法及模板使用,帮助用户轻松创建美观、灵活的数据面板,并实现数据的协作与共享。通过Docker镜像、配置文件修改或替换前端页面等方式实现汉化,让用户更便捷地使用中文界面。此外,还提供了导入JSON格式模板的具体步骤,方便快速搭建仪表盘。
20 2
|
3天前
|
Prometheus Cloud Native Linux
Prometheus+Grafana新手友好教程:从零开始搭建轻松掌握强大的警报系统
本文介绍了使用 Prometheus 和 Grafana 实现邮件报警的方案,包括三种主要方法:1) 使用 Prometheus 的 Alertmanager 组件;2) 使用 Grafana 的内置告警通知功能;3) 使用第三方告警组件如 OneAlert。同时,详细描述了环境准备、Grafana 安装配置及预警设置的步骤,确保用户能够成功搭建并测试邮件报警功能。通过这些配置,用户可以在系统或应用出现异常时及时收到邮件通知,保障系统的稳定运行。
22 1
|
1月前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
254 3
|
3天前
|
Prometheus 监控 Cloud Native
无痛入门Prometheus:一个强大的开源监控和告警系统,如何快速安装和使用?
Prometheus 是一个完全开源的系统监控和告警工具包,受 Google 内部 BorgMon 系统启发,自2012年由前 Google 工程师在 SoundCloud 开发以来,已被众多公司采用。它拥有活跃的开发者和用户社区,现为独立开源项目,并于2016年加入云原生计算基金会(CNCF)。Prometheus 的主要特点包括多维数据模型、灵活的查询语言 PromQL、不依赖分布式存储、通过 HTTP 拉取时间序列数据等。其架构简单且功能强大,支持多种图形和仪表盘展示模式。安装和使用 Prometheus 非常简便,可以通过 Docker 快速部署,并与 Grafana 等可
36 2
|
4月前
|
Prometheus 监控 Cloud Native
【监控】prometheus传统环境监控告警常用配置
【监控】prometheus传统环境监控告警常用配置
【监控】prometheus传统环境监控告警常用配置
|
27天前
|
存储 Prometheus 监控
监控堆外第三方监控工具Prometheus
监控堆外第三方监控工具Prometheus
45 3
|
1月前
|
存储 Prometheus 运维
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案。该集成结合了ARMS的基础设施监控能力和Prometheus的灵活配置及社区支持,实现了全面、精准的系统状态、性能和错误监控,提升了应用的稳定性和管理效率。通过统一的数据视图和高级查询功能,帮助企业有效应对云原生挑战,促进业务的持续发展。
38 3
|
1月前
|
Prometheus 监控 Cloud Native
在 HBase 集群中,Prometheus 通常监控哪些类型的性能指标?
在 HBase 集群中,Prometheus 监控关注的核心指标包括 Master 和 RegionServer 的进程存在性、RPC 请求数、JVM 内存使用率、磁盘和网络错误、延迟和吞吐量、资源利用率及 JVM 使用信息。通过 Grafana 可视化和告警规则,帮助管理员实时监控集群性能和健康状况。

热门文章

最新文章