Kubernetes 系统化学习之 持久存储篇(五)

本文介绍Kubernetes中的存储管理,涵盖ConfigMap与Secret的创建及使用、Volume类型详解,包括emptyDir、hostPath与NFS存储卷,以及PV、PVC的概念和使用案例。

1. ConfigMap

ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。

ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret, 或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap。

  • ConfigMap 的名字必须是一个合法的 DNS 子域名。

ConfigMap 创建的4种方式

注意:此处我们用到的例子中的 cm1, cm2, cm3, cm4 后续例子中也会引用到。

这里先给出几个查看 configmap 的命令:

# 查看 configmap 列表
kubectl get cm
# 查看某个 configmap 内容
kubectl describe cm cm1
复制代码
  1. 通过直接在命令行中指定configmap参数创建,即(--from-literal=key=value):
kubectl create configmap cm1 --from-literal=host=127.0.0.1 --from-literal=port=3306
复制代码
  1. 通过指定文件创建,即(--from-file=file):
echo -n 127.0.0.1 > host
echo -n 3306 > port
复制代码
kubectl create configmap cm2 --from-file=./host --from-file=./port
复制代码
  1. 通过一个文件内多个键值对,即(--from-env-file=file):
vim env.txt
复制代码
host=127.0.0.1
port=3306
复制代码
kubectl create configmap cm3 --from-env-file=env.txt
复制代码
  1. 通过 YMAL 文件创建(推荐使用):
vim cm4.yml
复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm4
data:
  host: 127.0.0.1
  port: "3306"
复制代码
kubectl apply -f cm4.yml
复制代码

ConfigMap 的2种使用方式

  1. 通过环境变量的方式传递给 pod
vim pod-cm1.yml
复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm1
spec:
  containers:
  - name: mysql-pod
    image: mysql:5.7
    args: [ "/bin/sh", "-c", "sleep 10000" ]
    envFrom:							# env方式
    - configMapRef:
        name: cm1						# configmap名称
复制代码
kubectl apply -f pod-cm1.yml
kubectl exec pod-cm1 --env
复制代码
  1. 通过 volume 的方式挂载到 pod 内
vim pod-cm2.yml
复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm2
spec:
  containers:
  - name: mysql-pod
    image: mysql:5.7
    args: [ "/bin/sh", "-c", "sleep 10000" ]
    volumeMounts:                               # 用volume挂载方式
    - name: vol-cm                              # 对应下面的volume名
      mountPath: "/etc/mysql"                   # 挂载到容器内部的路径
      readOnly: true                            # 只读

  volumes:
  - name: vol-cm                                # 卷名称
    configMap:
      name: cm2                                 # configmap的名称
复制代码
kubectl apply -f pod-cm2.yml
kubectl exec pod-cm2 – cat /etc/mysql/host
kubectl exec pod-cm2 – cat /etc/mysql/port
复制代码

使用 subpath 参数覆盖文件

cat index.html(内容是 ABCDEFG)
复制代码
kubectl create configmap nginx-index --from-file=index.html
复制代码
vim subpath-cm.yaml
复制代码
apiVersion: v1
kind: Pod
metadata:
  name: subpath-cm
spec:
  containers:
  - name: c1
    image: nginx:1.17.1-alpine
    volumeMounts:
    - name: nginx-config
      mountPath: /usr/share/nginx/html/index.html	# configmap要挂载并覆盖的绝对路径
      subPath: index.html				# 这里要写相对路径

  volumes:
  - name: nginx-config
    configMap:
      name: nginx-index					# 对应上面创建的configmap
复制代码
kubectl apply -f subpath-cm.yaml
复制代码

此时 nginx 的首页内容就已经被覆盖成了“ABCDEFG”。

ConfigMap 的热更新

  • 通过环境变量的方式传递给 pod,这种方式不会热更新。
  • 通过 volume 的方式挂载到 pod 内。这种方式会热更新, 大概需要半分钟左右
  • 但是使用 subpath 挂载文件,这种方式也不能热更新。

我们现在就来验证这种方式:

kubectl edit cm cm2
复制代码
apiVersion: v1
da
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值