Kubernetes之Projected Volume

news2024/11/28 6:40:37

目录

四种Projected Volume

Secret

使用方法

应用场景

示例

ConfigMap

使用方法

应用场景

示例

Downward API

使用方法

应用场景

示例

ServiceAccountToken

使用方法

应用场景

示例


        在 Kubernetes 中,有几类特殊的 Volume,它们存在的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换。这些特殊 Volume 的作用是为容器提供预先定义好的数据。从容器的角度来看,这些 Volume 里的信息就好像是被 Kubernetes "投射"(Project)进入容器当中的,这就是 Projected Volume 的含义。   

四种Projected Volume

Secret:用于存储敏感信息,如密码、OAuth 令牌、SSH 密钥等,以防止这些信息被暴露在 Pod 的配置中或者存储在容器镜像里。

ConfigMap:用于存储非敏感信息,如配置文件、命令行参数等,使得应用配置可以从镜像内容中解耦,提高灵活性和可维护性。

Downward API:允许容器访问 Pod 本身的信息(如 Pod 名称、命名空间、IP 地址等),使容器能够更好地了解自己的运行环境。

ServiceAccountToken:提供对 Kubernetes API 的访问令牌,允许容器内的应用程序与 Kubernetes API 交互,进行自动化管理操作。(严格来说算是Secret的一种)

        这些类型的投射数据卷对于保护敏感信息、配置管理、自动化运维等场景至关重要。相比于通过环境变量传递信息,使用投射数据卷的方式能够更安全、更灵活地管理这些信息,并且支持自动更新,大大提高了云原生应用的可维护性和可扩展性。


Secret

        Secret 是 Kubernetes 用来保存敏感数据的一种资源对象,例如密码、OAuth Token、SSH 密钥等。将这些敏感信息放到 Secret 中比直接放到 Pod 定义或 Docker 镜像中要更加安全和灵活。

使用方法

Secret 可以通过 Volume 或者环境变量的方式使用,以 Volume 方式使用的例子如下,

在这个例子中,Secret mysecret 被挂载到容器的 /etc/foo 目录,容器内的应用可以通过读取 /etc/foo 目录下的文件来获取 Secret 的内容。:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret

应用场景

  • 保存数据库连接字符串、用户名密码等敏感信息。
  • 保存 SSL/TLS 证书信息。
  • 保存 API Token、OAuth Token 等认证信息。


示例

使用 Secret 存储数据库用户名密码:
1、首先使用 kubectl 命令创建一个 Secret:

kubectl create secret generic mysql-auth --from-literal=username=admin --from-literal=password='S!B\*d$zDsb='

2、在 Pod 中使用这个 Secret

apiVersion: v1
kind: Pod
metadata:
  name: mysql-client
spec:
  containers:
  - name: mysql-client
    image: mysql:5.7
    env:
      - name: MYSQL_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysql-auth
            key: username
      - name: MYSQL_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysql-auth
            key: password
    command: ["mysql", "-u$(MYSQL_USERNAME)", "-p$(MYSQL_PASSWORD)"]  

        MySQL 客户端就可以使用 Secret 中存储的用户名密码连接数据库了,而不需要将这些敏感信息硬编码到应用代码或配置文件中。


ConfigMap

        ConfigMap 是 Kubernetes 用来存储应用配置信息的资源对象。它可以存储环境变量、命令行参数或者配置文件等数据,这些数据可以被 Pod 中的容器使用。使用 ConfigMap 可以将应用的配置信息与容器镜像解耦,便于应用配置的修改和管理。

使用方法

与 Secret 类似,ConfigMap 也可以通过 Volume 或环境变量的方式在 Pod 中使用,以 Volume 方式使用的例子如下:

这个例子中,ConfigMap special-config 被挂载到容器的 /etc/config 目录,容器内可以通过读取 /etc/config 目录下的文件来获取 ConfigMap 的内容。

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.level: very
  special.type: charm
---
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: special-config
  restartPolicy: Never


 

应用场景

  • 存储应用的环境变量配置,如 JVM 参数、日志级别等。
  • 存储应用的配置文件,如 nginx 配置、redis 配置等。
  • 存储部署相关的元数据,如应用的版本号、Git Commit ID 等。


示例

使用 ConfigMap 存储 nginx 配置
1、首先创建一个包含 nginx 配置的 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    user nginx;
    worker_processes  1;
    events {
      worker_connections  10240;
    }
    http {
      server {
        listen       80;
        server_name  localhost;
        location / {
          root   /usr/share/nginx/html;
          index  index.html index.htm;
        }
      }
    }

2、在 nginx 的 Pod 中使用这个 ConfigMap:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.7.9
    ports:
    - containerPort: 80
    volumeMounts:
    - name: config
      mountPath: /etc/nginx
  volumes:
  - name: config
    configMap:
      name: nginx-config
      items:
      - key: nginx.conf
        path: nginx.conf

        这样,nginx 容器启动时就会加载 ConfigMap 中的配置文件,无需将配置文件打包到镜像中,非常方便进行配置管理。同时由于配置与镜像解耦,也便于单独修改配置而不影响镜像。


Downward API

        Downward API 让 Pod 里的容器能够获取到 Pod 本身的元数据信息,如 Pod 的名称、命名空间、标签、注解等。它使得容器内的应用能够不依赖 Kubernetes API 就可以直接获取一些运行时需要的信息。

使用方法

使用 Downward API,有两种方式可以将 Pod 信息呈现给容器:

  • 通过环境变量。
  • 通过 Volume 文件。

通过 Volume 文件方式使用 Downward API

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-downwardapi-volume-example
  labels:
    zone: us-est-coast
    cluster: test-cluster1
    rack: rack-22
  annotations:
    build: two
    builder: john-doe
spec:
  containers:
    - name: client-container
      image: registry.k8s.io/busybox
      command: ["sh", "-c"]
      args:
      - while true; do
          if [[ -e /etc/podinfo/labels ]]; then
            echo -en '\n\n'; cat /etc/podinfo/labels; fi;
          if [[ -e /etc/podinfo/annotations ]]; then
            echo -en '\n\n'; cat /etc/podinfo/annotations; fi;
          sleep 5;
        done;
      volumeMounts:
        - name: podinfo
          mountPath: /etc/podinfo
  volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "labels"
            fieldRef:
              fieldPath: metadata.labels
          - path: "annotations"
            fieldRef:
              fieldPath: metadata.annotations

        在这个例子中,Pod 的 Labels 和 Annotations 信息被作为文件挂载到容器的 /etc/podinfo 目录。容器内可以通过读取 /etc/podinfo/labels 和 /etc/podinfo/annotations 文件来获取这些信息。

Downward API 支持的字段

访问方式可访问的字段描述
fieldRefspec.nodeName获取宿主机的名字,即运行该 Pod 的节点名称
status.hostIP获取宿主机的 IP 地址
metadata.name获取 Pod 的名称
metadata.namespace获取 Pod 所在的命名空间
status.podIP获取分配给 Pod 的 IP 地址
spec.serviceAccountName获取 Pod 所使用的 Service Account 名称
metadata.uid获取 Pod 的唯一标识符(UID)
metadata.labels['<KEY>']获取指定 <KEY> 的 Label 值。您需要替换 <KEY> 为实际的 Label 键
metadata.annotations['<KEY>']获取指定 <KEY> 的 Annotation 值。同样地,需要将 <KEY> 替换为实际的 Annotation 键
metadata.labels获取 Pod 的所有 Label
metadata.annotations获取 Pod 的所有 Annotation
resourceFieldReflimits.cpu获取容器的 CPU 使用上限
requests.cpu获取容器请求的 CPU 资源量
limits.memory获取容器的内存使用上限
requests.memory获取容器请求的内存资源量

应用场景

  1. 让容器知道自己所在 Pod 的基本信息,如名称、IP、所属的 Node 等,用于日志记录或服务发现。
  2. 将 Pod 的标签或注解传递给容器,基于这些信息进行某些操作,如改变配置等。
  3. 某些 Operator 或 Controller 可能会给 Pod 添加一些元数据,并希望 Pod 内部能够获取到,Downward API 就很适合这种场景。

示例

容器内获取 Pod 信息写入日志

假如需要容器内的应用将一些日志信息和 Pod 名称、所在命名空间等元数据关联起来并输出,就可以使用 Downward API,像这样配置 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-fieldref
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo "[$(date)] Hello from the $(MY_POD_NAME) pod in the $(MY_POD_NAMESPACE) namespace on node $(MY_NODE_NAME)" >> /var/log/hello.log;
          sleep 10;
        done;
      env:
        - name: MY_POD_NAME         #通过Downward API获取Pod名称
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: MY_POD_NAMESPACE    #通过Downward API获取namespace名称
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: MY_NODE_NAME        #通过Downward API获取Node名称
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName

        这样,容器内的脚本就可以获取 Pod 的名称、命名空间、所在节点等信息,并将其写入日志。当然,Pod 的这些元数据也可以单独记录在日志中,供后续进行过滤查询分析等操作。


ServiceAccountToken

        Service Account 是 Kubernetes 中的一种资源,它为 Pod 中运行的进程提供了一种身份标识。每个 namespace 都有一个默认的 default service account。 当创建 Pod 时,如果没有指定 service account,会自动使用 default service account。

        每个 Service Account 都有一个对应的 Secret,其中包含了访问 Kubernetes API 所需的授权 Token。Kubernetes 会自动将这个 Secret 以 Volume 的形式挂载到使用该 Service Account 的所有 Pod 中,挂载路径为 /var/run/secrets/kubernetes.io/serviceaccount

        严格来说,Kubernetes 的 Projected Volume 只有三种,因为第四种 ServiceAccountToken,只是一种特殊的 Secret。

使用方法

一般不需要特别配置什么,Pod 创建完成后,容器内就可以直接从默认路径 /var/run/secrets/kubernetes.io/serviceaccount 读取授权信息和文件。

例如,容器内可以直接读取 /var/run/secrets/kubernetes.io/serviceaccount/token 文件获取 JWT Token,用于调用 Kubernetes API。

应用场景

  1. Pod 内的应用需要访问 Kubernetes API,如监控应用通过 API 查询指标数据。
  2. Operator 或 Controller 需要通过 API 控制其他资源。
  3. 自研的 PaaS 平台组件,需要通过 Kubernetes API 实现平台功能。

示例

Pod 内访问 Kubernetes API

自研的监控 Agent,需要它能够访问 Kubernetes API 获取集群的监控指标数据,就可以利用默认的 ServiceAccountToken,Agent 的 Pod 配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: my-monitor-agent
spec:
  containers:
  - name: my-monitor-agent
    image: my-monitor-agent:v1.0

Agent 的代码中,可以这样读取 ServiceAccountToken 并访问 API:

Go代码

import (
	"io/ioutil"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"
)

func main() {
	// 读取 ServiceAccountToken
	tokenFile := "/var/run/secrets/kubernetes.io/serviceaccount/token"
	token, err := ioutil.ReadFile(tokenFile)
	if err != nil {
		panic(err.Error())
	}
	
	// 创建 k8s 配置
	config := &rest.Config{
                Host:            "https://kubernetes.default.svc",
                BearerToken:     string(token),
                TLSClientConfig: rest.TLSClientConfig{Insecure: true},
        }
	
	// 创建 clientset 访问 API
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
	
	// 调用 API 获取 Pod 列表
	pods, err := clientset.CoreV1().Pods("").List(metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}

	// 进行监控数据采集逻辑 
	...
}

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

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

相关文章

振弦采集仪在桥梁工程监测中的优势与实践案例

振弦采集仪在桥梁工程监测中的优势与实践案例 在桥梁工程监测中&#xff0c;振弦采集仪是一种常用的监测设备。它的主要功能是通过采集桥梁振动信号&#xff0c;实时监测桥梁的结构健康状态。与传统的监测方法相比&#xff0c;振弦采集仪具有一些明显的优势&#xff0c;下面将…

docker:在ubuntu中运行docker容器

前言 1 本笔记本电脑运行的ubuntu20.04系统 2 docker运行在ubuntu20.04系统 3 docker镜像使用的是ubuntu18.04&#xff0c;这样拉的 docker pull ubuntu:18.04 4 docker容器中运行的是ubuntu18.04的系统&#xff0c;嗯就是严谨 5 这纯粹是学习笔记&#xff0c;实际上没啥价值。…

【MySQL】DQL-分组查询-语法&where与having的区别&注意事项&可cv例题语句

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

数据结构初阶:算法的时间复杂度和空间复杂度

什么是数据结构&#xff1f; 数据结构 (Data Structure) 是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的 数据元素的集合。 什么是算法&#xff1f; 算法 (Algorithm): 就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&#xff0c…

DSSS-UQPSK学习笔记

文章目录 非平衡四相键控-直接序列扩频&#xff08;UQPSK-DSSS&#xff09;信号因其能同时传输两路不同功率、不同速率信号的特点&#xff0c;在需要图象和数据综合业务传输的领域得到了广泛应用。 系统信号的调制方式为非平衡四相键控&#xff08;Unbalanced Quadrature Phase…

【uC/OS-III篇】uC/OS-III 移植到 STM32 简明教程

uC/OS-III 移植到 STM32 简明教程 一、uC/OS-III 介绍 二、获取UCOS-III源码 三、建立项目工程 四、解决工程编译报错 五、修改项目文件 下一篇博客&#xff1a; 【uC/OS-III篇】uC/OS-III 创建第一个任务&#xff08;For STM32&#xff09; 移植后的工程自取方式&#xf…

磐启/PAN7030/2.4GHz 无线收发SOC芯片/ESSOP10/SOP16

1 概述 PAN7030 是一款集成 8 位 OTP MCU 和 2.4GHz 无线收发电路芯片&#xff0c;适合应用于玩具小车、 遥控器等领域。 PAN7030 内置 8 位 OTP MCU&#xff0c;包括 1.25KW 的程序存储器、80 字节数据存储器、16 位定 时器和 8 位/11 位 PWM 定时器、看门狗、电压比较器等…

求将TXT文本转换为Word文档的方法

一&#xff0c;前言 在现代办公环境中&#xff0c;文本文件的转换已成为一项常见的任务。其中&#xff0c;将TXT文本转换为Word文档是最常见的需求之一。这种转换不仅可以帮助我们更好地编辑和格式化文本&#xff0c;还可以提高文件的安全性和兼容性。本文将详细介绍如何将TXT…

iOS开发者必备的实时查看应用程序运行日志技术

目录 一、设备连接 二、使用克魔助手查看日志 三、过滤我们自己App的日志 &#x1f4dd; 摘要&#xff1a; 本文介绍了如何在iOS iPhone设备上实时查看输出在console控制台的日志。通过克魔助手工具&#xff0c;我们可以连接手机并方便地筛选我们自己App的日志。 &#x1f4…

表单全选反选(前端)

1.Html和JavaScript <table><tr><th class"allCheck"><input type"checkbox" name"" id"checkAll"> <span class"all">全选</span></th><th>商品</th><th>商…

gitee 本地文件提交到仓库

一、准备工作 1.下载Git Bash Git Bash官网下载地址 http://www.git-scm.com/download/ 点此跳转 2.注册或登录gitee gitee官网地址 https://gitee.com/ 点此跳转 没有账号选择注册有账号的话直接登陆 3.在gitee中新建一个空的仓库 登陆成功后点进个人主页&#xff0c;点击…

vs2022 开始自己的第一个C++程序

还不想使用vs2022的用户可以看博主的vs2019这篇博客&#xff1a;vs2019安装和使用教程&#xff08;详细&#xff09; vs2022安装教程(里面有下载地址)&#xff1a;vs2022安装和使用教程&#xff08;详细&#xff09; 这是针对于以上安装教程的C项目新建示例&#xff0c;与vs201…

干部任免管理系统开发(二) 数据库表的建设

前言: 字段照搬Lrmx文件内容 数据库表字段的设计基本上就是照搬Lrmx文件内容,没有什么过多的技术含量,也可以根据自己的需要对照Lrmx文件的格式自己去定义字段了。 软件的功能截图如下&#xff1a;核心就是能够任免审批表内容读取到数据库&#xff0c;生成lrmx和word格式方便做…

springcloud基本使用二(跨域访问)

创建两个springboot maven子项目 子项目名称分别为order-server和user-server 配置user-server子项目: 所需依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependenc…

内存管理--柔性数组

本次讲的是&#xff0c;柔性数组&#xff0c;如果哪位小博客想要了解的更多&#xff0c;可以登录下面这个网站&#xff0c;了解详细内容 C语言结构体里的成员数组和指针 | 酷 壳 - CoolShellhttps://coolshell.cn/articles/11377.html 我们就听说过数组&#xff0c;听说过柔性数…

【机器学习300问】58、什么是词袋模型和N-gram模型?

词袋模型&#xff08;Bag of Words, BoW&#xff09;和N-gram模型主要用于早期的自然语言处理任务&#xff0c;上文中我介绍了机器是如何读懂文本的四个阶段&#xff0c;这篇文章带大家来看看在不同阶段中会用到的两个模型——词袋模型和N-gram模型。如果没有读过我之前的文章&…

算法系列--递归,回溯,剪枝的综合应用(2)

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–递归,回溯,剪枝的综合应用(2) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(2) 一.括号…

《拆解一切问题》如何成为解决难题的高手 - 三余书屋 3ysw.net

拆解一切问题&#xff1a;如何成为解决难题的高手 今天给大家分享的这本书叫做《拆解一切问题》&#xff0c;标题看起来确实有点虚&#xff0c;在没有读这本书之前&#xff0c;会让人感觉似乎只要读完学会书中的内容&#xff0c;就可以解决一切问题了。但事实上这种认识是误解…

网络基础二补充——json与http协议

五、市面上常用序列化和反序列化工具 ​ 常用的有&#xff1a;json、protobuf、xml三种方案&#xff1b; 5.1json的使用 1.安装jsoncpp库&#xff0c;是一个第三方的开发库文件&#xff1b; sudo yum install -y jsoncpp-devel2.使用json ​ 经常使用的头文件是json.h&…

跟张良均老师学大数据人工智能——泰迪智能科技第二期在线实习项目已开营

在这个信息爆炸的时代&#xff0c;如何有效地收集、处理、分析和利用数据&#xff0c;以获取有价值的信息&#xff0c;成为了各行各业面临的关键挑战。因此&#xff0c;数据分析挖掘、人工智能和大数据开发等领域的需求日益凸显&#xff0c;这些技术也成为了推动社会进步的重要…