阿里云容器服务K8S Ingress Controller日志采集实践

919 阅读3分钟
原文链接: click.aliyun.com

Kubernetes Ingress 高可靠部署最佳实践 中从部署层面介绍了在Kubernetes集群中如何部署一套高可靠的Ingress接入层,同时Ingress作为所有集群服务请求的入口,其记录的请求日志对于整个请求跟踪链路至关重要,今天主要给大家分享下如何将K8S Ingress Controller日志采集到日志服务中,以便于检索分析服务请求情况。

环境准备

  1. 通过阿里云容器服务控制台申请K8S集群。
  2. 部署业务服务并配置Ingress对外提供访问。

采集到阿里云日志服务

当我们需要将Ingress Controller的日志采集到阿里云日志服务时,我们只需要简单通过下面几步即可完成:

  1. 部署Logtail DaemonSet
  2. 创建日志Project及配置机器组
  3. 配置容器采集配置LogtailConfig

详细说明可参考这里

步骤一:部署Logtail DaemonSet

注:如果您之前已经在集群中部署过Logtail DaemonSet则可跳过该步骤

curl http://logtail-release.oss-cn-hangzhou.aliyuncs.com/docker/k8s/logtail-daemonset.yaml > logtail-daemonset.yaml
  
# 依据自身环境修改下面配置项
vim logtail-daemonset.yaml
...
        env:
          - name: "ALIYUN_LOGTAIL_CONFIG"
            value: "/etc/ilogtail/conf/${your_region_name}/ilogtail_config.json"
          - name: "ALIYUN_LOGTAIL_USER_ID"
            value: "${your_aliyun_user_id}"
          - name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
            value: "${your_machine_group_name}"
...

kubectl apply -f logtail-daemonset.yaml
daemonset "logtail" created

kubectl -n kube-system get pod | grep logtail
logtail-nbpl8                                                1/1       Running   0          52s
logtail-nr9hf                                                1/1       Running   0          52s

配置参数说明:

  • ${your_region_name}:K8S集群所在Regoin ID
  • ${your_aliyun_user_id}:阿里云UID
  • ${your_machine_group_name}:用户自定义标识,依据该值来配置机器组
步骤二:创建日志Project及配置机器组

注:如果您已经在对应Region创建了用于该K8S集群日志采集的Project且准备复用则可跳过该步骤

1、通过阿里云日志服务创建日志Project:
image
注:日志Project所在Region必须与K8S集群保持一致。

2、配置机器组:
image
注:这里选择用户自定义标识,同时其值必须与步骤一中Logtail DaemonSet YAML中的环境变量ALIYUN_LOGTAIL_USER_DEFINED_ID的值保持一致。

步骤三:配置容器采集配置LogtailConfig

1、创建LogStore:
注:可直接复用已经创建好的日志库
image

2、配置容器采集配置数据类型:
注:由于Ingress Controller日志是输出到Stdout,因此这里我们需要选择Docker标准输出
image

3、配置容器采集配置数据源:
image
更多配置参数可参考这里,这里表明需要采集容器Label中包含"io.kubernetes.container.name": "nginx-ingress-controller"的Stdout和Stderr日志。

4、配置关联机器组:
image

5、查看Ingress Controller请求日志:
通过Ingress访问集群内部服务,在日志库k8s-ingress-controller中查看采集到的Ingress Controller请求日志。
image

采集到自建ES

同样如果我们希望将K8S集群Pod日志采集到自建的Elasticsearch日志服务中,阿里云容器服务也提供了相应的解决方案,具体可参考 利用 log-pilot + elasticsearch + kibana 搭建 kubernetes 日志解决方案,这里主要说明如何配置采集Ingress Controller的日志到ES中。

步骤一:部署 log-pilot + elasticsearch + kibana 服务

注:如果您之前已经在集群中部署过 log-pilot + elasticsearch + kibana 服务则可跳过该步骤

部署详细说明可参考 利用 log-pilot + elasticsearch + kibana 搭建 kubernetes 日志解决方案

步骤二:配置容器日志采集配置

采集Ingress Controller的日志,我们需要添加日志采集配置:

vim nginx-ingress-controller-log-patch.yaml
spec:
  template:
    spec:
      containers:
        - name: nginx-ingress-controller
          env:
          # ingress-controller为索引名称
          - name: aliyun_logs_ingress-controller
            value: "stdout"
        
# 若您是通过Deployment部署的nginx-ingress-controller:
kubectl -n kube-system patch deployment nginx-ingress-controller --patch "$(cat nginx-ingress-controller-log-patch.yaml)"

# 若您是通过DaemonSet部署的nginx-ingress-controller:
kubectl -n kube-system patch ds nginx-ingress-controller --patch "$(cat nginx-ingress-controller-log-patch.yaml)"

经过上面两步,已经完成配置Ingress Controller日志采集到自建ES中,最后通过Ingress访问集群内部服务,在Kibana中查看采集到的Ingress Controller请求日志:
image