使用场景
nginx-ingress 是使用 Nginx 作为反向代理和负载平衡器的 Kubernetes 的 Ingress 控制器,容器服务 TKE 提供了产品化的能力,可以直接在集群内安装和使用 Nginx-ingress。有关安装 Nginx-ingress 的详细信息,请参见 安装 Nginx-ingress 实例。使用 nginx-ingress,通常需要查看访问日志以定位问题。nginx-ingress 组件支持将日志直接采集到腾讯云的 CLS。nginx-ingress 实例默认配置的访问日志写入容器的 /var/log/nginx/nginx_access.log 文件中,然后配置日志采集规则,将该日志文件采集到 CLS。路径如下图所示:

nginx-ingress 默认不带有日志切割功能。如果运行时间长,nginx_access.log 文件会变得非常大,占用大量磁盘空间。由于日志直接写入容器内,最终会落在节点的容器存储目录中,占用 node 节点磁盘空间。如果容器存储目录没有单独挂盘,通常会直接使用系统盘。随着日志文件的增大,系统盘的可用磁盘空间会不断减少,此时可能会导致节点的 kubelet 驱逐。为了解决这个问题,需要对 nginx-ingress controller 容器的 /var/log/nginx/nginx_access.log 日志文件进行轮转切割。由于日志是容器的文件,因此可以部署一个 logrotate 的 sidecar 容器来轮转切割 nginx 的访问日志,以确保日志不会不断增加并变得非常大。
操作步骤
步骤1:拉取 logrotate 容器镜像
下面介绍如何在 nginx-ingress 中配置 logrotate 容器来轮转切割日志。本文中将使用 realz/logrotate 镜像来进行日志切割。1. 执行以下命令,拉取 logrotate 镜像:
docker pull realz/logrotate:latest
logrotate 的具体介绍请参见 官方 GitHub 文档。2. 您需要在容器中配置以下环境变量:
CRON_EXPR="* * * * *" LOGROTATE_LOGFILES=/var/lib/docker/containers/*/*.logLOGROTATE_FILESIZE=10MLOGROTATE_FILENUM=5
环境变量说明:CRON_EXPR:日志定时切割时间。LOGROTATE_LOGFILES:需要切割的日志。LOGROTATE_FILESIZE:日志文件达到某个大小时开始切割。LOGROTATE_FILENUM:最多保留几个日志文件。3. 启动容器。
步骤2:nginx-ingress 工作负载配置 sidecar 容器
使用 sidecar 容器的方案是通过 emptydir 共享 /var/log/nginx/ 目录,以便 logrotate 容器可以直接访问 nginx_access.log。下面介绍如何在控制台中进行配置。1. 登录 容器服务控制台,选择左侧导航栏中的集群。2. 在集群管理页面,选择集群,进入集群详情页。3. 在工作负载 > DaemonSet 中,命名空间选择 kube-system,找到 {xxx}-ingress-nginx-controller,单击右侧的更新 Pod 配置。如下图所示:

4. 在更新 Pod 配置页面中,添加一个数据卷,如下图所示:

在新增数据卷中,数据卷类型选择使用临时目录,数据卷名称填写 logrotate
。5. 在实例内容器中,选择 controller,并添加挂载点。如下图所示:

在添加挂载点中,名称填写 logrotate
,路径填写 /var/log/nginx/
。6. 添加一个 logrotate 容器。如下图所示:

镜像选择 realz/logrotate
,挂载点选择 logrotate
数据卷,路径填写 /var/log/nginx/
。在环境变量中,参考以下配置进行填写:
CRON_EXPR="* * * * *" LOGROTATE_LOGFILES=/var/log/nginx/*.logLOGROTATE_FILESIZE=1MLOGROTATE_FILENUM=5
如下图所示:

7. 配置完成后,单击更新 Pod 配置。完整的 yaml 示例如下:
apiVersion: apps/v1kind: Deploymentmetadata: labels: k8s-app: nginx-intranet-ingress-nginx-controller qcloud-app: nginx-intranet-ingress-nginx-controller name: nginx-intranet-ingress-nginx-controller namespace: kube-systemspec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: nginx-intranet-ingress-nginx-controller qcloud-app: nginx-intranet-ingress-nginx-controller strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: k8s-app: nginx-intranet-ingress-nginx-controller qcloud-app: nginx-intranet-ingress-nginx-controller name: nginx-intranet-ingress-nginx-controller namespace: kube-system spec: containers: - args: - /nginx-ingress-controller - --election-id=ingress-controller-leader - --ingress-class=nginx-intranet - --configmap=kube-system/nginx-intranet-ingress-nginx-controller - --publish-service=kube-system/nginx-intranet-ingress-nginx-controller - --validating-webhook=:8443 - --validating-webhook-certificate=/usr/local/certificates/cert - --validating-webhook-key=/usr/local/certificates/key - --tcp-services-configmap=kube-system/nginx-intranet-ingress-nginx-tcp - --udp-services-configmap=kube-system/nginx-intranet-ingress-nginx-udp env: - name: POD_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace image: ccr.ccs.tencentyun.com/paas/nginx-ingress-controller:v0.41.0 imagePullPolicy: Always lifecycle: preStop: exec: command: - /wait-shutdown livenessProbe: failureThreshold: 3 httpGet: path: /healthz port: 10254 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 name: controller ports: - containerPort: 80 name: http protocol: TCP - containerPort: 443 name: https protocol: TCP - containerPort: 10254 name: metrics protocol: TCP - containerPort: 8443 name: webhook protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /healthz port: 10254 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 resources: {} securityContext: allowPrivilegeEscalation: true capabilities: add: - NET_BIND_SERVICE drop: - ALL runAsUser: 101 terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /usr/local/certificates/ name: webhook-cert readOnly: true - mountPath: /var/log/nginx name:logrotate
- env: - name: LOGROTATE_LOGFILES value: /var/log/nginx/*.log - name: CRON_EXPR value: '* * * * *' - name: LOGROTATE_FILESIZE value: 1M - name: LOGROTATE_FILENUM value: "5" image: realz/logrotate imagePullPolicy: Always name: logrotate resources: limits: cpu: 500m memory: 1Gi requests: cpu: 250m memory: 256Mi securityContext: privileged: false terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /var/log/nginx name:logrotate
dnsPolicy: ClusterFirst initContainers: - command: - sh - -c - |- sysctl -w net.core.somaxconn=65535 sysctl -w net.ipv4.ip_local_port_range="1024 65535" sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w fs.file-max=1048576 image: ccr.ccs.tencentyun.com/tkeimages/busybox:latest imagePullPolicy: Always name: setsysctl resources: {} securityContext: privileged: true terminationMessagePath: /dev/termination-log terminationMessagePolicy: File restartPolicy: Always schedulerName: default-scheduler securityContext: {} serviceAccount: nginx-intranet-ingress-nginx serviceAccountName: nginx-intranet-ingress-nginx terminationGracePeriodSeconds: 300 volumes: - name: webhook-cert secret: defaultMode: 420 secretName: nginx-intranet-ingress-nginx-admission - emptyDir: {} name:logrotate
步骤3:验证配置是否生效
当 nginx-ingress controller pod 运行正常后,您可以通过 ingress 域名访问后端服务,从而生成访问日志。

隔几分钟后,登录容器并查看日志,可以发现日志已被切割成多个文件。

通过以上配置,您已成功地使用 logrotate 切割了 nginx-ingress controller 的访问日志,并且这样不会影响 CLS 采集日志。
容器服务官网1折活动,限时活动,即将结束,速速收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利。同意关联立享优惠
转转请注明出处:https://www.yunxiaoer.com/148528.html