云原生实践(四):K8S + Prometheus + Azure Storage动手实验

背景

之前一直在使用 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 编码,这里可以在线工具。 

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 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值