k8s挂载映射操作详解

这篇具有很好参考价值的文章主要介绍了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.txtk8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载

kubectl get secrets 查看创建结果 

k8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载

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

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

kubectl get secret user-pass -o json

k8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载

base64解码:

echo 'MWYyZDFlMmU2N2Rm' | base64 --decode

k8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载

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   创建

k8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载

kubectl exec -it mypod /bin/bash

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

k8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载

被挂载的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    修改完直接创建即可在次来到容器查看已经变了

k8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载

k8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载 

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

k8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载

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

k8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载 

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为值创建了多个文件

k8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载

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

k8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载

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

k8s挂载映射操作详解,kubernetes,容器,云原生,k8s,k8s挂载

在实际应用中,如果你的应用有获取 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    #被映射路径

 文章来源地址https://www.toymoban.com/news/detail-670844.html

 

 

 

 

 

 

 

 

 

到了这里,关于k8s挂载映射操作详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云原生 | Kubernetes 系列】K8s 实战 如何给应用注入数据 II 将pod数据传递给容器

    在上一篇文章中,我们学习了针对容器设置启动时要执行的命令和参数、定义相互依赖的环境变量、为容器设置环境变量,三种设置方式,本篇文章,我们将继续学习数据的传递。 有两种方式可以将 Pod 和 Container 字段传递给运行中的容器: 环境变量 卷文件 这两种呈现 Pod

    2024年01月25日
    浏览(141)
  • 云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)

    目录 一、理论 1.K8S集群升级 2.环境 3.升级策略 4.master1节点迁移容器运行时(docker → containerd)  5.master2节点迁移容器运行时(docker → containerd)  6.node1节点容器运行时迁移(docker → containerd)  7.升级集群计划(v1.23.14 → v1.24.1) 8.升级master1节点版本(v1.24.1) 9.升级master2节点版本

    2024年02月03日
    浏览(69)
  • 云上攻防-云原生篇&;Kubernetes&;K8s安全&;API&;Kubelet未授权访问&;容器执行

    curl -XPOST -k “https://192.168.139.132:10250/run///” -d “cmd=id” 执行的命令是test03容器里的命令,需要进行容器逃逸。 1、攻击8080端口:API Server(Master)未授权访问 旧版本的k8s的API Server默认会开启两个端口:8080和6443。 6443是安全端口,安全端口使用TLS加密;但是8080端口无需认证,

    2024年04月22日
    浏览(77)
  • 云原生Kubernetes:K8S概述

    目录 一、理论 1.云原生 2.K8S 3.k8s集群架构与组件 4.K8S网络 二、总结 (1)概念 云原生是一种基于容器、微服务和自动化运维的软件开发和部署方法。它可以使应用程序更加高效、可靠和可扩展,适用于各种不同的云平台。 如果要更直接通俗的来解释下上面的概念,云原生更

    2024年02月10日
    浏览(55)
  • 【云原生 • Kubernetes】认识 k8s、k8s 架构、核心概念点介绍

    目录 一、Kubernetes 简介 二、Kubernetes 架构 三、Kunbernetes 有哪些核心概念? 1. 集群 Cluster 2. 容器 Container 3. POD 4. 副本集 ReplicaSet 5. 服务 service 6. 发布 Deployment 7. ConfigMap/Secret 8. DaemonSet 9. 核心概念总结 Kubernetes 简称 k8s,是支持云原生部署的一个平台,起源于谷歌。谷歌早在十几

    2024年02月03日
    浏览(199)
  • 【云原生 • Kubernetes】认识 k8s 网络、外部网络访问 k8s 内部服务

    目录 一、认识 Kubernetes 网络 二、外部网络如何访问 k8s 内部服务 1. NodePort 2. Load Balancer 3. Ingress Kubernetes 最底层的网络为节点网络,用来保证 k8s 集群的节点(master 和 worker、worker 节点之间)能够做正常的 IP 寻址和通讯。 Kubernetes 第二层网络就是 Pod 网络,构建于节点网络之上

    2024年01月16日
    浏览(72)
  • 云原生Kubernetes:K8S存储卷

    目录 一、理论 1.存储卷 2.emptyDir 存储卷 3.hostPath卷 4.NFS共享存储 5.PVC 和 PV 6.静态创建PV 7.动态创建PV 二、实验  1.emptyDir 存储卷 2.hostPath卷 3.NFS共享存储 4.静态创建PV 5.动态创建PV 三、问题 1.生成pod一直pending 2.shoumount -e未显示共享目录 3.静态创建pv 报错 4.使用 Deployment 来创建

    2024年02月07日
    浏览(74)
  • 云原生Kubernetes:K8S安全机制

    目录 一、理论 1.K8S安全机制 2.Authentication认证 3.Authorization授权 4.Admission Control准入控制 5.User访问案例 6.ServiceAccount访问案例 二、实验 1.Admission Control准入控制 2.User访问案例 3.ServiceAccount访问案例 三、问题 1.生成资源报错 2.镜像拉取失败 四、总结 (1)概念 Kubernetes 作为一个分

    2024年02月07日
    浏览(70)
  • 【云原生K8S】Kubernetes之探针

    目录 一、探针是什么 二、探针类型  Ⅰ、livenessProbe 容器重启策略  Ⅱ、readinessProbe Ⅲ、startupProbe 执行顺序: 字段详情 三、探测机制 Ⅰ、HTTP GET探针 Ⅱ、TCP套接字探针 Ⅲ、Exec探针 探针:是由 kubelet 对容器执行的定期诊断 要执行诊断,则需kubelet 调用由容器实现的 Handler。

    2024年02月09日
    浏览(69)
  • 云原生_kubernetes(k8s)介绍

    目录 一、应用部署方式演变 二、k8s介绍 三、k8s的组件 四、k8s中的概念 五、k8s资源管理方式 1、命令式对象管理 2、命令式对象配置 3、声明式对象配置 在部署应用程序的方式上,主要经历了三个时代: 1 、物理机部署: 互联网早期,会直接将应用程序部署在物理机上 优点

    2023年04月13日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包