按照这篇博文的介绍,可以在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实例日志。
本文作者:柏理
本文为云栖社区原创内容,未经允许不得转载。