k8s挂载映射操作详解

k8s投射数据卷 Projected Volume

在 k8s 中,有几种特殊的 Volume,它们的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换。"而是为容器提供预先定义好的数据。"

从容器的角度来看,这些 Volume 里的信息仿佛是被 k8s "投射"(Project)进入容器当中的。

k8s 支持的 Projected Volume 一共有四种:

Secret

ConfigMap

Downward API

ServiceAccountToken  不常用没有写

Secret

secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。用户可以创建自己的secret,系统也会有自己的secret。Pod需要先引用才能使用某个secret

Pod有2种方式来使用secret:

1. 作为volume的一个域被一个或多个容器挂载

2. 在拉取镜像的时候被kubelet引用。

內建的Secrets: 由ServiceAccount创建的API证书附加的秘钥k8s自动生成的用来访问apiserver的Secret,所有Pod会默认使用这个Secret与apiserver通信

创建自己的Secret:

1:使用kubectl create secret命令

2:yaml文件创建Secret

命令方式创建secret:

假如某个Pod要访问数据库,需要用户名密码,分别存放在2个文件中:username.txt,password.txt

echo -n 'admin' > ./username.txt

echo -n '12345678' > ./password.txt

kubectl create secret指令将用户名密码写到secret中,并在apiserver创建Secret

kubectl create secret generic user-pass --from-file=./username.txt --from-file=./password.txt

kubectl get secrets 查看创建结果 

kubectl describe secret user-pass 查看详细信息

get或describe指令都不会展示secret的实际内容,这是出于对数据的保护的考虑,要查看实际内容使用命令:

kubectl get secret user-pass -o json

base64解码:

echo 'MWYyZDFlMmU2N2Rm' | base64 --decode

yaml方式创建Secret:

创建一个secret.yaml文件,内容用base64编码:明文显示容易被别人发现。

echo -n 'admin' | base64

echo -n '1f2d1e2e67df' | base64

vim secret.yml

---

apiVersion: v1

kind: Secret

metadata:

  name: myuser-pass

type: Opaque  #模糊

data:

  username: YWRtaW4=

  password: MWYyZDFlMmU2N2Rm

使用Secret:Pod中引用Secret

vim pod_use_secret.yaml

apiVersion: v1

kind: Pod

metadata:

  name: mypod

spec:

  containers:

  - name: testredis

    image: daocloud.io/library/redis

    volumeMounts:    #挂载一个卷

    - name: user-pass     #这个名字需要与定义的卷的名字一致

      mountPath: "/etc"  #挂载到容器里哪个目录下,随便写

      readOnly: true  #只读权限,不加默认有读写

  volumes:     #数据卷的定义

  - name: user-pass   #卷的名字这个名字自定义

    secret:    #卷是直接使用的secret。

      secretName: user-pass  #调用刚才定义的secret

 kubectl apply -f pod_use_secret.yaml   创建

kubectl exec -it mypod /bin/bash

可以看到我们定义的文件映射进来了

被挂载的secret内容会自动更新

vim secret.yml

---

apiVersion: v1

kind: Secret

metadata:

  name: mysecret

type: Opaque

data:

  username: cWlhbmZlbmcK   

  password: MTIzNDU2Nzg5Cg==   #修改为123456789的base64加密后的

kubectl apply -f secret.yml    修改完直接创建即可在次来到容器查看已经变了

 

ConfigMap

ConfigMap 与 Secret 类似,用来存储配置文件的kubernetes资源对象,所有的配置内容都存储在etcd中。

ConfigMap 保存的是不需要加密的、应用所需的配置信息。

ConfigMap 的用法几乎与 Secret 完全相同:可以使用 kubectl create configmap 从文件或者目录创建 ConfigMap,也可以直接编写 ConfigMap 对象的 YAML 文件。

创建ConfigMap的方式有4种:

命令行方式:

1:通过直接在命令行中指定configmap参数创建,即--from-literal

2:通过指定文件创建,即将一个配置文件创建为一个ConfigMap,--from-file=<文件>

3:通过指定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,--from-file=<目录>

4:事先写好标准的configmap的yaml文件,然后kubectl create -f 创建

1、通过命令行参数--from-literal创建

kubectl create configmap configmap --from-literal=user=admin --from-literal=pass=2023888

kubectl get configmap configmap -o yaml    查看相关内容

 

2、通过指定文件创建

编辑配置文件properties

vim properties

property.1 = user-1

property.2 = user-2

property.3 = user-3

[mysqld]

!include /data/mysql/mysqld.cnf

port = 3306

socket = /data/mysql/mysql.sock

pid-file = /data/mysql/mysql.pid

kubectl create configmap configmap-2 --from-file=properties   创建

kubectl get configmap configmap-2 -o yaml 查看内容

3、指定目录创建

指定目录创建时,configmap内容中的各个文件会创建一个key/value对,key是文件名,value是文件内容。

mkdir test

cd test/

vim test-1

123

456

789

a=10

vim test-2

aaa

bbb

ccc

d=AAA

kubectl create configmap configmap-3 --from-file=/root/test   创建

kubectl get configmap configmap-3 -o yaml     查看内容

4、通过事先写好configmap的标准yaml文件创建

vim configmap.yaml

---

apiVersion: v1

kind: ConfigMap

metadata:

  name: configmap-4

  namespace: default

data:

  cache_host: redis

  cache_port: "6379"

  cache_prefix: redis

  my.cnf: |

   [mysqld]

   log-bin = mysql-bin

   haha = hehe

kubectl apply -f configmap.yaml 创建

kubectl get configmap configmap-4 -o yaml   查看内容

kubectl describe configmap 查看所有configmap的详细信息

kubectl describe configmap  configmap名称   查看单独configmaop的详细信息

kubectl delete configmap  configmap名称 删除对应configmap

使用ConfigMap

通过envFrom、configMapRef、name使得configmap中的所有key/value对儿 都自动变成环境变量

vim testpod.yml

---

apiVersion: v1

kind: Pod

metadata:

  name: test-pod

spec:

  containers:

    - name: test-container

      image: daocloud.io/library/nginx

      envFrom: #固定写法

      - configMapRef: #固定写法

          name: configmap-2 已创建的configmap名称

  restartPolicy: Never #重启策略-从不

kubectl apply -f testpod.yml    创建pod

 kubectl exec -it dapi-test-pod /bin/bash   进入pod容器

输入env  查看一下变量  可以看到configmap-2里面定义的内容都有

作为volume挂载使用

 vim volupod.yml

---

apiVersion: v1

kind: Pod

metadata:

  name: nginx-configmap

spec:

  containers:

  - name: nginx-configmap

    image: daocloud.io/library/nginx

    volumeMounts:

    - name: volume4

      mountPath: "/home/config-4"

  volumes:

  - name: volume4

    configMap:

      name: configmap-4

kubectl apply -f volupod.yml     创建pod

kubectl  exec -it nginx-configmap /bin/bash    进入到容器查看

在config-4文件夹下以每一个key为文件名value为值创建了多个文件

Downward API

用于在容器中获取 POD 的基本信息,kubernetes原生支持

Downward API提供了两种方式用于将 POD 的信息注入到容器内部:

1.环境变量:用于单个变量,可以将 POD 信息和容器信息直接注入容器内部。

2.Volume挂载:将 POD 信息生成为文件,直接挂载到容器内部中去。

环境变量的方式:

通过Downward API来将 POD 的 IP、名称以及所对应的 namespace 注入到容器的环境变量中去,然后在容器中打印全部的环境变量来进行验证

使用环境变量的方式

vim test-env-pod.yml

---

apiVersion: v1

kind: Pod

metadata:

    name: test-env-pod

    namespace: kube-system

spec:

    containers:

    - name: test-env-pod

      image: daocloud.io/library/nginx

      env:

      - name: POD_NAME   #第一个环境变量的名字

        valueFrom:      #使用valueFrom方式设置

          fieldRef:    #关联一个字段metadata.name

            fieldPath: metadata.name  #这个字段从当前运行的pod详细信息查看

      - name: POD_NAMESPACE

        valueFrom:

          fieldRef:

            fieldPath: metadata.namespace

      - name: POD_IP

        valueFrom:

          fieldRef:

            fieldPath: status.podIP

 kubectl apply -f test-env-pod.yml 创建pod

kubectl exec -it test-env-pod /bin/bash -n kube-system   进入容器内部查看

env | grep POD

Volume挂载

 vim test-volume-pod.yaml

---

apiVersion: v1

kind: Pod

metadata:

    name: test-volume-pod

    namespace: kube-system

    labels:

        k8s-app: test-volume

        node-env: test

spec:

    containers:

    - name: test-volume-pod-container

      image: daocloud.io/library/nginx

      volumeMounts:

      - name: podinfo

        mountPath: /data

    volumes:

    - name: podinfo

      downwardAPI:

        items:

        - path: "labels"

          fieldRef:

            fieldPath: metadata.labels

kubectl apply -f test-volume-pod.yaml    创建pod

kubectl exec -it test-volume-pod /bin/bash -n kube-system   进入容器内部

将元数据 labels 和 annotaions 以文件的形式挂载到了/data

在实际应用中,如果你的应用有获取 POD 的基本信息的需求,就可以利用Downward API来获取基本信息,然后编写一个启动脚本或者利用initContainer将 POD 的信息注入到容器中去,然后在自己的应用中就可以正常的处理相关逻辑

目前 Downward API 支持的字段使用 fieldRef 可以声明使用:

spec.nodeName - 宿主机名字

status.hostIP - 宿主机 IP

metadata.name - Pod 的名字

metadata.namespace - Pod 的 Namespace

status.podIP - Pod 的 IP

spec.serviceAccountName - Pod 的 Service Account 的名字

metadata.uid - Pod 的 UID

metadata.labels['<KEY>'] - 指定 <KEY> 的 Label 值

metadata.annotations['<KEY>'] - 指定 <KEY> 的 Annotation 值

metadata.labels - Pod 的所有 Label

metadata.annotations - Pod 的所有 Annotation

ServiceAccount

  Service Account它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证。----专门为pod里面的进程和apiserver通信提供认证的。

Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。它与User account不同。很少会使用到操作略

挂载目录的方法

vim  test.yml

---

apiVersion: v1

kind: Pod

metadata:

  name: mypod-3

spec:

  containers:

  - name: mycontainer

    image: daocloud.io/library/nginx

    volumeMounts:

    - name: myvolume            #挂载名称

      mountPath: /home #容器内路径

  volumes:

  - name: myvolume              #和上方一致

    hostPath:

      path: /data/test    #被映射路径

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

SQL 错误 [22007]: ERROR: invalid input syntax for type date: ““

0. 背景 PG数据库一张表有这样一个varchar类型的字段end_date,存储的值是格式化后的年月日日期如 2024-08-10 现在我需要根据当前日期与end_date的差值作为where条件过滤,我的写法 select …… from my_table_name where current_date - cast (end_date as date) >100报错…

五度易链最新“产业大数据服务解决方案”亮相,打造数据引擎,构建智慧产业

快来五度易链官网 点击网址【http://www.wdsk.net/】 看看我们都发布了哪些新功能!!! 自2015年布局产业大数据服务行业以来&#xff0c;“五度易链”作为全国产业大数据服务行业先锋企业&#xff0c;以“让数据引领决策&#xff0c;以智慧驾驭未来”为愿景&#xff0c;肩负“打…

linux中互斥锁,自旋锁,条件变量,信号量,与freeRTOS中的消息队列,信号量,互斥量,事件的区别

RTOS 对于目前主流的RTOS的任务&#xff0c;大部分都属于并发的线程。 因为MCU上的资源每个任务都是共享的&#xff0c;可以认为是单进程多线程模型。 【freertos】003-任务基础知识 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式&#xff0c;但是如…

基于Java+SpringBoot+Vue前后端分离社区医院管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

优化Python代理爬虫的应用

当我们在资源受限的环境中使用Python代理爬虫时&#xff0c;我们需要采取一些优化措施&#xff0c;以确保程序的高效性和稳定性。在本文中&#xff0c;我将分享一些关于如何优化Python代理爬虫在资源受限环境下的应用的实用技巧。 首先我们来了解&#xff0c;哪些情况算是资源…

【位运算进阶之----右移(>>)】

&#x1f604;嘻嘻&#xff0c;朋友们&#xff0c;大家好&#xff01;昨天我们学习了左移&#xff0c;今天我们来谈谈右移>>。 ⭐️简单来说&#xff0c;右移就是将一个数二进制表达整体向右移动&#xff0c;也就是去掉一个数的二进制表达的末位&#xff0c;右移一位就去…

Kaniko在containerd中无特权快速构建并推送容器镜像

目录 一、kaniko是什么 二、kaniko工作原理 三、kanijo工作在Containerd上 基于serverless的考虑&#xff0c;我们选择了kaniko作为镜像打包工具&#xff0c;它是google提供了一种不需要特权就可以构建的docker镜像构建工具。 一、kaniko是什么 kaniko 是一种在容器或 Kube…

字符集(Latin1,GBK,utf8,utf8mb4)

Latin1 1个字符占一个字节GBK 1个字符占两个字节utf8utfmb3 1个字节占三个字节utf8mb4 1个字符占四个字节

前端(十五)——GitHub开源一个react封装的图片预览组件

&#x1f475;博主&#xff1a;小猫娃来啦 &#x1f475;文章核心&#xff1a;GitHub开源一个react封装的图片预览组件 文章目录 组件开源代码下载地址运行效果展示实现思路使用思路和api实现的功能数据和入口部分代码展示 组件开源代码下载地址 Gitee&#xff1a;点此跳转下载…

Java入职第十一天,深入了解静态代理和动态代理(jdk、cglib)

一、代理模式 一个类代表另一个类去完成扩展功能,在主体类的基础上,新增一个代理类,扩展主体类功能,不影响主体,完成额外功能。比如买车票,可以去代理点买,不用去火车站,主要包括静态代理和动态代理两种模式。 代理类中包含了主体类 二、静态代理 无法根据业务扩展,…

C++Qt堆叠窗体的使用案例

本博文源于笔者最近学习的Qt&#xff0c;内容讲解堆叠窗体QStackedWidget案例&#xff0c;效果是选择左侧列表框中不同的选项时&#xff0c;右侧显示所选的不同的窗体。 案例效果 案例书写过程 控件都是动态创建的&#xff0c;因此.h文件需要创建控件&#xff0c;.cpp书写业务…

四层负载均衡的NAT模型与DR模型推导 | 京东物流技术团队

导读 本文首先讲述四层负载均衡技术的特点&#xff0c;然后通过提问的方式推导出四层负载均衡器的NAT模型和DR模型的工作原理。通过本文可以了解到四层负载均衡的技术特点、NAT模型和DR模型的工作原理、以及NAT模型和DR模型的优缺点。读者可以重点关注NAT模型到DR模型演进的原…

vue table合并行 动态列名

需求: 1.合并行,相同数据合并 2,根据后端返回数据动态显示列名, 我这个业务需求是,每年增加一列,也就是列名不是固定的,后端返回数据每年会多一条数据,根据返回数据显示列名 实现: html <el-table v-loading"loading" :data"dataList" :span-metho…

视频汇聚平台EasyCVR安防视频监控平台新增经纬度选取功能的详细介绍

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

ios ipa包上传需要什么工具

目录 ios ipa包上传需要什么工具 前言 一、IPA包的原理 二、IPA包上传的步骤 1.注册开发者账号 2.apk软件制作工具创建应用程序 3.构建应用程序 4.生成证书和配置文件 5.打包IPA包 6.上传IPA包 三、总结 前言 iOS IPA包是iOS应用程序的安装包&#xff0c;可以通过iT…

12. Oracle中case when详解

格式&#xff1a; case expression when condition_01 then result_01 when condition_02 then result_02 ...... when condition_n then result_n else result_default end 表达式expression符合条件condition_01&#xff0c;则返回…

性能测试流程? 怎么做性能测试?

一、前期准备 性能测试虽然是核心功能稳定后才开始压测&#xff0c;但是在需求阶段就应该参与&#xff0c;这样可以深入了解系统业务、重要功能的业务逻辑&#xff0c;为后续做准备。 二、性能需求分析&#xff08;评审&#xff09; 评审时&#xff0c;要明确性能测试范围、目…

[足式机器人]Part3机构运动微分几何学分析与综合Ch03-1 空间约束曲线与约束曲面微分几何学——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch01-4 平面运动微分几何学 3.1 空间曲线微分几何学概述3.1.1 矢量表示3.1.2 Frenet标架 连杆机构中的连杆与连架杆构成运动副&#xff0c;该运动副元素的特征点或特…

一文搞懂深度信念网络!DBN概念介绍与Pytorch实战

目录 一、概述1.1 深度信念网络的概述1.2 深度信念网络与其他深度学习模型的比较结构层次学习方式训练和优化应用领域 1.3 应用领域图像识别与处理自然语言处理推荐系统语音识别无监督学习与异常检测药物发现与生物信息学 二、结构2.1 受限玻尔兹曼机&#xff08;RBM&#xff0…

正确进行自动化测试

前言&#xff1a; &#x1f4d5;作者简介&#xff1a;热爱编程的小七&#xff0c;致力于C、Java、Python等多编程语言&#xff0c;热爱编程和长板的运动少年&#xff01; &#x1f4d8;相关专栏Java基础语法&#xff0c;JavaEE初阶&#xff0c;数据库&#xff0c;数据结构和算法…