1. 程式人生 > >ACK容器服務虛擬節點使用阿里雲日誌服務來收集業務容器日誌

ACK容器服務虛擬節點使用阿里雲日誌服務來收集業務容器日誌

按照這篇博文的介紹,可以在ACK叢集上通過Helm的方式部署虛擬節點,提升叢集的彈效能力。現在,通過虛擬節點部署的ECI彈性容器例項也支援將stdout輸出、日誌檔案同步到阿里雲日誌服務(SLS)進行統一管理,所有日誌能夠被統一收集同一個日誌服務project裡面。並且,日誌收集方式與叢集上普通容器收集方式一致,無縫結合。

本文將結合虛擬節點彈性伸縮的能力來介紹日誌收集。

在ACK叢集部署日誌服務支撐元件

ACK叢集安裝介面勾選使用日誌服務,叢集會安裝支援日誌收集的必要元件。

叢集安裝完畢後,可以在日誌服務控制檯 檢視到按k8s-log-{Kubernetes 叢集 ID}

形式命名的工程。收集到的業務容器日誌都會放在該工程下。

已有叢集可以按照阿里雲幫助文件去部署相關元件。如果在普通叢集沒有部署相關日誌服務元件,那麼ECI例項的日誌將會被統一收集到eci-log-default-project-開頭的project內。

部署虛擬節點

可以按照ACK容器服務釋出virtual node addon,快速部署虛擬節點提升叢集彈效能力這篇文章在叢集內部署虛擬節點。

使用YAML模版來收集普通業務容器日誌

YAML 模板的語法同 Kubernetes 語法,但是為了給容器指定採集配置,需要使用 env 來為 container 增加採集配置和自定義 Tag,並根據採集配置,建立對應的 volumeMounts 和 volumes。以下是一個簡單的 Deployment 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: alpine
  name: alpine
spec:
  replicas: 2
  selector:
    matchLabels:
      app: alpine
  template:
    metadata:
      labels:
        app: alpine
    spec:
      containers:
      - image: alpine
        imagePullPolicy: Always
        args:
        - ping
        - 127.0.0.1
        name: alpine
        env:
        ######### 配置 環境變數 ###########
        - name: aliyun_logs_test-stdout
          value: stdout
        - name: aliyun_logs_test-file
          value: /log/*.log
        - name: aliyun_logs_log_tags
          value: tag1=v1
        #################################
        ######### 配置vulume mount #######
        volumeMounts:
        - name: volume-sls
          mountPath: /log
      volumes:
      - name: volume-sls
      ###############################

其中有三部分需要根據您的需求進行配置,一般按照順序進行配置。

  • 第一部分通過環境變數來建立您的採集配置和自定義 Tag,所有與配置相關的環境變數都採用aliyun_logs_作為字首。
    建立採集配置的規則如下:
- name: aliyun_logs_{Logstore 名稱}
  value: {日誌採集路徑}

示例中建立了兩個採集配置,其中 aliyun_logs_log-stdout 這個 env 表示建立一個 Logstore 名字為 log-stdout,日誌採集路徑為 stdout 的配置,從而將容器的標準輸出採集到 log-stdout 這個 Logstore 中。

說明 Logstore 名稱中不能包含下劃線(_),可以使用 - 來代替。

  • 建立自定義 Tag 的規則如下:
- name: aliyun_logs_{任意不包含'_'的名稱}_tags
  value: {Tag 名}={Tag 值}

配置 Tag 後,當採集到該容器的日誌時,會自動附加對應的欄位到日誌服務。

  • 如果您的採集配置中指定了非 stdout 的採集路徑,需要在此部分建立相應的 volumnMounts。
    示例中採集配置添加了對c:log*.log 的採集,因此相應地添加了c:log的 volumeMounts。

將上述yaml儲存為test.yaml,應用在叢集上:

$ kubectl create ns virtual
$ kubectl create -f test.yaml -n virtual

# 檢視pod部署情況
$ kubectl get pods -n virtual -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP             NODE                       NOMINATED NODE
alpine-57c9977fd6-bsvwh   1/1     Running   0          10m   172.18.1.161   cn-hangzhou.10.1.190.228   <none>
alpine-57c9977fd6-wc89v   1/1     Running   0          10m   172.18.0.169   cn-hangzhou.10.1.190.229   <none>

檢視日誌

到日誌服務控制檯的相應工程下找到test-stdout這個logstore,點選查詢可以看到收集到的普通容器的stdout日誌:

將業務容器擴容到虛擬節點

將把上面建立的名稱空間virtual標記為使用虛擬節點進行部署,然後伸縮兩個pod到虛擬節點。

# 標記namespace
$ kubectl label namespace virtual virtual-node-affinity-injection=enabled

# scale deployment/alpine
$ kubectl scale --replicas=4 deployments/alpine -n virtual

# 檢視pod部署情況,可以看到2個部署在正常節點,2個部署在虛擬節點
$ kubectl get pods -n virtual -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP             NODE                       NOMINATED NODE
alpine-57c9977fd6-2ctp7   1/1     Running   0          23s   10.1.190.231   virtual-kubelet            <none>
alpine-57c9977fd6-b4445   1/1     Running   0          23s   10.1.190.230   virtual-kubelet            <none>
alpine-57c9977fd6-bsvwh   1/1     Running   0          10m   172.18.1.161   cn-hangzhou.10.1.190.228   <none>
alpine-57c9977fd6-wc89v   1/1     Running   0          10m   172.18.0.169   cn-hangzhou.10.1.190.229   <none>

再次檢視日誌

再點開test-stdout這個logstore,可以看到收集到的普通容器和ECI例項的混合stdout日誌:

需要注意: 您賬戶下不同叢集內的不同logstore不可以配置收集相同匹配規則的ECI例項日誌,如stdout;同一個叢集下,不同logstore不可以配置收集相同匹配規則的普通容器、ECI例項日誌。


原文連結
本文為雲棲社群原創內容,未經