20221221 9. Volume

Secret

Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret 可以以 Volume 或者环境变量的方式使用 。

Secret 有三种类型:

  • Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。

  • Opaque :base64编码格式的Secret,用来存储密码、密钥等

  • kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息

Service Account

Service Account 简称 sa , Service Account 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

目录下包含三个文件

  • ca.crt

  • namespace

  • token

Opaque Secret

Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式。

加密、解密

使用命令行方式对需要加密的字符串进行加密。例如 mysql 数据库的密码

# 对admin字符串进行base64加密:获得admin的加密字符串"YWRtaW4="
echo -n "admin" | base64

# base64解密:对加密后的字符串进行解密
echo -n "YWRtaW4=" | base64 -d

示例

apiVersion: v1
kind: Secret
metadata:
  name: mariadbsecret
type: Opaque
data:
  password: YWRtaW4=

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mariadb-deploy
  labels:
    app: mariadb-deploy
spec:
  replicas: 1
  template:
    metadata:
      name: mariadb-deploy
      labels:
        app: mariadb-deploy
    spec:
      containers:
        - name: mariadb-deploy
          image: mariadb:10.5.2
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              #这是mysqlroot用户的密码
              valueFrom:
                secretKeyRef:
                  key: password
                  name: mariadbsecret
            - name: TZ
              value: Asia/Shanghai
          args:
            - "--character-set-server=utf8mb4"
            - "--collation-server=utf8mb4_unicode_ci"
      restartPolicy: Always
  selector:
    matchLabels:
      app: mariadb-deploy

---
apiVersion: v1
kind: Service
metadata:
  name: mariadb-svc
spec:
  selector:
    app: mariadb-deploy
  ports:
    - port: 3306
      targetPort: 3306
      nodePort: 30336
  type: NodePort

ConfigMap

ConfigMap 顾名思义,是用于保存配置数据的键值对,可以用来保存单个属性,也可以保存配置文件。

ConfigMap 允许你将配置构件与映像内容解耦,以保持容器化应用程序的可移植性。

ConfigMap 可以从文件、目录或者 key-value 字符串创建等创建 ConfigMap 。也可以通过 kubectl create -f 从描述文件创建。可以使用 kubectl create 创建命令。

创建ConfigMap的方式有4种:

  1. 直接在命令行中指定 ConfigMap 参数创建,即 --from-literal

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

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

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

命令行方式

从key-value字符串创建,官方翻译是从字面值中创建ConfigMap

kubectl create configmap map的名字 --from-literal=key=value

# 如果有多个key,value。可以继续在后边写
kubectl create configmap map的名字
--from-literal=key1=value1
--from-literal=key2=value2
--from-literal=key3=value4
# 创建configmap
kubectl create configmap helloconfigmap --from-literal=lagou.hello=world

# 查看configmap
kubectl get configmap helloconfigmap -o go-template='{{.data}}'

在使用kubectl get获取资源信息的时候,可以通过 -o (--output 简写形式) 指定信息输出的格式,如果指定的是yaml或者json输出的是资源的完整信息,实际工作中,输出内容过少则得不到我们想要的信息,输 出内容过于详细又不利于快速定位的我们想要找到的内容。

其实-o输出格式可以指定为go-template ,然后指定一个template,这样我们就可以通过go-template获取我们想要的内容。go-template与 kubernetes无关,它是go语言内置的一种模板引擎。这里不对go-template做过多解释,仅介绍在 kubernetes中获取资源常用的语法

配置文件方式

# 语法规则如下:当 --from-file指向一文件,key的名称是文件名称,value的值是这个文件的内容。
kubectl create configmap cumulx-test --from-file=xxxx

jdbc.properties

jdbc.driverclass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=admin
# 创建configmap换用其他方式查看信息
kubectl create configmap myjdbcmap --from-file=jdbc.properties

# 查看configmap详细信息
kubectl describe configmaps myjdbcmap

目录方式

# 语法规则如下:当 --from-file指向一个目录,目录中的每个文件直接用于填充ConfigMap中的key,key的名称是文件名称,value的值是这个文件的内容。下面的命令读取/data目录下的所有文件
kubectl create configmap cumulx-test --from-file=/data/
kubectl create configmap myjdbcconfigmap --from-file=/data/jdbc.properties

# 查看configmap详细信息
kubectl describe configmaps myjdbcmap

资源文件方式

apiVersion: v1
kind: ConfigMap
metadata:
  name: myjdbcconfigmap
data:
  driverclass: com.mysql.jdbc.Driver
  url: jdbc:mysql://localhost:3306/test
  username: root
  password: admin

Volume

hostPath

hostPath类型的存储卷是指将工作节点上某文件系统的目录或文件挂载于Pod中的一种存储卷。把宿主机上的目录挂载到容器,但是在每个节点上都要有,因为不确定容器会分配到哪个节点。也是把存储从宿主机挂载到k8s集群上,但它有许多限制,例如只支持单节点(Node),而且只支持 “ReadWriteOnce” 模式。

指定node节点

kubectl label nodes k8s-node01 mariadb=mariadb

# 查看node节点label值
kubectl get nodes --show-labels

挂载卷

语法:

  1. volumeMounts为containers下级key,containers.volumeMounts 。volumes与containers平级。

  2. containers.volumeMounts.namevolumes.name 值一致。

  3. containers.volumeMounts.mountPath 是容器内目录

  4. volumes.hostPath.path 是宿主机挂载目录

  5. volumes.hostPath.type 值必须为 Directory

containers
  volumeMounts:
    - mountPath: /var/lib/mysql
      name: mariadb-volume

.......

volumes:
  - name: mariadb-volume
    hostPath:
      path: /data/mariadb
      type: Directory

emptyDir

emptyDir存储卷是Pod生命周期中的一个临时目录,在pod对象被移除时会被一并删除,用得很少,例如同一pod内的多个容器间文件共享,或者作为容器数据的临时存储目录用于数据缓存系统等

posted @ 2022-12-22 14:49  流星<。)#)))≦  阅读(17)  评论(0编辑  收藏  举报