Kubernetes部署¶
部署Loggie DaemonSet¶
请确保本地有kubectl和helm可执行命令。
下载helm-chart包¶
VERSION=v1.4.0
helm pull https://github.com/loggie-io/installation/releases/download/$VERSION/loggie-$VERSION.tgz && tar xvzf loggie-$VERSION.tgz
<VERSION>
替换成具体的版本号。比如v1.4.0。 可从release tag里找。
修改配置¶
进入chart目录:
cd installation/helm-chart
查看values.yml,并根据实际情况进行修改。
目前可配置的参数如下所示:
镜像¶
image: loggieio/loggie:main
资源¶
resources:
limits:
cpu: 2
memory: 2Gi
requests:
cpu: 100m
memory: 100Mi
额外启动参数¶
extraArgs: {}
extraArgs:
log.level: debug
log.jsonFormat: false
额外挂载¶
extraVolumeMounts:
- mountPath: /var/log/pods
name: podlogs
- mountPath: /var/lib/kubelet/pods
name: kubelet
- mountPath: /var/lib/docker
name: docker
extraVolumes:
- hostPath:
path: /var/log/pods
type: DirectoryOrCreate
name: podlogs
- hostPath:
path: /var/lib/kubelet/pods
type: DirectoryOrCreate
name: kubelet
- hostPath:
path: /var/lib/docker
type: DirectoryOrCreate
name: docker
特别强调的是:由于Loggie本身也是容器化部署,所以Loggie也需要挂载节点的一些volume来采集日志,否则Loggie容器内部看不到日志文件,更没办法去采集。
这里简单列举一下采集什么样的日志需要挂载什么路径:
-
采集 stdout 标准输出:Loggie会从/var/log/pods下采集,所以Loggie需要挂载:
volumeMounts: - mountPath: /var/log/pods name: podlogs - mountPath: /var/lib/docker name: docker volumes: - hostPath: path: /var/log/pods type: DirectoryOrCreate name: podlogs - hostPath: path: /var/lib/docker type: DirectoryOrCreate name: docker
但是有可能/var/log/pods下这些日志文件会软链接到docker的root路径下,默认为
/var/lib/docker
,这个时候,需要同样挂载/var/lib/docker
这个路径到Loggie中:volumeMounts: - mountPath: /var/log/pods name: podlogs volumes: - hostPath: path: /var/log/pods type: DirectoryOrCreate name: podlogs
另外,如果非docker运行时,比如使用containerd,无需挂载
/var/lib/docker
,Loggie会从/var/log/pods
中寻找实际的标准输出路径。 -
采集业务Pod使用 HostPath 挂载的日志:比如业务统一将日志挂载到了节点的
/data/logs
路径下,则需要挂载挂载该路径:
volumeMounts:
- mountPath: /data/logs
name: logs
volumes:
- hostPath:
path: /data/logs
type: DirectoryOrCreate
name: logs
- 采集业务Pod使用 EmptyDir 挂载的日志:默认emtpyDir会在节点的
/var/lib/kubelet/pods
路径下,所以需要Loggie挂载该路径。如果环境的kubelet修改了该路径配置,这里需要同步修改:
volumeMounts:
- mountPath: /var/lib/kubelet/pods
name: kubelet
volumes:
- hostPath:
path: /var/lib/kubelet/pods
type: DirectoryOrCreate
name: kubelet
- 采集业务Pod使用 PV 挂载的日志:和使用EmptyDir一致。
-
采集业务Pod 无挂载 ,同时设置了
rootFsCollectionEnabled: true
,Loggie会自动从docker的rootfs里找到容器里的实际路径,此时需要挂载docker的root路径:如果docker的实际root路径有修改,则需要同步修改这里的volumeMount和volume,比如修改了root路径为volumeMounts: - mountPath: /var/lib/docker name: docker volumes: - hostPath: path: /var/lib/docker type: DirectoryOrCreate name: docker
/data/docker
,则挂载为:volumeMounts: - mountPath: /data/docker name: docker volumes: - hostPath: path: /data/docker type: DirectoryOrCreate name: docker
其他:
- Loggie需要记录采集的文件状态(offset等),避免重启后从头开始采集文件,造成日志采集重复,默认挂载路径为/data/loggie.db,所以挂载了
/data/loggie--{{ template "loggie.name" . }}
目录。
调度¶
nodeSelector: {}
affinity: {}
# podAntiAffinity:
# requiredDuringSchedulingIgnoredDuringExecution:
# - labelSelector:
# matchExpressions:
# - key: app
# operator: In
# values:
# - loggie
# topologyKey: "kubernetes.io/hostname"
tolerations: []
# - effect: NoExecute
# operator: Exists
# - effect: NoSchedule
# operator: Exists
更新策略¶
updateStrategy:
type: RollingUpdate
RollingUpdate
或者OnDelete
。
全局配置¶
config:
loggie:
reload:
enabled: true
period: 10s
monitor:
logger:
period: 30s
enabled: true
listeners:
filesource: ~
filewatcher: ~
reload: ~
sink: ~
discovery:
enabled: true
kubernetes:
containerRuntime: containerd
fields:
container.name: containername
logConfig: logconfig
namespace: namespace
node.name: nodename
pod.name: podname
http:
enabled: true
port: 9196
containerRuntime: containerd
,指定容器运行时。
service¶
如果Loggie希望接收其他服务发送的数据,需要将自身的服务通过service暴露出来。
正常情况下,使用Agent模式的Loggie只需要暴露自身管理端口。
servicePorts:
- name: monitor
port: 9196
targetPort: 9196
部署¶
初次部署,我们指定部署在loggie
namespace下,并让helm自动创建该namespace。
helm install loggie ./ -nloggie --create-namespace
如果你的环境中已经创建了loggie
namespace,可以忽略其中的-nloggie
和--create-namespace
参数。当然,你也可以使用自己的namespace,将其中loggie
替换即可。
Kubernetes版本问题
failed to install CRD crds/crds.yaml: unable to recognize "": no matches for kind "CustomResourceDefinition" in version "apiextensions.k8s.io/v1"
rm loggie/crds/crds.yaml
,重新install。
查看部署状态¶
执行完后,通过使用helm命令来查看部署状态:
helm list -nloggie
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
loggie loggie 1 2021-11-30 18:06:16.976334232 +0800 CST deployed loggie-v0.1.0 v0.1.0
同时也可以通过kubectl命令查看Pod是否已经被创建。
kubectl -nloggie get po
loggie-sxxwh 1/1 Running 0 5m21s 10.244.0.5 kind-control-plane <none> <none>
部署Loggie Aggregator¶
部署Aggregator基本和Agent一致,在helm chart中我们提供了aggregator config
部分,只需改成enabled: true
即可。
helm chart中提供了statefulSet的部署方式,你也可以根据需求修改成deployment等方式。
同时,请注意在values.yaml中根据情况增加:
- nodeSelector或者affinity,根据node是否有污点增加tolerations。使得Aggregator StatefulSet只调度在某几个节点上
- service增加接收的端口,比如使用Grpc source,需要填写默认的6066端口:
servicePorts: - name: grpc port: 6066 targetPort: 6066
- discovery.kubernetes中增加cluster字段,表示中转机集群名称,用于区别Agent或者其他的Loggie集群,如下所示:
config: loggie: discovery: enabled: true kubernetes: cluster: aggregator
执行部署命令参考:
helm install loggie-aggregator ./ -nloggie-aggregator --create-namespace
Note
Loggie中转机同样可以使用Deployment或者StatefulSet来部署,请参考DaemonSet自行修改helm chart。