Projected Volume: Secret, ConfigMap, Downward API,ServiceAccountToken

104 阅读2分钟

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

Secret

创建一个secret:

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
  namespace: webapps
type: Opaque
data:
  user: YWRtaW4=
  pass: MWYyZDFlMmU2N2Rm

上面的yaml文件创建了一个名为mysecret的Secret,key值有两个,分别是user和pass,value值是经过base64转换的。

在Pod里使用这个Secret:

apiVersion: v1
kind: Pod
metadata:
  name: debug
  namespace: webapps
spec:
  nodeSelector:
    kubernetes.io/hostname: work2
  containers:
    - image: bibinwilson/docker-kubectl:latest
      name: kubectl
  volumeMounts:
    - name: mysql-cred
      mountPath: "/projected-volume"
      readOnly: true
  env:
    - name: MYSQL_USER
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: user
    - name: MYSQL_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: pass
serviceAccountName: app-service-account
volumes:
- name: mysql-cred
  projected:
    sources:
    - secret:
        name: mysecret

看这个yaml文件,可以看出这个pod把secret用在了两个地方,一个是挂载到pod内部的/projected-volume目录里,另一个是映射到pod内部的环境变量里。 我们可以进入到pod里验证下:

screenshot-20230913-164651.png 上图中,红框框就是将secret里的两个值以文件的形式挂载在/projected-volume;黄框框就是以环境变量的形式。

ConfigMap

创建一个configmap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap
  namespace: webapps
data:
  configmap-key: |
    configmap-contents

上面这个yaml文件将创建一个名为myconfigmap的configMap。

在pod里使用这个configMap:

screenshot-20230913-172601.png 然后我们进入到pod里验证下:

screenshot-20230913-172731.png

Downward API

apiVersion: v1
kind: Pod
metadata:
  name: debug
  namespace: webapps
spec:
  nodeSelector:
    kubernetes.io/hostname: work2
  containers:
  - image: bibinwilson/docker-kubectl:latest
    name: kubectl
    volumeMounts:
    - name: mysql-cred
      mountPath: "/projected-volume"
      readOnly: true
    - name: my-configmap
      mountPath: "/projected-volume2"
      readOnly: true
    env:
      - name: MYSQL_USER
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: user
      - name: MYSQL_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: pass
  serviceAccountName: app-service-account
  volumes:
  - name: mysql-cred
    projected:
      sources:
      - secret:
          name: mysecret
  - name: my-configmap
    projected:
      sources:
      - configMap:
          items:
          - key: configmap-key
            path: configmap-key
          name: myconfigmap
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace

我们再来进入pod里验证下:

捕获.PNG

ServiceAccountToken

如何创建serviceaccount前面的文章有讲过了,这里我们简单看看它在pod里是如何存在的,如下图: 捕获.PNG