k8s学习(二十六) K8s 解决/var/lib/docker/containers下日志多的问题

本文介绍了如何解决K8s部署服务日志导致磁盘空间不足的问题。提供了一种手动清理日志的shell脚本cleanlog.sh,并详细解释了如何通过配置/etc/docker/daemon.json设置日志驱动和选项,如限制每个容器日志最大20MB,最多保留3个日志文件。最后,重启Docker服务使配置生效。
摘要由CSDN通过智能技术生成

问题:
K8s部署的服务会不断生成日志,最终导致/var/lib/docker/containers下生成很多日志,导致磁盘存满

解决:
1、自己清理
编写cleanlog.sh

#!/bin/sh
# drift 
echo "========= start clean /var/lib/docker/containers/ logs ============"

logs=$(find /var/lib/docker/containers/ -name *-json.log)

for log in $logs
        do
                echo "clean logs : $log"
                cat /dev/null > $log
        done


echo "======== end clean /var/lib/docker/containers/ logs   =========="

2、根治

/etc/docker/daemon.json

添加log-driver 和log-opts

我的文件:


{
  "log-driver":"json-file",
  "log-opts": {"max-size":"20m", "max-file":"3"},
  "exec-opts": ["native.cgroupdriver= cgroupfs"],
  "insecure-registries":["172.16.10.160:80","172.16.10.160:88", "172.16.10.190:80", "quay.io", "k8s.gcr.io", "gcr.io", "docker.io"],
  "registry-mirrors":["http://172.16.10.160:80"]
}

解释:

"max-size":"20m" 表示一个容器日志大小上限是20M,
"max-file":"3"   表示一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。

重启docker

systemctl daemon-reload
systemctl restart docker
以下是一个k8sdocker的项目案例: 假设我们有一个简单的Web应用程序,它使用Python Flask框架编写,并使用MySQL作为数据库。 我们将使用Docker容器化应用程序和数据库,并使用Kubernetes进行部署和管理。 1. Docker容器化应用程序和数据库 首先,我们将使用Docker容器化我们的应用程序和数据库。 对于应用程序,我们需要创建一个Dockerfile,其中包含以下内容: ``` FROM python:3.8-slim-buster WORKDIR /app COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"] ``` 这个Dockerfile使用Python 3.8作为基本映像,并将应用程序代码复制到容器中。它还将requirements.txt文件复制到容器中,并使用pip安装所有必需的依赖项。最后,它设置了一个CMD指令,该指令在容器启动时运行应用程序。 对于数据库,我们将使用MySQL,并使用以下Docker Compose文件将其容器化: ``` version: '3' services: db: image: mysql:5.7 command: --default-authentication-plugin=mysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: myapp MYSQL_USER: user MYSQL_PASSWORD: password ports: - "3306:3306" volumes: - data:/var/lib/mysql volumes: data: ``` 这个Docker Compose文件将创建一个MySQL 5.7容器,并设置它的根密码,数据库名称和用户凭据。它还将将容器的3306端口映射到主机的3306端口,并使用卷将数据保存在本地。 2. 部署到Kubernetes 现在我们将使用Kubernetes将我们的应用程序和数据库部署到集群中。 对于应用程序,我们需要创建一个Deployment和一个Service。Deployment将使用我们之前创建的应用程序Docker映像,并定义一个Pod模板,该模板将运行一个容器并暴露端口5000。Service将使用该Deployment,并将其暴露到集群中的其他Pod和外部客户端。 以下是我们的应用程序Deployment和Service的YAML定义: ``` apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 2 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myapp:latest ports: - containerPort: 5000 --- apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: myapp ports: - name: http port: 80 targetPort: 5000 type: LoadBalancer ``` 对于数据库,我们将使用一个单独的Deployment和Service。Deployment将使用我们之前创建的MySQL Docker映像,并定义一个Pod模板,该模板将运行一个容器并暴露端口3306。Service将使用该Deployment,并将其暴露到集群中的其他Pod和外部客户端。 以下是我们的数据库Deployment和Service的YAML定义: ``` apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: example - name: MYSQL_DATABASE value: myapp - name: MYSQL_USER value: user - name: MYSQL_PASSWORD value: password ports: - containerPort: 3306 volumeMounts: - name: data mountPath: /var/lib/mysql volumes: - name: data persistentVolumeClaim: claimName: mysql-data --- apiVersion: v1 kind: Service metadata: name: mysql spec: selector: app: mysql ports: - name: mysql port: 3306 targetPort: 3306 clusterIP: None ``` 这个Deployment将创建一个MySQL容器,并设置其根密码,数据库名称和用户凭据。它还将将容器的3306端口暴露给其他Pod,但不向外部客户端暴露。Service将在Pod之间创建一个DNS条目,使它们可以相互访问。 3. 部署应用程序 现在我们可以使用kubectl命令将应用程序和数据库部署到集群中: ``` kubectl apply -f app-deployment.yaml kubectl apply -f db-deployment.yaml ``` 这将创建Deployment和Service对象,并在集群中启动Pod。 4. 测试应用程序 最后,我们可以使用kubectl port-forward命令将应用程序的Service暴露到本地主机的端口,并使用Web浏览器访问该端口以测试应用程序: ``` kubectl port-forward svc/myapp 8080:80 ``` 这将将Service的80端口映射到本地主机的8080端口。现在,我们可以使用Web浏览器访问http://localhost:8080,以查看我们的应用程序是否正常工作。 这就是一个简单的k8sdocker的项目案例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值