前言

某些特殊场景下应用日志无法通过elk、grafana等工具直接查看,需要将日志文件挂载出来再处理。本文以nfs作为远程存储,统一存放pod日志。

  • 系统版本:CentOS 7 x86-64
  • 宿主机IP网段:10.10.17.190/27,服务端IP:10.10.17.191

1. 安装配置nfs

  1. 挑一台宿主机作为nfs服务端,安装相关服务
yum install -y nfs-utils rpcbind
  1. 创建共享目录并设置权限
mkdir -p /home/apps/nfs
chmod -R 755 /home/apps/nfs
  1. 编辑 /etc/exports,添加以下内容
/home/apps/nfs/ 10.10.17.190/27(rw,no_root_squash,no_all_squash,sync)
  1. 使配置生效
exportfs -r
  1. 启动服务。(如果有防火墙,需要先在防火墙开放相关端口)
systemctl start rpcbind
systemctl start nfs
systemctl enable rpcbind
systemctl enable nfs
  1. 在服务端检查是否正常
# 查看端口是否生效
rpcinfo -p
# 查看服务端是否可连接
showmount -e localhost
  1. 找另一台服务器作为客户端测试
# 查看端口是否生效
rpcinfo -p
# 查看服务端是否可连接
showmount -e localhost # 安装客户端程序
yum install -y rpcbind nfs-utils # 查看远端是否可连接
showmount -e 10.10.17.191 # 建立挂载目录
mkdir -p /home/apps/nfs
mount -t nfs 10.10.17.191:/home/apps/nfs /home/apps/nfs -o nolock,nfsvers=3,vers=3 # 解除挂载
umount /home/apps/nfs

2. 创建PV

创建pv,容量限制为60GiB。标签和容量根据实际情况调整。注意修改nfs相关配置为实际nfs地址。

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
namespace: default
labels:
env: uat
spec:
capacity:
storage: 60Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: ""
nfs:
path: /home/apps/nfs/
server: 10.10.17.191

3. 创建pvc

创建pvc,通过标签绑定到pv。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
namespace: default
spec:
accessModes: # 访问模式
- ReadWriteMany
volumeMode: Filesystem # 存储卷模式
resources: # 资源请求
requests:
storage: 30Gi
storageClassName: ""
selector:
matchLabels:
env: "uat"

4. 配置pod使用pvc

下面的示例为创建deployment和相应的service,使用nodeAffinity优先调度到指定的服务器。从内网私有化部署的harbor拉取docker镜像,并配置harbor账号的secret。使用Downward API获取pod名称,以pod名称作为挂载子目录名称

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
affinity:
nodeAffinity: # pod调度
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: type
operator: In
values:
- "app"
- key: env
operator: In
values:
- "uat"
containers:
- name: myapp
image: harbor.neiwang.com/demo/myapp:1.0.2
imagePullPolicy: IfNotPresent
ports:
- name: main-http
containerPort: 8201
- name: main-dubbo
containerPort: 28201
env:
- name: POD_NAME # 使用Downward API获取POD名称
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
envFrom: # 引用configMap中的环境变量
- configMapRef:
name: cm-common
- configMapRef:
name: cm-spring
volumeMounts:
- mountPath: /app/log
name: logdir
subPathExpr: myapp/$(POD_NAME) # 使用子目录, 便于定位指定pod的日志
volumes:
- name: logdir
persistentVolumeClaim:
claimName: pvc-nfs
imagePullSecrets: # 从私有harbor仓库拉取镜像需要配置账户信息的secret
- name: registry-harbor ---
apiVersion: v1
kind: Service
metadata:
name: svc-myapp
spec:
selector:
app: myapp
ports:
- name: main-http
protocol: TCP
port: 8201
targetPort: 8201
- name: main-dubbo
protocol: TCP
port: 28201
targetPort: 28201

使用yaml文件创建deployment和service

kubectl create -f myapp.yaml

查看pod是否启动

kubectl get pods

到nfs服务端查看是否有新生成的pod文件

[k8s]使用nfs挂载pod的应用日志文件的更多相关文章

  1. 延申三大问题中的第二个问题处理---收集查看k8s中pod的控制台日志

    1.不使用logstash 2.步骤: 2.1 先获取一个文件的日志 2.2 再获取多个文件的日志 2.3 批量获取文件日志 pod日志文件路径 [root@worker hkd-eureka]# p ...

  2. k8s 基于NFS部署storageclass pv自动供给

    在k8s中部署有状态应用时,通常需要做数据持久化存储. 后端存储的方式有以下几种: 1.基于宿主机本地的存储方式: (重启pod时,若pod被调度到其他节点上,尽管原来节点上的数据不会丢失,但是其他节 ...

  3. kubernetes(14):k8s基于NFS部署storageclass实现pv自动供给

    k8s基于NFS部署storageclass实现pv自动供给 https://www.cnblogs.com/Smbands/p/11059843.html https://www.jianshu.c ...

  4. k8s之深入解剖Pod(一)

    上文说了一下k8s的简单使用,接下来就让我们来具体深入了解一下Pod.为了避免篇幅太长,所以会分成几篇. 目录: Pod定义详解 静态Pod Pod容器共享Volume 一.Pod定义详解 先看一个简 ...

  5. k8s核心资源之Pod概念&入门使用讲解(三)

    目录 1. k8s核心资源之Pod 1.1 什么是Pod? 1.2 Pod如何管理多个容器? 1.3 Pod网络 1.4 Pod存储 1.5 Pod工作方式 1.5.1 自主式Pod 1.5.2 控制 ...

  6. 根文件系统制作、NFS配置与安装及利用NFS挂载根文件系统

    最近打算从头开始制作根文件系统,下面是开发过程. 一.根文件系统的制作 0.FHS(Filesystem Hierarchy Standard)标准介绍 该标准规定了根目录下各个子目录的名称及其存放的 ...

  7. k8s的nfs存储外挂设置过程

    需求: 在k8s集群里的某个模块生成的目录文件或者更新的目录文件,存储到外面某台服务器上 1.安装nfs服务(192.168.1.2  Ubuntu 16.04) apt-get install nf ...

  8. k8s之深入解剖Pod(二)

    目录: Pod配置管理:ConfigMap 容器内获取Pod信息:Downward API Pod生命周期和重启策略 Pod健康检查 一.ConfigMap 将应用所需的配置信息与程序进行分离,可以使 ...

  9. k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方?

    k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方? 面试官:"计数性Job默认完成模式是什么?Indexed模式如何发布自定义索引呢?& ...

  10. k8s运维之pod排错

    k8s运维之pod排错 K8S是一个开源的,用于管理云平台中多个主机上的容器化应用,Kubernetes的目标是让部署容器化变得简单并且高效 K8S的核心优势: 1,基于yaml文件实现容器的自动创建 ...

随机推荐

  1. 2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K并且是长度最大的。返回其长度。

    2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K并且是长度最大的.返回其长度. 福大大 答案2021-03-23: 双指 ...

  2. 2021-06-11:给定两个字符串s1和s2,问s2最少删除多少字符可以成为s1的子串? 比如 s1 = “abcde“,s2 = “axbc“。

    2021-06-11:给定两个字符串s1和s2,问s2最少删除多少字符可以成为s1的子串? 比如 s1 = "abcde",s2 = "axbc". 福大大 答 ...

  3. jdg安装及环境设置

    1.下载java8 java11 到默认路径 2.右击我的电脑,点击属性 3.点击高级系统设置 4.点击环境变量 5.点击新建 6. 按照提示新建条目 第一个 变量名填入: JAVA_HOME 变量值 ...

  4. WPF入门教程系列二十四——DataGrid使用示例(2)

    WPF入门教程系列目录 WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系 ...

  5. webpack Dev Server Invalid Options options should NOT have additional prop

    今日npm run serve时提示ERROR ValidationError: webpack Dev Server Invalid Options options should NOT have ...

  6. APP调用第三方(微信)登录(最详细的实现流程)

    最近使用weexplus做了个app 用户需要的是可以使用第三方微信实现登录(虽然网上有很多相关的什么申请开发者账户.appid.openid等资料:但是都是讲的中间的那一部分请原谅我是个菜鸟,脑补开 ...

  7. python 环境下使用PIP 报错的解决方法

    最近做一个小程序项目,使用djangorestframework,安装restframework 出现错误,安装环境Python2.7:出现错误如下:  "UnicodeEncodeErro ...

  8. SpringBoot整合OSS文件上传

    一.注册阿里云账号并开通OSS服务 1.登录阿里云账号 2.创建一个bucket 3.创建子用户 对自用户分配权限,打开操作OSS的全部权限(也可根据业务需求进行更改) 4.配置上传跨域规则 任何来源 ...

  9. Spring 核心概念之一 IoC

    前言 欢迎来到本篇文章!通过上一篇什么是 Spring?为什么学它?的学习,我们知道了 Spring 的基本概念,知道什么是 Spring,以及为什么学习 Spring.今天,这篇就来说说 Sprin ...

  10. PQ常用模板

    //json请求 Json.Document(Web.Contents("",[Headers=[#"cookie"=tk,#"Content-Typ ...