projected

projected позволяет объединить несколько различных источников в одном volume.

Поддерживается объединение:

  • secret
  • downwardAPI
  • configMap
  • serviceAccountToken

Все объединяемые ресурсы должны находится с подом в одном namespace.

Пример secret:

apiVersion: v1
kind: Secret
metadata:
  name: user-password-secret
  namespace: volumes-sample
type: Opaque
data:
  user: YWRtaW51c2VyCg==
  password: YWRtaW5wYXNzd29yZAo=

Пример configMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-txt
  namespace: volumes-sample
data:
  example.txt: |-
    Пример configMap для видео
    на моём канале.
  config.yaml: |-
    any_body:
      params:
        param1: value1
        param2: value2

Пример использования projected:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: openresty
  namespace: volumes-sample
  labels:
    app: openresty
spec:
  replicas: 1
  selector:
    matchLabels:
      app: openresty
  template:
    metadata:
      labels:
        app: openresty
    spec:
      containers:
        - name: openresty
          image: openresty/openresty:centos-rpm
          env:
            - name: NGINX_HOST
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
          resources:
            limits:
              cpu: "0.2"
              memory: "300Mi"
            requests:
              cpu: "0.1"
              memory: "100Mi"
          ports:
            - containerPort: 80
              name: http
              protocol: TCP
          volumeMounts:
            - mountPath: "/etc/pod-data"
              name: all-values
              readOnly: true
      volumes:
        - name: all-values
          projected:
            sources:
              - downwardAPI:
                  items:
                    - path: limits/cpu-millicore
                      resourceFieldRef:
                        containerName: openresty
                        resource: limits.cpu
                        divisor: 1m
                    - path: limits/memory-kibibytes
                      resourceFieldRef:
                        containerName: openresty
                        resource: limits.memory
                        divisor: 1Ki
                    - path: labels
                      fieldRef:
                        fieldPath: metadata.labels
              - secret:
                  name: user-password-secret
                  items:
                    - key: user
                      path: secret/user
                    - key: password
                      path: secret/password
              - configMap:
                  name: example-txt
                  items:
                    - key: example.txt
                      path: configs/example.txt
                    - key: config.yaml
                      path: configs/config.yaml

В примере (выделено синим цветом) в один volume объединяются: downwardAPI, secret и configMap.

При помощи параметра path определяется путь к ресурсу в подключенном volume.

Volume подключаются к точку монтирования /etc/pod-data в режиме только для чтения.

Посмотреть содержимое директории можно подключившись к контейнеру, указав правильное имя пода:

kubectl -n volumes-sample exec openresty-7cd79cfd94-5zjgl \
-i -t -- ls -R /etc/pod-data