目标
k8s上面的常见的统一日志方案是EFK,具体如下:
- E:elasticsearch;
- F:fluentd;
- K:kibana
这里我们变成了使用fluentd的AWS替代品Fluent Bit,直接将日志输出到CloudWatch组。不需要E和K了。不过,这样仅仅用于AWS EKS。
步骤
给EC2 IAM角色CloudWatchAgentServerPolicy权限
给支撑运行EKS的EC2上面的IAM角色添加CloudWatchAgentServerPolicy策略。这里的角色名是AmazonEKSNodeRole。
创建amazon-cloudwatch命名空间
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
创建cluster-info的ConfigMap
ClusterName=cluster-name
RegionName=cluster-region
FluentBitHttpPort='2020'
FluentBitReadFromHead='Off'
[[ ${FluentBitReadFromHead} = 'On' ]] && FluentBitReadFromTail='Off'|| FluentBitReadFromTail='On'
[[ -z ${FluentBitHttpPort} ]] && FluentBitHttpServer='Off' || FluentBitHttpServer='On'
kubectl create configmap fluent-bit-cluster-info \
--from-literal=cluster.name=${ClusterName} \
--from-literal=http.server=${FluentBitHttpServer} \
--from-literal=http.port=${FluentBitHttpPort} \
--from-literal=read.head=${FluentBitReadFromHead} \
--from-literal=read.tail=${FluentBitReadFromTail} \
--from-literal=logs.region=${RegionName} -n amazon-cloudwatch
其中,cluster-name表示集群名称;cluster-region表示云区。
创建fluent bit的daemonset
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit.yaml
验证部署
kubectl get pods -n amazon-cloudwatch
应该能够查询出fluent-bit-*
开头的pod,就表示部署fluent bit成功。然后,跑到CloudWatch页面看看是否存在/aws/containerinsights/*
开头的相关日志组:
具体的SpringBoot服务的日志,在这个日志组下面:
/aws/containerinsights/uat/application
总结
这就是在AWS云上的k8s统一日志方案。和EFK方案很类似了。对业务服务SVC也是无侵入式的。
参考
- 将 Fluent Bit 设置为 DaemonSet 以将日志发送到 CloudWatch Logs
- 验证 先决条件