云原生实践(四):K8S + Prometheus + Azure Storage动手实验
安装 Prometheus 这个产品,并且将数据保存到 Azure Storage Account 中。
背景
之前一直在使用 Azure Monitor 作为 Azure Kubernetes Service 的监控,不过很多客户还是希望使用 Prometheus 这个“明星”产品。这个动手实验的目标是在目前的集群中安装 Prometheus 这个产品,并且将数据保存到 Azure Storage Account 中。
在集群中安装 Prometheus Server
对于 Prometheus 来说,有很多其它组件和产品可以配合它工作,比如常见的 node-export 、kube-state-metrics 这些帮助收集 Kubernetes 集群数据的组件,还有类似 Grafana 这样通过图表来展示 Prometheus 数据的产品。但对我来说,第一步是安装好 Prometheus Server。
1. 准备 deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-core
namespace: core-monitor
labels:
app: prometheus
spec:
replicas: 1
selector:
matchLabels:
app: prometheus
template:
metadata:
name: prometheus-main
labels:
app: prometheus
spec:
serviceAccountName: prometheus-aks
containers:
- name: prometheus
image: prom/prometheus:v2.38.0
command:
- "/bin/prometheus"
args:
- '--storage.tsdb.retention=30d'
- '--config.file=/etc/prometheus/prometheus.yaml'
- '--storage.tsdb.path=/etc/prometheus-data'
- '--web.enable-lifecycle'
ports:
- containerPort: 9090
protocol: TCP
volumeMounts:
- name: config-volume
mountPath: /etc/prometheus
- name: data-volume
mountPath: /etc/prometheus-data
volumes:
- name: config-volume
configMap:
name: prometheus-core
- name: data-volume
persistentVolumeClaim:
claimName: prometheus-data
- serviceAccountName 这里使用了一个我提前创建好的账户,并赋予了这个账户对应的角色足够的权限。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups: [""]
resources:
- nodes
- nodes/proxy
- services
- endpoints
- pods
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources:
- configmaps
verbs: ["get"]
- nonResourceURLs: ["/metrics"]
verbs: ["get"]
- 运行的参数选择
-
storage.tsdb.retention 指定了数据保存的时长,这里我用了 30d 表示我保留30天的数据
-
config.file 指定了配置文件的路径
-
storage.tsdb.path 指定了数据的保存路径,必须我们不希望万一 Prometheus Server Pod 挂掉重启,数据丢失
-
web.enable-lifecycle 这个比较有意思,加了这个参数我们可以在修改 config.file 内容后,通过发送一个 POST 请求到 prometheus server 刷新配置,而不需要重新启动服务。
-
-
volumes 这里挂载了一个 configMap 用来保存配置信息, 一个 persistentVolumeClaim 用来长久保存数据
2. 准备配置信息
---
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-core
namespace: core-monitor
data:
prometheus.yaml: |
global:
scrape_interval: 15s
scrape_timeout: 15s
scrape_configs:
- job_name: 'kubernetes-apiservers'
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- action: keep
regex: default;kubernetes;https
source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_service_name
- __meta_kubernetes_endpoint_port_name
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
- job_name: 'kubernetes-kubelet'
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
- source_labels: [__meta_kubernetes_node_name]
regex: 'virtual-node-aci-linux'
action: drop
- job_name: 'kubernetes-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:
- 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
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- source_labels: [__meta_kubernetes_node_name]
regex: 'virtual-node-aci-linux'
action: drop
- source_labels: [__meta_kubernetes_node_name]
regex: 'virtual-node-aci-linux'
action: drop
这里只配置收集 API server 、node 等一些基本信息。通过 kubernetes_sd_configs 来动态控制 Targets。
3. 执行部署, 可以看到几个 Job 都正常工作
在集群中安装 Azure File CSI
使用 永久性卷 (PV) 来保存监控数据是一个不错的选择。既然在 Azure 云上,那么使用 Azure Storage Account 就是一个不错的选择。
容器存储接口 (CSI) 是有关在 Kubernetes 上的容器化工作负载中公开任意块和文件存储系统的一套标准。具体可以看 Container Storage Interface (CSI) 介绍。
对于Azure 存储的选择,我们可以参考下面的表格,因为 blob 还在预览阶段,所以最终我选择使用 Azure File 作为数据保存的目标。
Azure File CSI Driver for Kubernetes
1. 在 Azure 中创建一个 Service Principal
az ad sp create-for-rbac --name "myApp" --role contributor \
--scopes /subscriptions/{subscription-id}/resourceGroups/{resource-group} \
--sdk-auth
# Replace {subscription-id}, {resource-group} with the subscription, resource group details
# The command should output a JSON object similar to this:
{
"clientId": "<GUID>",
"clientSecret": "<STRING>",
"subscriptionId": "<GUID>",
"tenantId": "<GUID>",
"resourceManagerEndpointUrl": "<URL>"
(...)
}
2. 给这个 Service Principal 赋予一个资源组的 Contributor 角色,因为我后面使用的是动态的方式,所以会自动在这个资源组下创建 storage account 。
3. 准备 cloud provider config file, 这个文件的模板如下
{
"cloud":"AzurePublicCloud", // mandatory
"tenantId": "xxxx-xxxx-xxxx-xxxx-xxxx", // mandatory
"subscriptionId": "xxxx-xxxx-xxxx-xxxx-xxxx", // mandatory
"resourceGroup": "resource-group-name", // mandatory
"location": "eastus2", // mandatory
"aadClientId": "xxxx-xxxx-xxxx-xxxx-xxxx", // mandatory if using service principal
"aadClientSecret": "xxxx-xxxx-xxxx-xxxx-xxxx", // mandatory if using service principal
"useManagedIdentityExtension": false, // set true if using managed idenitty
"userAssignedIdentityID": "", // mandatory if using managed idenitty
"useInstanceMetadata": true, // optional
"vmType": "standard", // optional
"subnetName": "k8s-subnet", // optional
"vnetName": "k8s-vnet-17181929", // optional
"vnetResourceGroup": "", // optional
"cloudProviderBackoff": true // optional
}
3. 因为支持东 secret 中读取,所以简化一下配置方式。将刚才的 json 文件 base64 编码,这里可以在线工具。
This driver also supports read cloud config from kubernetes secret as first priority
4. 准备一个 Secret 文件,把刚才的 base64 后的 cloud provider config file 填充到这里
apiVersion: v1
data:
cloud-config: [fill-in-here]
kind: Secret
metadata:
name: azure-cloud-provider
namespace: kube-system
type: Opaque
5. 部署 Secret,从dashboard 页面可以看到刚才部署的 Secret
6. 安装 azure file csi driver , 直接clone 一份代码到本地,然后切换到对应版本开始安装
git clone https://github.com/kubernetes-sigs/azurefile-csi-driver.git
cd azurefile-csi-driver
git checkout v1.22.0
./deploy/install-driver.sh v1.22.0 local
7. 创建自己的 storage class
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: standard-lrs-azurefile
provisioner: file.csi.azure.com # replace with "kubernetes.io/azure-file" if aks version is less than 1.21
allowVolumeExpansion: true
mountOptions:
- dir_mode=0777
- file_mode=0777
- uid=0
- gid=0
- mfsymlinks
- cache=strict
- actimeo=30
- nobrl
parameters:
skuName: Standard_LRS
在 Prometheus Server 上使用 Azure File 保存数据
1. 创建一个 PVC,这里用动态的方式
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: prometheus-data
namespace: core-monitor
spec:
accessModes:
- ReadWriteMany
storageClassName: standard-lrs-azurefile
resources:
requests:
storage: 500Gi
2. 挂载到 Prometheus Server Pod,因为之前已经挂载过了,只是重新创建了新的 PVC 和 PV,所以 Prometheus Server Deployment 不需要修改
3. 重新启动 Prometheus Server,运行一段时间以后可以看到,在Azure Storage Account 中出现了相应数据
4. 在 dashboard 查看 PV
更多推荐
所有评论(0)