上云无忧 > 文档中心 > 腾讯云容器服务实战教程 - TKE 使用 logrotate 切割 nginx-ingress 访问日志
容器服务 TKE
腾讯云容器服务实战教程 - TKE 使用 logrotate 切割 nginx-ingress 访问日志

文档简介:
使用场景: nginx-ingress 是使用 Nginx 作为反向代理和负载平衡器的 Kubernetes 的 Ingress 控制器,容器服务 TKE 提供了产品化的能力,可以直接在集群内安装和使用 Nginx-ingress。有关安装 Nginx-ingress 的详细信息,请参见 安装 Nginx-ingress 实例。
*此产品及展示信息均由腾讯云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

使用场景

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/*/*.log
LOGROTATE_FILESIZE=10M
LOGROTATE_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/*.log
LOGROTATE_FILESIZE=1M
LOGROTATE_FILENUM=5
如下图所示:

7. 配置完成后,单击更新 Pod 配置。完整的 yaml 示例如下:
		
apiVersion: apps/v1
kind: Deployment
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:
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 采集日志。
相似文档
  • 使用场景: Kubernetes 使用事件(Event)反馈集群中资源对象的状态,它通常表示系统中的一些状态变化。例如在安装或修改工作负载时,您可以通过事件信息判断当前资源对象是否存在异常,以及查看导致异常的原因。事件的保留时间有限,在 TKE 集群中事件可保留1小时。
  • 操作场景: Prometheus 社区开发了 JMX Exporter 用于导出 JVM 的监控指标,以便使用 Prometheus 来采集监控数据。当您的 Java 业务容器化至 Kubernetes 后,可通过本文了解如何使用 Prometheus 与 JMX Exporter 来监控 Java 应用。
  • 操作场景: MySQL 是常用的关系型数据库,MariaDB 作为 MySQL 的分支版本,兼容 MySQL 协议,也越来越流行。在 Kubernetes 环境中,可借助开源的 mysqld-exporter 来使用 Prometheus 监控 MySQL 与 MariaDB。您可通过本文了解 Prometheus 并开始使用。
  • 本文主要描述使用自建 Prometheus 采集腾讯云容器服务 TKE 的监控数据时如何配置采集规则。TKE 集群内按照节点类型分为常规节点和超级节点,Prometheus 通过配置 scrape_config 来抓取节点和容器的监控数据,由于节点性质不同因此需要配置的采集规则略有差异。
  • 实践背景: 众所周知,Prometheus 是容器场景的最佳监控工具,但自建 Prometheus 对于运维人力有限的中小型企业而言,成本太高;对于业务发展快速的大企业又容易出现性能瓶颈。因而使用云上托管 Prometheus 已成为越来越多上云企业的第一选择。下列将为您介绍如何使用 托管 Prometheus 监控腾讯云容器服务 TKE。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部