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    #被映射路径

 

 

 

 

 

 

 

 

 

 

原文地址:https://blog.csdn.net/W1124824402/article/details/132420333

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读942次。kube-controller-manager 和 kubelet 是异步工作的,这意味着延迟可能包括任何的网络延迟、apiserver 的延迟、etcd 延迟,一个节点上的负载引起的延迟等等。当 Kubernetes 中 Node 节点出现状态异常的情况下,节点上的 Pod 会被重新调度到其他节点上去,但是有的时候我们会发现节点 Down 掉以后,Pod 并不会立即触发重新调度,这实际上就是和 Kubelet 的状态更新机制密切相关的,Kubernetes 提供了一些参数配置来触发重新调度的时间。_node-monitor-period
文章浏览阅读3.8k次。上篇文章详细介绍了弹性云混部的落地历程,弹性云是滴滴内部提供给网约车等核心服务的容器平台,其基于 k8s 实现了对海量 node 的管理和 pod 的调度。本文重点介绍弹性云的调度能力,分为以下部分:调度链路图:介绍当前弹性云调度体系链路,对架构体系有一个初步的认知k8s 调度能力的运用:整体介绍弹性云现在用到的 k8s 调度能力和对其的增强k8s 版本的升级:介绍到从 k8s 1.12 到 1...._滴滴机房 腾讯
文章浏览阅读897次。对于cpu来说,这种分配方式并不会有太大问题,因为cpu可以灵活调度,numa调度时我们只计算绑定了numa cpu的pod是可以接受的,但是对于内存来说,numa node上申请了的内存无法做到随时迁移,这就会导致调度器视角numa node的mem资源足够,但是等到pod真正使用时,由于没有绑定numa node的pod申请的内存,导致numa node的mem资源不足,造成swap中断或者远端内存申请,这会对绑定mem的pod来带来性能损耗。忽略了没有绑定numa node的pod资源。_kubectl numa
文章浏览阅读796次,点赞17次,收藏15次。只要在Service定义中设置了ClusterIp:None,就定义了一个HeadLess Service, 它与普通的Service关键区别在于它没有ClusterIp地址,如果解析HeadLess Service的DNS域名,则会返回该Service对应的全部Pod的EndPoint列表,这就意味着客户端是直接与后端的pod建立了TCP/IP链接进行通信的。一个Label是一个键值对。注解:属于资源对象的元数据,可以被理解为一种特殊的标签,不过更多的是与程序挂钩,通常用于实现资源对象属性的自定义扩展。
文章浏览阅读763次。但是此时如果配置成 NONE, 租户创建成功了,但是无法创建资源文件,也就是无法上传文件,可能 dolphinscheduler 团队就想着将文件上传到 hdfs,暂不支持本地。需要将 resource.storage.type 置为 NONE, 因为我之前用的 1.3.6 版本的时候,即使资源文件存在本地文件也需要配置成 hdfs。_[error] 2023-10-24 18:10:43.762 +0800 org.apache.dolphinscheduler.api.servic
文章浏览阅读2.7k次,点赞2次,收藏13次。公司使用的是交老的k8s版本(1.16),由于老版本的K8s对于现在很多新特性不支持,所以需要升级到新版本。目前2023年7月11日最新版本的k8s是v1.27.3。通过参考官方文档进行k8s部署工作。其中涉及到操作系统配置、防火墙配置、私有镜像仓库等。_k8s最新版本
文章浏览阅读1.8w次,点赞14次,收藏27次。能节省你在kubeadm init 时遇到问题的排错时间⌚️。整合了网上大佬
文章浏览阅读1.1k次,点赞2次,收藏7次。具体操作步骤可以参考之前的教程,建议是先安装一台,然后克隆虚拟机,这样速度快。注意:在克隆时记得修改Mac地址、IP地址、UUID和主机名。(最后别忘了保存下快照~)_部署k8s集群
文章浏览阅读863次,点赞23次,收藏16次。当部署完 Kubernetes,便拥有了一个完整的集群。一组工作机器,称为节点, 会运行容器化应用程序。每个集群至少有一个工作节点。工作节点会 托管Pod ,而 Pod 就是作为应用负载的组件。控制平面管理集群中的工作节点和Pod。说人话版本:集群:cluster,多个几点被组织到一起共同为系统提供服务过程称之为集群。本质上是将承载同一个软件服务节点组织到一起,称之为该软件(服务)的集群,当然集群中的节点身份地位是不一样的。k8s集群也是如此,他也是多个节点组成。
文章浏览阅读943次。Rancher是一个开源的企业级多集群Kubernetes管理平台,实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理,以确保集群的安全性,加速企业数字化转型。Rancher 1.0版本在2016年就已发布,时至今日,Rancher已经成长为企业在生产环境中运行容器和Kubernetes的首要选择。_rancher管理k8s
文章浏览阅读742次,点赞2次,收藏3次。本篇来讲解如何在centos下安装部署高可用k8s集群。_kubeadm ha keepalived + nginx
文章浏览阅读1.9k次,点赞21次,收藏25次。那么这个空间设置成内存的2倍大小。点击IPv4设置--手动--添加--设置ip--设置DNS服务器,最后点击--“保存”;首先选中--“本地标准磁盘”,存储配置--自定义分区,点击--“完成”;在--主机名--设置主机名:(例如k8s-master01),点击--点击+,设置--挂载点/boot--期望容量,点击--添加挂载点;点击--+--挂载点swap--期望容量,点击--“添加挂载点”;默认选择--亚洲--上海,并调整日期和时间,点击--“完成”;设备类型--确认--LVM,卷组--选择“修改”;_euler 服务器搭建
文章浏览阅读1k次。在1.25版本的k8s集群中部署gpu-manage时,虽然显示gpu节点上gpu-manage的pod实例都是running状态,但是给pod申领。既可以用源码的Makefile自动编译打包成新的镜像,但是源码的。说明gpu-manager和容器运行时接口通信失败了。编译后的镜像在1.25版本的k8s中可以正常使用。,但是在k8s1.23版本之后,接口路径已经改为。资源时,却始终找不到有资源的节点。,另外有一些依赖需要国际上的支持。可以看到这里用的运行时接口是。查看节点的详情时,返回的。_launch gpu manager 报错 can't create container runtime manager: context dead
文章浏览阅读1k次,点赞18次,收藏16次。SelfLink:API的资源对象之一,表示资源对象在集群当中自身的一个连结,self-Link是一个唯一的标识号,可以用于标识k8s集群当中的每个资源的对象。容器里使用的配置,在provisioner当中定义好环境变量,传给容器,storageclass的名称,NFS服务器的地址,NFS的目录。NFS的provisionner的客户端以pod的方式运行在集群当中,监听k8s集群当中PV的请求,然后动态的创建于NFS相关的PV。命名为 nfs-client-provisioner-clusterrole。
文章浏览阅读6.3k次,点赞2次,收藏20次。k8s证书过期解决方案之替换证书_k8s证书过期如何更换
文章浏览阅读1k次。KMS,Key Management Service,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密。以保护敏感数据
文章浏览阅读888次。exporter对于云服务的监控还是很不完美,毕竟每家都有自己的护城河。自动发现多实例这样的借助consul 阿波罗这样的会简单一些。aws可以借助cloudwatch这样的导入模板到grafana中。还是希望能将类似腾讯云云监控中的这些指标采集到prometheus中,但是这过程应该还很遥远grafana出图 prometheus查询语法这些东西有时间的好好研究一下。报警有必要进行分级别,收敛配置一下!_command: - "-redis.password-file=/redis_passwd.json
文章浏览阅读1k次。可以在此处(https://cloud.google.com/kubernetes-engine/docs/how-to/kube-dns)和此处(https://www.digitalocean.com/community/tutorials/an-introduction-to-the-kubernetes-dns-service)找到更多的详细信息。-or-ipvs/)和此处(https://arthurchiao.art/blog/cracking-k8s-node-proxy/)。_k8s默认命名空间
文章浏览阅读4.9k次,点赞11次,收藏32次。如果运行runc命令时提示:runc: error while loading shared libraries: libseccomp.so.2: cannot open shared object file: No such file or directory,则表明runc没有找到libseccomp,需要检查libseccomp是否安装,本次安装默认就可以查询到。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。_kubernetes 1.28
文章浏览阅读3.6w次,点赞118次,收藏144次。Canal 提供了网络功能,使得 Kubernetes 集群中的 Pod 可以相互通信,并与集群外部的服务进行通信。它通过网络插件的方式,为每个 Pod 分配唯一的 IP 地址,并管理网络流量的路由和转发。此外,Canal 还支持网络策略,用于定义 Pod 之间的通信规则和安全策略。Canal 基于 Calico 和 Flannel 项目,结合了二者的优点。它使用 Calico 的数据平面,提供高性能的网络转发和安全特性,同时使用 Flannel 的控制平面,实现 IP 地址管理和网络策略的配置。_k8s canal