跳转至

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
loggie的镜像。可从docker hub中查看所有镜像。

资源

resources:
  limits:
    cpu: 2
    memory: 2Gi
  requests:
    cpu: 100m
    memory: 100Mi
Loggie Agent的limit/request资源,可以根据实际情况修改。

额外启动参数

extraArgs: {}
Loggie的额外启动参数,比如希望修改配置使用debug的日志级别,不使用json格式的日志打印形式,可以修改为:
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路径:

    volumeMounts:
    - mountPath: /var/lib/docker
      name: docker  
    
    volumes:
    - hostPath:
      path: /var/lib/docker
      type: DirectoryOrCreate
    name: docker
    
    如果docker的实际root路径有修改,则需要同步修改这里的volumeMount和volume,比如修改了root路径为/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"
可使用nodeSelector和affinity来控制Loggie Pod的调度,具体请参考Kubernetes文档。

tolerations: []
# - effect: NoExecute
#   operator: Exists
# - effect: NoSchedule
#   operator: Exists
如果节点有自己的taints,会导致Loggie Pod无法调度到该节点,如果需要忽略taints,可以加上对应的tolerations。

更新策略

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
具体参数说明可参考组件配置。 需要注意的是,如果你在本地使用Kind等工具部署Kubernetes,Kind默认会使用containerd runtime,此时需要在discovery.kubernetes中增加 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"
如果你在helm install的时候出现类似的问题,说明你的Kubernetes版本较低,不支持apiextensions.k8s.io/v1版本CRD。Loggie暂时保留了v1beta1版本的CRD,请删除charts中v1beta1版本,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。