按照這篇 博文
的介紹,可以在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。
示例中采集配置添加了對/log/*.log 的采集,是以相應地添加了/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執行個體日志。