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种:
- 
直接在命令行中指定 ConfigMap 参数创建,即
--from-literal - 
指定文件创建,即将一个配置文件创建为一个 ConfigMap,
--from-file=<文件> - 
指定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,
--from-file=<目录> - 
先写好标准的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
挂载卷
语法:
- 
volumeMounts为containers下级key,
containers.volumeMounts。volumes与containers平级。 - 
containers.volumeMounts.name与volumes.name值一致。 - 
containers.volumeMounts.mountPath是容器内目录 - 
volumes.hostPath.path是宿主机挂载目录 - 
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内的多个容器间文件共享,或者作为容器数据的临时存储目录用于数据缓存系统等
                    
                
                
            
        
浙公网安备 33010602011771号