Kubernetes中文件挂载的四种方式

news2025/1/13 15:29:19

一. Kubernetes入门

1.1 Kubernetes创建POD过程


1.2. Kubernetes基本操作

命令说明用法
create创建kubectl create -f xx.yaml
edit编辑kubectl edit svc [POD的service名称]
get获取kubectl get pod --namespace=XXX
patch更新kubectl patch -f xx.yaml
delete删除kubectl delete pod --namespcae=XXX  [POD名称]
expose暴露端口kubectl expose deployment nginx --port=8912 --target-port=80 --type=NodePort
run运行/创建kubectl run my-nginx --image=nginx:1.17.3
describe描述kubectl describe pod pod名 -n 命名空间名
logs日志kubectl logs -f Pod名称 -n 命名空间名
exec执行kubectl exec -it pod名 -n 命名空间 – /bin/bash
rollout回滚kubectl rollout history deployment 应用部署名称; kubectl rollout undo deployment 应用部署名称 --to-revision=1
scale扩容/缩容kubectl scale --replicas=数量 deployment 部署名称
apply应用kubectl apply-f xx.yaml

1.2.1.namespace

Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace。
Namespace常用来隔离不同的用户,比如Kubernetes自带的服务一般运行在kube-system namespace中。

命令行直接创建

$ kubectl create namespace dev

文件创建

apiVersion: v1
kind: Namespace
metadata:
  name: dev

1.2.2. pod

Pod是 Kubernetes 集群上的最基本的单元,同一个Pod中的应用可以共享磁盘,Pod 是一组容器(可包含一个或多个应用程序容器.

apiVersion: v1
kind: Pod
metadata:
  name: redis
  namespace: dev
spec:
  containers:
  - name: redis
    image: redis
    volumeMounts:
    - name: redis-storage
      mountPath: /data/redis
  volumes:
  - name: redis-storage
    emptyDir: {}

1.2.3 deployment

Deployment为Pod和ReplicaSet提供了一个声明式定义方法,用来替代以前的ReplicationController来方便的管理应用。可以通过定义Deployment来创建Pod和ReplicaSet滚动升级和回滚应用、扩容和缩容、暂停和继续Deployment。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: dev
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

1.2.4 service

Pod 是应用程序的载体,我们可以通过 Pod 的 IP 来访问应用程序,但是 Pod 的 IP 地址不是固定的,不方便直接采用 Pod 的 IP 对服务进行访问。 Service 会对提供同一个服务的多个 Pod 进行聚合,并且提供一个统一的入口地址,通过访问 Service 的入口地址就能访问到后面的 Pod 服务。

apiVersion: v1 # 版本
kind: Service # 类型
metadata: # 元数据
  name: nginx_svc# 资源名称
  namespace: dev# 命名空间
spec:
  selector: # 标签选择器,用于确定当前Service代理那些Pod
    app: nginx
  type: NodePort # Service的类型,指定Service的访问方式
  clusterIP: 80# 虚拟服务的IP地址
  sessionAffinity: # session亲和性,支持ClientIP、None两个选项,默认值为None
  ports: # 端口信息
    - port:80 # Service端口
      protocol: TCP # 协议
      targetPort : 80 # Pod端口
      nodePort:  30001# 主机端口

1.2.5 configMap

ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm
  namespace: dev
data:
  # 类属性键;每一个键都映射到一个简单的值
  how: very
  type: charm
  # 类文件键
  config.yml: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
     
--- 

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: dev
spec:
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: cm
              key: how
        - name: SPECIAL_TYPE_KEY
          valueFrom:
            configMapKeyRef:
              name: cm
              key: type
      volumeMounts:
          - name: cm
            mountPath: /data/#容器挂在路径
  volumes:
    - name: cm
      configMap: 
        name: cm #将config.yml文件挂在容器的/data/目录下

  restartPolicy: Never

1.2.6 pv和pvc

PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下 PV 由 Kubernetes 管理员进行创建和配置,它和底层具体的共享存储技术有关,并通过插件完成和共享存储的对接。
PVC(Persistent Volume Claim)是持久化卷声明的意思,是用户对于存储需求的一种声明。换言之,PVC 其实就是用户向Kubernetes 系统发出的一种资源需求申请。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv_test
  labels:
      pv: pv_test
spec:
  storageClassName: pv_test # 用于分组
  capacity:
    storage: 20m
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain     #手动回收
  nfs: # 使用 nfs 存储驱动
    path: /data # nfs 共享的目录,mkdir -pv /nfs/data/20m
    server: 192.168.70.129 # nfs 服务端的 IP 地址或 hostname
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc_test
  namespace: dev
  labels:
    app: pvc_test
spec:
  storageClassName: pv_test
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 500m
  selector:
    matchLabels:
      pv: pv_test
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.17.3
    resources:
      limits:
        cpu: 200m
        memory: 500Mi
      requests:
        cpu: 100m
        memory: 200Mi
    ports:
    - containerPort:  80
      name:  http
    volumeMounts:
    - name: localtime
      mountPath: /etc/localtime
    - name: html
      mountPath: /usr/share/nginx/html/ 
  volumes:
    - name: localtime
      hostPath:
        path: /usr/share/zoneinfo/Asia/Shanghai
    - name: html    
      persistentVolumeClaim:
        claimName:  pvc_test
        readOnly: false  
  restartPolicy: Always

PV 的生命周期
○ Available(可用):表示可用状态,还未被任何 PVC 绑定。
○ Bound(已绑定):表示 PV 已经被 PVC 绑定。
○ Released(已释放):表示 PVC 被删除,但是资源还没有被集群重新释放。
○ Failed(失败):表示该 PV 的自动回收失败。
PV 的访问模式:用来描述用户应用对存储资源的访问权限
○ ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载。
○ ReadOnlyMany(ROX):只读权限,可以被多个节点挂载。
○ ReadWriteMany(RWX):读写权限,可以被多个节点挂载。

1.2.7 ingress

通常情况下,service和pod仅可在集群内部网络中通过IP地址访问。所有到达边界路由器的流量或被丢弃或被转发到其他地方。Service 可以使用 NodePort 暴露集群外访问端口,但是性能低、不安全并且端口的范围有限。Service 缺少七层(OSI 网络模型)的统一访问入口,负载均衡能力很低,不能做限流、验证非法用户、链路追踪等等。Ingress 公开了从集群外部到集群内 服务 的 HTTP 和 HTTPS 路由。流量路由由 Ingress 资源上定义的规则控制。 使用 Ingress 作为整个集群统一的入口,配置 Ingress 规则转发到对应的 Service 。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/ingress.rule-mix: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: 50m
    nginx.ingress.kubernetes.io/use-regex: "true"
  name: test_ing
  namespace: dev
spec:
  tls:
  - hosts:
    - test.ingress.com
    secretName: test.ingress.com
  rules:
  - host: test.ingress.com # 指定的监听的主机域名,相当于 nginx.conf 的 server { xxx }
    http:# 指定路由规则
      paths:
      - path: /api    # 匹配规则,Prefix 前缀匹配 it.nginx.com/* 都可以匹配到
        backend:   # 指定路由的后台服务的 service 名称
          service:
            name: nginx_svc  # 服务名
            port:
              number: 80  # 服务端口
        pathType: ImplementationSpecific
status:
  loadBalancer:
    ingress:
    - ip: 192.168.120.1
    - ip: 192.168.120.2

二. Kubernetes中文件挂载的四种方式

一个运行中的容器,缺省情况下,对文件系统的写入,都是发生在其分层文件系统的可写层的,一旦容器运行结束,所有写入都会被丢弃。因此需要对持久化支持。Kubernetes 中通过 Volume 的方式提供对存储的支持。

2.1 configMap

ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。

ConfigMap 将你的环境配置信息和 容器镜像 解耦,便于应用配置的修改。

在实际工作中许多应用经常会有从配置文件、命令行参数或者环境变量中读取一些配置信息,这些配置信息我们肯定不会直接写死到应用程序中去的,比如你一个应用连接一个redis服务,下一次想更换一个,还得重新去修改代码,重新制作一个镜像,这肯定是不可取的,而ConfigMap 就给我们提供了向容器中注入配置信息的能力,不仅可以用来保存单个属性,也可以用来保存整个配置文件,比如我们可以用来配置一个redis服务的访问地址,也可以用来保存整个redis 的配置文件。

  • 将想要挂载的文件内容在tpl中进行define (helm chart),然后载入到configmap.yaml文件中
  • 使用卷使用configmap,挂载的方式得到要执行的文件内容

格式为:

spec:
  containers:
  - name: 
    image: 
    volumeMounts:
    - name: nova-conf
      mountPath: /etc/nova/nova.conf
      subPath: nova.conf
  volumes:
  - name: nova-conf
    configMap:
      name: {{ tuple . "nova" |include "nova-name" }}-configmap

注意

1、mountPath会覆盖掉挂载路径下的所有文件,即删除所有文件,只保留挂载的文件
2、subpath只使用在configMap情况下,添加subpath时,表示不会覆盖掉原本的路径下的文件,subpath的值必须是configMap中data下的key值。
具体使用详解

举个栗子[通过文件挂载使用configMap]

这里主要是记录利用yaml来创建configMap,并将配置以配置文件的方式挂载到容器中。

configMap创建和使用的方式有很多种,但本文主要介绍以上的方式,是因为在平时的投产和运维过程中,这个方法用的最为频繁。

现在,在configmap文件中存在这么一段配置:

apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
data:
  data.1: hello		     #以键值对的方式进行存储
  data.2: world		     #以键值对的方式进行存储
  redis.properties6666: |    #以文件的形式进行存储,可以在下方直接写配置文件的内容
    redis.host=127.0.0.1
    redis.port=6379
    redis.password=123456

redis.properties6666 是映射到 容器的文件名字 /etc/config/redis.properties6666

/etc/config/下还有两个文件,data.1和data.2

| 竖线文本保留格式

apiVersion: v1
kind: Pod
metadata:
  name: mypod2
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/redis.properties;sleep 1d" ]
      volumeMounts:   #卷挂载
      - name: config-volume  #挂载卷的名称
        mountPath: /etc/config  #挂载到容器中的位置
  volumes: #创建卷
    - name: config-volume #创建的卷名称
      configMap:  #从configMap中挂载
        name: redis-config #挂载configMap中redis-config
  restartPolicy: Never

如果我们不想挂载configMap中的所有配置,可以使用items。使用items,还可以给文件重新命名,而不以默认的key作为文件名。

volumes:
      - name: config
        configMap:
          name: configmap
          items:
          - key: data.1         # 原文件名(key的名称)
            path: userinfo    # 修改之后的文件名(key的名称)
          - key: data.2
            path: userinfo2

2.2 hostPath

  • 将node节点(主机)的本地文件挂载到容器中,比如实现本地时间的同步功能
  • 这种卷一般和DaemonSet搭配使用,用来操作主机文件,例如进行日志采集的 FLK 中的 FluentD 就采用这种方式,加载主机的容器日志目录,达到收集本主机所有日志的目的。
spec:
  containers:
  - name: httpd-deployment
    imagePullPolicy: IfNotPresent
    image: nginx:1.1.1
    volumeMounts:
    - name: host-root
      mountPath: /etc/nova/nova.conf
      subPath: nova.conf
  volumes:
  - name: host-root
    hostPath:
      path: /
      type: Directory

注意

1、hostPath不用subPath这一项,直接就是选择挂载的路径;不会覆盖原有文件夹下的文件
2、不提供pod的亲和性,即host path映射的目录在node1,而pod可能被调度到node2,导致原来的在node1的数据不存在,pod一直无法启动起来;
3、能够提供pv/pvc/storage class的方式使用;
4、数据能持久化。

2.3 gitRepo

  • 可以挂载git性质的文件或者目录
apiVersion: v1
kind: Pod
metadata:
  name: gitrepo-volume-pod
spec:
  containers:
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    gitRepo:
      repository: https://github.com/luksa/kubia-website-example.git
      revision: master
      directory: .

2.4 emptyDir

  • 顾名思义,EmptyDir是一个空目录,他的生命周期和所属的 Pod 是完全一致的,可能读者会奇怪,那还要他做什么?EmptyDir的用处是,可以在同一 Pod 内的不同容器之间共享工作过程中产生的文件(类似于共享内存,但这里默认是共享吃磁盘空间的,看下面2)。
  • 缺省情况下,EmptyDir 是使用主机磁盘进行存储的(共享磁盘空间),也可以设置emptyDir.medium 字段的值为Memory,来提高运行速度(共享内存的方式),但是这种设置,对该卷的占用会消耗容器的内存份额。
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - image: busybox
    name: test-emptydir
    command: [ "sleep", "3600" ]
    volumeMounts:
    - mountPath: /data
      name: data-volume
  volumes:
  - name: data-volume
    emptyDir: {}

注意:

1.需要使用内存作为emptyDir的可用存储资源也是可以的,只需要在创建emptyDir卷时增加一个emptyDir.medium字段的定义,并赋值为"Memory"即可;

2.在使用tmpfs文件系统作为emptyDir的存储后端时,如果遇到node节点重启,则emptyDir中的数据也会全部丢失。同时,你编写的任何文件也都将计入Container的内存使用限制,即empty dir方式保存的数据不能持久化。

2.5 挂载到 nfs

Kubernetes中使用NFS

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1628895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[SWPUCTF-2022-新生赛]ez_sql

title:[SWPUCTF 2022 新生赛]ez_sql 审题 根据提示,POST传参 得到假的flag 判断类型 字符型注入 判断列数 发现空格和’or’被过滤 重新构造 nss-1/**/oorrder/**/by/**/4#发现为3个字段 采用联合注入union 爆库 发现union被过滤,双写union绕过 发…

sheng的学习笔记-AI-支持向量机(SVM)

目录:sheng的学习笔记-AI目录-CSDN博客 目录 什么是向量机 SVM算法原理 SVM基本模型 SVM对偶问题 什么是对偶问题: 为什么使用对偶问题 拉格朗日定理 拉格朗日乘子法 对偶问题算法 非线性SVM算法原理 核函数 常用核函数 软间隔与正则化 软…

PMBOK® 第六版 项目是什么

目录 读后感—PMBOK第六版 目录 项目定义 定义:项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目的特征具备以下三点: 独特性:独一无二,无法简单重复过去的做法。 临时性:项目有明确的起点和终点&…

腾讯云邮件推送如何设置?群发邮件的技巧?

腾讯云邮件推送功能有哪些?怎么有效使用邮件推送? 腾讯云邮件推送以其稳定、高效的特点,受到了众多企业的青睐。那么,腾讯云邮件推送如何设置呢?又有哪些群发邮件的技巧呢?下面AokSend就来详细探讨一下。 …

AI预测体彩排列3第2套算法实战化测试第5弹2024年4月27日第5次测试

今天继续进行新算法的测试,今天是第5次测试。好了,废话不多说了,直接上图上结果。 2024年4月27日体彩排3预测结果 6码定位方案如下: 百位:6、2、1、7、8、9 十位:8、9、4、3、1、0 个位:3、7、8…

Python 数组控件的使用

当一个UI窗口界面内有多个相同类型的控件,且这多个控件的功能都类似时,使用数组控件是一个非常不错的选择,可以大大减少代码的编写 且 代码易读性强,可惜的是Python好象是没有数组控件这个东东。 我们来看看以下一个界面&#xff…

生成完美口型同步的 AI 代言人视频(及其实现原理详解)

目录 什么是Heygen? Heygen注册 Video Translation(视频翻译 完美口型同步) 实现原理详解 视频翻译部分 完美口型同步部分 什么是Heygen? Heygen是一款在线工具,可帮助您生成具有完美口型同步的 AI 代言人视频。 Heygen注册 https:…

SpringBoot 缓存

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 目录 一、缓存的作用二、SpringBoot启用缓存三…

循迹/跟随/摇头避障小车

循迹小车 智能小车2-循迹小车-CSDN博客 接线 B-1A -- PB0 B-1B -- PB1 A-1A -- PB2 A-1B -- PB10 循迹模块(左) -- PB3 循迹模块(右) -- PB4 CubeMx 在CubeMx配置,并重定义,在main.h会自动生成 #define B_1A_Pin GPIO_PIN_0 #define B_1A_GPIO_Port GPIOB #defi…

【开发问题记录】启动某个服务时请求失败(docker-componse创建容器时IP参数不正确)

问题记录 一、问题描述1.1 产生原因1.2 产生问题 二、问题解决2.1 找到自己的docker-compose.yml文件2.2 重新编辑docker-compose.yml文件2.3 通过docker-componse重新运行docker-compose.yml文件2.4 重新启动docker容器2.5 查看seata信息 一、问题描述 1.1 产生原因 因为我是…

【国标语音对讲】EasyCVR视频汇聚平台海康/大华/宇视摄像头GB28181语音对讲配置

一、背景分析 近年来,国内视频监控应用发展迅猛,系统接入规模不断扩大,涌现了大量平台提供商,平台提供商的接入协议各不相同,终端制造商需要给每款终端维护提供各种不同平台的软件版本,造成了极大的资源浪…

嵌入式学习58-ARM7(字符设备驱动框架led)

知识零碎: kernel 内核 printk 内核打印 cat /proc/devices insmod …

LINUX系统编程:软硬链接,动静态连接

1.硬连接 什么是硬连接?,我们或许可以用操作清楚的认识什么是硬连接。 在我们学习文件的时候这个数字好像完全没有被提到过,这个代表什么意思呢? 这个代表该文件的inode编号与文件映射的次数,现在该文件的inode只与test.c这个文件名映射&a…

使用grasshopper修改梁的起始点方向

一般北方向朝上的情况,梁的方向从南向北,从西向东。 现在使用grasshopper来判断起始点坐标,分辨是否错误。 交换起始点这个,我实在不会用电池操作,只好敲python代码实现了。代码如下: 如果会敲代码的同学…

Git | 远程操作

Git | 远程操作 文章目录 Git | 远程操作0、分布式版本控制系统概念1、创建远程仓库2、克隆远程仓库https方式ssh方式 3、推送至远程仓库4、本地拉取远程仓库5、配置Git忽略特殊文件给命令配置别名 6、标签管理创建标签操作标签 0、分布式版本控制系统概念 Git是一个分布式版本…

【小迪安全2023】第58天:服务攻防-应用协议设备KibanaZabbix远控向日葵VNCTV

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

RPA机器人怎么操作知乎好物推荐自动点击【添加】商品按钮?

先看需要实现的效果(启动机器人-点击收益(打开商品卡片列表)-点击添加(自动添加商品卡片到文章)): 学员提问: 知乎上点击好物推荐【添加】商品按钮,iframe的元素是动态的…

力扣每日一题-查询网格图中每一列的宽度-2024.4.27

力扣题目:查询网格图中每一列的宽度 题目链接: 2639.查询网格图中每一列的宽度 题目描述 代码思路 双层for循环遍历整个矩阵容易想到,只要能想到使用整数转字符串的技巧(“” 字符串),即可完成题目 代码纯享版 c…

基于SpringBoot + Vue实现的家政服务管理系统设计与实现+毕业论文+答辩PPT+指导搭建视频(包运行成功)

目录 项目介绍 论文展示 资源获取 项目介绍 家政服务管理平台是一个管理信息系统,为了宣传的需要,为了给用户提供方便快捷的服务,从而设计了家政服务管理平台。管理员可以通过这个系统把家政服务信息发布出去,可以方便用户快…

【AI导师写作】毕业论文答辩PPT生成

无论是大专、本科或者硕博,撰写毕业论文、开题报告、文献综述、任务书、课程论文、调研报告等都是必不可少的一件事。而这些任务重往往都需要我们花费大量的时间和精力,而“AI导师写作”在这一方面无疑提供了高效和便捷。可毕业季的论文答辩也是每个学者…