You can use Logtail to collect application logs from Windows nodes. This topic describes how to use Logtail to collect application logs from Windows nodes.

Prerequisites

Deploy Logtail on a Windows node

  1. Use kubectl to connect to an ACK cluster.
  2. Run the following command to deploy Logtail as a DaemonSet on a Windows node:
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      labels:
        k8s-app: logtail-ds-windows
      name: logtail-ds-windows
      namespace: kube-system
    spec:
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: logtail-ds-windows
      template:
        metadata:
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ""
          labels:
            app: logtail-ds-windows
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: type
                    operator: NotIn
                    values:
                    - virtual-kubelet
                  - key: beta.kubernetes.io/os
                    operator: In
                    values:
                    - windows
                - matchExpressions:
                  - key: type
                    operator: NotIn
                    values:
                    - virtual-kubelet
                  - key: kubernetes.io/os
                    operator: In
                    values:
                    - windows
          containers:
          - name: logtail
            command:
            - powershell.exe
            - -NoLogo
            - -NonInteractive
            - -File
            - entrypoint.ps1
            env:
            # --- configure the logtail file configuration generation --- #
            #
            ## "ALICLOUD_LOGTAIL_CONFIG_PATH" specifies the configuration path of logtail, 
            ## if the path is blank, the configuration will generate 
            ## via "ALICLOUD_LOGTAIL_CONFIG_ITEM__" prefix environment variables.
            #
            ## "ALICLOUD_LOGTAIL_CONFIG_ITEM__" needs to be combined with a type indicator to  
            ## display the type of the configuration item, the following indicators are optional.
            ## -       INT__ : 64-bit signed integer.
            ## -      UINT__ : 64-bit unsigned integer.
            ## -      DOUB__ : 64-bit floating-point number.
            ## -      BOOL__ : boolean.
            ## -       STR__ : string, default type.
            ## - {<TYPE>}S__ : array in <TYPE> with vertical bar separated format.
            #
            ## P.S: don't treate "ALICLOUD_LOGTAIL_CONFIG_ITEM__" as a silver bullet, 
            ## when the configuration is too complicated, 
            ## please mount a detailed configuration file on "ALICLOUD_LOGTAIL_CONFIG_PATH".
            #
            - name: ALICLOUD_LOGTAIL_CONFIG_PATH
              valueFrom:
                configMapKeyRef:
                  key: log-config-path
                  name: alibaba-log-configuration
            - name: ALICLOUD_LOGTAIL_CONFIG_ITEM__DOUB__CPU_USAGE_LIMIT
              valueFrom:
                configMapKeyRef:
                  key: cpu-core-limit
                  name: alibaba-log-configuration
            - name: ALICLOUD_LOGTAIL_CONFIG_ITEM__UINT__MEM_USAGE_LIMIT
              valueFrom:
                configMapKeyRef:
                  key: mem-limit
                  name: alibaba-log-configuration
            - name: ALICLOUD_LOGTAIL_CONFIG_ITEM__UINT__MAX_BYTES_PER_SEC
              valueFrom:
                configMapKeyRef:
                  key: max-bytes-per-sec
                  name: alibaba-log-configuration
            - name: ALICLOUD_LOGTAIL_CONFIG_ITEM__UINT__SEND_REQUESTS_CONCURRENCY
              valueFrom:
                configMapKeyRef:
                  key: send-requests-concurrency
                  name: alibaba-log-configuration
            # --- configure the logtail configuration --- #
            #
            ## "ALICLOUD_LOG_REGION" specifies the region of the Alibaba Cloud,
            ## it will discover the region automatically if blank.
            #
            ## "ALICLOUD_LOG_USER_ID" is the same as "ALIYUN_LOGTAIL_USER_ID",
            ## which is to specify the uid of Alibaba Cloud SLS service.
            #
            ## "ALICLOUD_LOG_PROJECT" is the same as "ALICLOUD_LOG_DEFAULT_PROJECT",
            ## which is to specify the project of Alibaba Cloud SLS service.
            #
            ## "ALICLOUD_LOG_MACHINE_GROUP" is the same as "ALIYUN_LOGTAIL_USER_DEFINED_ID" 
            ## and "ALICLOUD_LOG_DEFAULT_MACHINE_GROUP", 
            ## which is to specify the machine group of Alibaba Cloud SLS service.
            #
            ## "ALICLOUD_LOG_ENDPOINT" specifies the endpoint of the Alibaba Cloud SLS service.
            #
            ## "ALICLOUD_LOG_ECS_FLAG" specifies whether to log the ECS flags.
            #
            ## "ALICLOUD_LOG_DOCKER_ENV_CONFIG"
            #
            ## "ALICLOUD_LOG_ENV_TAGS" is the same as "ALIYUN_LOG_ENV_TAGS",
            ## which is to specify the environment variables to be recorded,
            ## it is in form of vertical bar separated list.
            #
            - name: ALICLOUD_LOG_REGION
              value: ""
            - name: ALICLOUD_LOG_USER_ID
              valueFrom:
                configMapKeyRef:
                  key: log-ali-uid
                  name: alibaba-log-configuration
            - name: ALICLOUD_LOG_PROJECT
              valueFrom:
                configMapKeyRef:
                  key: log-project
                  name: alibaba-log-configuration
            - name: ALICLOUD_LOG_MACHINE_GROUP
              valueFrom:
                configMapKeyRef:
                  key: log-machine-group
                  name: alibaba-log-configuration
            - name: ALICLOUD_LOG_ENDPOINT
              valueFrom:
                configMapKeyRef:
                  key: log-endpoint
                  name: alibaba-log-configuration
            - name: ALICLOUD_LOG_ECS_FLAG
              value: "true"
            - name: ALICLOUD_LOG_DOCKER_ENV_CONFIG
              value: "true"
            - name: ALICLOUD_LOG_ENV_TAGS
              value: _node_name_|_node_ip_
            - name: _node_name_
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: spec.nodeName
            - name: _node_ip_
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.hostIP
            # Replace <cn-hangzhou> in the following registry address with the ID of the region where the cluster is deployed.
            image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/logtail-windows:v1.0.19  
            imagePullPolicy: IfNotPresent
            resources:
              limits:
                cpu: 1
                memory: 1Gi
              requests:
                cpu: 100m
                memory: 256Mi
            securityContext:
              privileged: false
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:
            - name: docker-pipe
              mountPath: \\.\pipe\docker_engine
            - name: docker-data
              mountPath: c:/ProgramData/docker
              readOnly: true
            - mountPath: c:/logtail_host
              name: root
              readOnly: true
          terminationGracePeriodSeconds: 30
          priorityClassName: system-node-critical
          restartPolicy: Always
          terminationGracePeriodSeconds: 30
          tolerations:
          - operator: Exists
          volumes:
          - name: docker-pipe
            hostPath:
              path: \\.\pipe\docker_engine
          - name: docker-data
            hostPath:
              path: c:/ProgramData/docker
              type: Directory
          - name: root
            hostPath:
              path: c:/
              type: Directory
      updateStrategy:
        rollingUpdate:
          maxUnavailable: 10%
        type: RollingUpdate
    Notice Logtail can collect only stdout files and deliver them to Log Service. In later versions, you can use Logtail to collect log files.

Example

After Logtail is deployed on the Windows node, use the following template to deploy a sample application to verify that Logtail works as expected:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: logtail-test
  name: logtail-test
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: logtail-test
      name: logtail-test
    spec:
      containers:
      - name: nanoserver
        image: mcr.microsoft.com/windows/servercore:1809
        command: ["powershell.exe"]
        args: ["ping -t 127.0.0.1 -w 10000"]
        env:
      ######### Specify environment variables ###########
        - name: aliyun_logs_logtail-stdout
          value: stdout
        - name: aliyun_logs_logttail-tags
          value: tag1=v1
      #################################
      nodeSelector:
        beta.kubernetes.io/os: windows
      tolerations:
      - effect: NoSchedule
        key: os
        operator: Equal
        value: windows

After the application is deployed, you can view the log data. For more information, see Query logs.