为何须要监控
Kubernetes (k8s) 是一个弱小的容器编排平台,用于部署、治理和扩大容器化应用程序。然而,随着集群规模的增长以及应用程序的复杂性减少,无效的监控变得至关重要。Prometheus 是一个宽泛应用的开源监控和警报工具,针对 Kubernetes 的监控计划具备很高的重要性,具体起因包含:
- 集群衰弱和稳定性:Kubernetes 集群由许多组件组成,包含节点、Pod、服务发现、网络等。监控可能帮忙您实时理解集群的衰弱状态,从而提前发现和解决潜在问题,确保应用程序的稳定性。
- 故障排除:当应用程序呈现问题或性能下降时,监控能够帮忙您疾速定位问题的根本原因。通过可视化指标和日志,您能够辨认故障产生的工夫、地位和影响范畴,从而减速故障排除过程。
- 资源利用率优化:Kubernetes 容许您灵便地调度和伸缩应用程序,但适度调配或有余调配的资源可能导致性能问题。监控能够帮忙您理解资源的应用状况,从而优化资源分配,提高效率。
- 自动化扩大:基于监控数据,您能够设置自动化的程度扩大策略,以依据实时负载主动调整 Pod 数量,从而在须要时实现更好的性能和资源利用率。
- 警报和告诉:Prometheus 具备弱小的警报性能,能够在出现异常状况时发送警报告诉。通过设置适当的警报规定,您能够在问题呈现之前及时采取措施,缩小停机工夫。
- 应用程序性能监测:监控不仅涵盖基础架构层面,还能够监控应用程序自身的性能指标,如申请提早、解决工夫等。这有助于您理解用户体验并进行性能优化。
- 容量布局:通过监控历史数据和趋势剖析,您能够更好地布局将来的资源需要,防止资源有余或过剩。
综上所述,Prometheus 监控对于 Kubernetes 集群和应用程序的衰弱、性能和可靠性至关重要。它可能帮忙您在动静的容器化环境中及时发现问题、预测趋势、优化资源,并对应用程序的运行状况放弃全面的可见性。
Prometheus 组件介绍
官网:https://prometheus.io
github 地址:https://github.com/prometheus/prometheus
Server 作用
Prometheus Server 的作用就是负责数据采集和存储,提供 PromQL 语句查问的反对
Alertmanager 作用
这个组件次要就是触发告警告诉的一个组件
Push Gateway 作用
长期的 Job 被动推送到指标的两头网关
Prometheus 工作流程
1. Prometheus Daemon 负责定时去指标上抓取 metrics (指标)数据
每个抓取指标须要裸露一个 http 服务的接口给它定时抓取。
反对通过配置文件、文本文件、Zookeeper、DNS SRV Lookup 等形式指定抓取指标。
2. PushGateway 用于 Client 被动推送 metrics 到 PushGateway
而 Prometheus 只是定时去 Gateway 上抓取数据。
适宜一次性、短生命周期的服务
3. Prometheus 在 TSDB 数据库存储抓取的所有数据
通过肯定规定进行清理和整顿数据,并把失去的后果存储到新的工夫序列中。
4. Prometheus 通过 PromQL 和其余 API 可视化地展现收集的数据
反对 Grafana、Promdash 等形式的图表数据可视化。
Prometheus 还提供 HTTP API 的查问形式,自定义所须要的输入
5. Alertmanager 是独立于 Prometheus 的一个报警组件
反对 Prometheus 的查问语句,提供非常灵便的报警形式
罕用的 exporter
- kube-state-metrics
收集 k8s 集群 master\&etcd 等根本状态信息 - node-exporter
收集 k8s 集群 node 信息 - cadvisor
收集 k8s 集群 docker 容器外部应用资源信息
先决条件
部署 EKS 集群
须要启动一台 ec2,并且绑定 role 角色。让其领有执行创立资源的权限。(zrm-role)
装置必要工具
###eksctl 工具
eksctl 是 eks 集群部署的命令行工具
curl -O https://image-auto-scaleing.s3.cn-north-1.amazonaws.com.cn/eksctl
chmod +x eksctl && mv ./eksctl /usr/bin/
###kubectl 工具
官网地址:https://docs.amazonaws.cn/eks/latest/userguide/install-kubectl.html
# 这里下载 kubectl 工具的时候,要抉择你对应的集群版本。有时候能够比你的集群版本能够低一个版本
curl -O https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/1.23.17/2023-03-17/bin/linux/amd64/kubectl
chmod +x kubectl && mv kubectl /usr/bin/
###helm 装置
curl -O https://image-auto-scaleing.s3.cn-north-1.amazonaws.com.cn/helm-v3.8.1-linux-amd64.tar.gz
tar -zxvf helm-v3.8.1-linux-amd64.tar.gz
cp linux-amd64/helm /usr/bin/
rm -rf helm* && rm -rf linux-amd64
定义一个集群的 yaml 文件
cat > cluster.yaml << EOF
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: prometheus-eks
region: cn-northwest-1
version: "1.26"
vpc:
id: "vpc-085306cb2975bd281"
subnets:
public:
cn-northwest-1a: {id: subnet-02cbfaaf2093cf95f}
cn-northwest-1b: {id: subnet-01614bc0f46e7439f}
cn-northwest-1c: {id: subnet-03a3409ceaabd52e3}
managedNodeGroups:
- name: ng-1
labels: {role: workers}
instanceType: t3a.large
desiredCapacity: 2
minSize: 0
maxSize: 10
volumeSize: 50
ssh:
allow: true
publicKeyName: zrm-nx
EOF
创立集群
eksctl create cluster -f cluster.yaml
创立实现之后如下图
控制台受权
eksctl create iamidentitymapping --cluster prometheus-eks --region=cn-northwest-1 --arn arn:aws-cn:iam::297669174308:user/zhangruimeng@bosicloud.com --group system:masters --username zhangruimeng
OIDC 身份关联
eksctl utils associate-iam-oidc-provider --cluster prometheus-eks --approve
aws eks describe-cluster --name prometheus-eks --query "cluster.identity.oidc.issuer" --output text
<!—->
cat >oidc.yaml <<eof< code="">
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: prometheus-eks ### 集群名字
region: cn-northwest-1 ### 集群所在区域
identityProviders:
- name: upgrade-eks-oidc ### 设置一个名字(任意)type: oidc
issuerUrl: $(aws eks describe-cluster --name prometheus-eks --query "cluster.identity.oidc.issuer" --output text) ### 必须关联 OIDC 的信息
clientId: sts.amazonaws.com ### 默认客户端 ID
EOF
<!—->
eksctl associate identityprovider -f oidc.yaml
绑定实现之后,能够在控制台查看对应的信息
装置 ALB 插件
### 下载策略文件
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.7/docs/install/iam_policy_cn.json
### 创立一个策略名字为:AWSLoadBalancerControllerIAMPolicy
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy_cn.json
# 这里须要留神的是,如果你的账户中存在这个策略,能够跳过这一步。进行下一步
###eksctl 创立一个 sa
eksctl create iamserviceaccount \
--cluster=prometheus-eks \
--namespace=kube-system \
--name=aws-load-balancer-controller-eks \
--role-name AmazonEKSLoadBalancerControllerRole-eks \
--attach-policy-arn=arn:aws-cn:iam::297669174308:policy/AWSLoadBalancerControllerIAMPolicy \
--approve
### 装置 git
yum -y install git
kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
### 配置 helm 仓库
helm repo add eks https://aws.github.io/eks-charts
### 更新 eks-charts 仓库
helm repo update
### 部署 alb
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=prometheus-eks \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set enableShield=false \
--set enableWaf=false \
--set enableWafv2=false
装置 EBS 存储插件
在控制台点击增加 EBS 插件
而后应用命令行的形式去增加一个 sa
### 增加 IAM 角色绑定权限
eksctl create iamserviceaccount \
--name ebs-csi-controller-sa \
--namespace kube-system \
--cluster prometheus-eks \
--attach-policy-arn arn:aws-cn:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
--approve \
--role-only \
--role-name AmazonEKS_EBS_CSI_DriverRole-eks
### 为 serviceaccount 增加一个注解
kubectl annotate serviceaccount ebs-csi-controller-sa \
-n kube-system eks.amazonaws.com/role-arn=arn:aws-cn:iam::297669174308:role/AmazonEKS_EBS_CSI_DriverRole-eks
### 重启失效
kubectl rollout restart deployment ebs-csi-controller -n kube-system
部署 Prometheus
### 创立命名空间
kubectl create namespace prometheus
### 增加对应 helm 的仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
### 装置
helm install prometheus prometheus-community/prometheus \
--namespace prometheus \
--set alertmanager.persistentVolume.storageClass="gp2" \
--set server.persistentVolume.storageClass="gp2"
创立胜利,pod 启动
有一个镜像是国外的。你如果是国外服务器部署则无需更改,国内服务器须要更改一下
### 更改为国内的镜像地址
kubectl patch deployment prometheus-kube-state-metrics -p '{"spec":{"template":{"spec":{"containers":[{"name":"kube-state-metrics","image":"registry.cn-hangzhou.aliyuncs.com/lemon-public/kube-state-metrics:v2.9.2"}]}}}}' -n prometheus
Prometheus 裸露一个 LB
kubectl get svc -n prometheus ### 查看 svc 的地址以及类型
增加注解:更改为 LoadBalancer 类型
### 须要增加注解
kubectl annotate service prometheus-server service.beta.kubernetes.io/aws-load-balancer-nlb-target-type=ip \
service.beta.kubernetes.io/aws-load-balancer-scheme=internet-facing \
service.beta.kubernetes.io/aws-load-balancer-subnets=subnet-02cbfaaf2093cf95f,subnet-01614bc0f46e7439f,subnet-03a3409ceaabd52e3 \
service.beta.kubernetes.io/aws-load-balancer-type=nlb -n prometheus
### 更改类型
kubectl patch service prometheus-server -p '{"spec": {"type":"LoadBalancer"}}' -n prometheus
拜访 Prometheus
编辑者:张瑞猛
审阅人:Eten.gao