把kubernetes的log转发到cloudwatch有多难?
kubernetes日志收集 docer level 最近尝试把kubernetes的log转发到aws的cloudwatch中。原因当然是因为方便查log咯。之前试过用docker的方式导出,还是比较方便的。原理就是在使用kops创建集群的时候,添加两个配置项: aws cloudwatch权限 docker配置里,设置使用awslog作为log收集器 这样就可以简单的将kubernetes中所有container的log收集到cloudwatch下的group名字为:kubernetes的下面。唯一的问题是,log name使用的是container id,不够对人类友好。当时的想法是对kubernetes的dashboard进行二次开发。因为使用了docker方式的日志收集之后,dashboard下的log功能已经废弃了,所以我想在dashboard中点击log的时候,通过获取container id的方式,直接拿到cloudwatch下的log。听上去还是很美好的,也是可行的,但是并没有动手做。 fluentd 后来折腾grpc on istio的时候,因为看log实在是太麻烦了,本来问题就很tricky,看log又麻烦。索性就用fluentd重新搞了一遍log收集。 之前用fluentd cloudwatch搞过一次,因为失败了就没再搞。这次算是抱着必死的决心,一定要搞定! Helm 这里使用helm安装。首先吐槽helm,helm的文档基本是摆设,实际功能全靠自己摸索。虽然说kubernetes很复杂,但是人家谷歌文档确实写得好啊。helm的文档从排版到内容,啧啧… 我这里使用kops安装kubernetes的,是一台内存1g的linux,使用snap安装helm。helm在init的时候需要为tiller创建service account和role: apiVersion: v1 kind: ServiceAccount metadata: name: tiller namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: tiller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: tiller namespace: kube-system 注意这里指定了namespace: kube-system。这是kubernetes所谓role based access controll(RBAC)的重要一步。少了这一步,后面会有各种各样的麻烦,helm文档居然没有强制要求,最佳实践也是一笔带过。 kube2iam 接下来需要装kube2iam。这里就需要之前安装的tiller了: helm install stable/kube2iam --namespace kube-system --name my-release --set=extraArgs.base-role-arn=arn:aws:iam::xxxxxxxxxx:role/,extraArgs.default-role=kube2iam-default,host.iptables=true,host.interface=cbr0,rbac.create=true 关于role的解释在这里。对应kops下创建的集群,kops会在aws下创建多个role,对应node的role的名字应该是nodes.xxx.xxx.local。这里的问题是,如果我现在需要对这个role新增policy,就需要每次修改node role。kube2iam就是来解决这个问题的。kube2iam使用了aws iam中assume的功能,这里的assume可以理解为承担。你需要创建一个新role,这里就是kube2iam-default,在这个role中修改trust relation:...