You need to enable JavaScript to run this app.
导航

通过 Sidecar 方式采集 VCI 容器日志

最近更新时间2024.04.02 20:01:22

首次发布时间2023.07.12 12:48:16

弹性容器实例支持通过 Sidecar 方式采集容器日志。本文介绍如何通过 Sidecar 方式部署容器日志采集 Agent,采集 VCI 容器的标准输出日志和文件日志。

前提条件

操作步骤

本文以在 Sidecar 容器使用火山引擎日志服务提供的日志采集组件 LogCollector 为例。若您有自己的日志采集组件,可自行实现 Sidecar 容器配置。

使用 Sidecar 方式采集容器日志时,相关可配置的参数注解(Annotation)说明,请参见 Pod Annotation 说明

  1. 创建 Sidecar 容器配置文件。示例logcollector-config.yaml的代码如下:

    注意

    按照下方参数说明表和 YAML 文件中的注释说明,将占位符变量(${占位符})替换为您业务相关的实际值。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: logcollector-config
      namespace: ${namespace}
    data:
      filebeat.yml: |
        filebeat:
          is_sidecar: true
    
        output.tls:
          endpoint: ${volc_tls_endpoint}
          region: ${volc_region}
          secret_id: ${your_ak}
          secret_key: ${your_sk}
          label: ${your_labels}
    
        # 以下代码片段为日志输出配置。
        # 详情请见开源文档 https://www.elastic.co/guide/en/beats/filebeat/7.17/configuration-logging.html。
        logging.level: info
        logging.to_files: true  
        logging.files:
          name: filebeat
          keepfiles: 7
          permissions: 0644
    
    参数说明如下:
    变量示例说明
    namespacedefaultSidecar 容器所在的命名空间。
    endpointhttps://tls-cn-beijing.ivolces.com日志服务连接域名,即服务地址。日志服务支持的地域及对应服务地址,请参见 服务地址
    regioncn-beijing采集 VCI 容器日志业务所在的地域(Region)。 详情请参见 地域和可用区
    secret_idAK********火山引擎账号或子用户的 Access Key ID。 获取方式,请参见 Access Key(密钥)管理
    secret_keyTUdZ********火山引擎账号或子用户的 Secret Access Key。 获取方式,请参见 Access Key(密钥)管理
    labelhttp_module机器的自定义标识。与 前提条件 中创建的机器组自定义标识保持一致。
  1. 执行以下命令,创建 Sidecar 容器配置文件。
    kubectl apply -f logcollector-config.yaml
    
  2. 创建一个包含 Sidecar 容器的 VCI Pod YAML 文件。
    有如下两种 YAML 示例:

    注意

    请按照 YAML 文件中的注释说明,将参数值替换为您业务相关的实际值。

    • 创建 VCI Pod 时挂载csi-driver并通过 Sidecar 方式采集容器的标准输出日志。示例sidecar-vci-pod-demo.yaml的代码如下:
      apiVersion: v1
      kind: Pod
      metadata:
        name: sidecar-vci-pod-demo   # VCI Pod 名称。
        namespace: default   # VCI Pod 所属命名空间。
        annotations:
          vke.volcengine.com/burst-to-vci: enforce   # 强制调度到 VCI。
      spec:
        containers:
          - name: c1    # 业务容器名称。
            image: nginx:1.14.2    # 容器镜像地址和 Tag,请替换为您实际业务中的镜像地址。
            args:   # 业务容器每秒打印当前时间到标准输出日志。
              - /bin/sh
              - -c
              - >
                i=0;
                while true;
                do
                  echo "$i: $(date)";
                  i=$((i+1));
                  sleep 1;
                done
            volumeMounts:
              - name: stdlog-volume    # 业务容器的标准输出日志挂载的卷名称。
                mountPath: /var/log    # 业务容器的标准输出日志采集路径。
          - name: logcollector    # Sidecar 容器的名称。
            image: ${logcollector-image}  # Sidecar 的容器镜像,即日志服务提供的 LogCollector 镜像地址,详情请见 https://www.volcengine.com/docs/6470/190394#logcollector-镜像地址 。
            imagePullPolicy: Always
            args:
              - /usr/local/container/filebeat-7.12.0/filebeat
              - -c
              - /usr/local/container/filebeat-7.12.0/etc/filebeat.yml
            livenessProbe:
              initialDelaySeconds: 10
              periodSeconds: 10
              exec:
                command:
                  - sh
                  - -c
                  - |
                    filebeat_num=`ps -ef 2>/dev/null | grep "filebeat" | grep -v "grep" | wc -l`
                    if [ $filebeat_num -eq 0 ]; then
                      return 1
                    fi
            volumeMounts:
              - name: logcollector-config
                mountPath: /usr/local/container/filebeat-7.12.0/etc/
                readOnly: true
              - name: stdlog-volume    # Sidecar 容器挂载业务容器的标准输出挂载的卷名称。
                mountPath: /var/log    # Sidecar 容器挂载业务容器的标准输出采集路径。
              - name: data
                mountPath: /usr/local/container/filebeat-7.12.0/data
            env:
              - name: "LOG_COLLECTOR_ENV_TAGS"
                value: "__pod_name__|__pod_ip__|__namespace__|__node_name__|__node_ip__"
              - name: "__pod_name__"
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              - name: "__pod_ip__"
                valueFrom:
                  fieldRef:
                    fieldPath: status.podIP
              - name: "__namespace__"
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
              - name: MAX_MEM
                valueFrom:
                 resourceFieldRef:
                   containerName: logcollector
                   resource: limits.memory
        volumes:    # 采集容器文件日志的共享卷定义。
          - name: logcollector-config    # Sidecar 容器配置文件,即步骤 1 中创建的文件名称。
            configMap:
              defaultMode: 420
              name: logcollector-config
          - name: stdlog-volume    # Sidecar 容器挂载业务容器的标准输出挂载的卷名称。
            csi:
              driver: stdlog.csi.volcengine.com
          - name: data
            emptyDir: { }
      
    • 创建 VCI Pod 时挂载empty-dir并通过 Sidecar 方式采集容器的文件日志。示例sidecar-vci-pod-demo.yaml的代码如下:
    apiVersion: v1
    kind: Pod
    metadata:
      name: sidecar-vci-pod-demo    # VCI Pod 名称。
      namespace: default    # VCI Pod 所属命名空间。
      annotations:
        vke.volcengine.com/burst-to-vci: enforce    # 强制调度到 VCI。
    spec:
      containers:
        - name: c1    # 业务容器的名称。
          image: nginx:1.14.2    # 容器镜像地址和 Tag,请替换为您实际业务中的镜像地址。
          args:
            - /bin/sh
            - -c
            - >
              i=0;
              while true;
              do
                echo "$i: $(date)" >> /var/log/foo.log;
                i=$((i+1));
                sleep 1;
              done
          volumeMounts:
            - name: ${emptydir-name}    # 业务容器的文件日志挂载卷名称。
              mountPath: /var/log    # 业务容器的文件日志挂载路径。
        - name: logcollector    # Sidecar 容器的名称。
          image: ${logcollector-image}    # Sidecar 的容器镜像,即日志服务提供的 LogCollector 镜像地址,详情请见 https://www.volcengine.com/docs/6470/190394#logcollector-镜像地址 。
          imagePullPolicy: Always
          args:
            - /usr/local/container/filebeat-7.12.0/filebeat
            - -c
            - /usr/local/container/filebeat-7.12.0/etc/filebeat.yml
          livenessProbe:
            initialDelaySeconds: 10
            periodSeconds: 10
            exec:
              command:
                - sh
                - -c
                - |
                  filebeat_num=`ps -ef 2>/dev/null | grep "filebeat" | grep -v "grep" | wc -l`
                  if [ $filebeat_num -eq 0 ]; then
                    return 1
                  fi
          volumeMounts:
            - name: logcollector-config
              mountPath: /usr/local/container/filebeat-7.12.0/etc/
              readOnly: true
            - name: ${emptydir-name}    # Sidecar 容器挂载业务容器文件的卷名称。
              mountPath: /var/log    # Sidecar 容器挂载业务容器文件日志的采集路径。
            - name: data
              mountPath: /usr/local/container/filebeat-7.12.0/data
          env:
            - name: "LOG_COLLECTOR_ENV_TAGS"
              value: "__pod_name__|__pod_ip__|__namespace__|__node_name__|__node_ip__"
            - name: "__pod_name__"
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: "__pod_ip__"
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: "__namespace__"
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: MAX_MEM
              valueFrom:
               resourceFieldRef:
                 containerName: logcollector
                 resource: limits.memory
      volumes:    # 采集容器文件日志的共享卷定义。
        - name: logcollector-config    # Sidecar 容器配置文件,即步骤 1 中创建的文件名称。
          configMap:
            defaultMode: 420
            name: logcollector-config
        - name: ${emptydir-name}    # Sidecar 容器挂载业务容器文件的卷名称。
          emptyDir: { }
        - name: data
          emptyDir: { }
    
  3. 执行以下命令,创建 VCI Pod。
    kubectl apply -f sidecar-vci-pod-demo.yaml
    
  4. 获取 Pod 信息,验证 Pod 是否成功创建。
    kubectl get pods -l app=sidecar-vci-pod-demo
    
    预期返回结果如下:
    NAME                   READY   STATUS    RESTARTS   AGE
    sidecar-vci-pod-demo   1/1     Running   0          32m
    
  5. 容器服务控制台 上找到目标 VCI 业务集群,查看 VCI 容器日志。详细操作,请参见 查看容器日志