将资源对象映射为存储卷

在Kubernetes中有一些资源对象可以以存储卷的形式挂载为容器内的目录或者文件,目前包括ConfigMap、Secret、DownwardAPI、ServiceAccountToken、Project Volume

一、ConfigMap

ConfigMap主要保存应用程序所需要的配置文件,并且通过Volume形式挂载到容器内的文件系统中,供容器内的应用程序读取。

例如,一个包含两个配置文件的ConfigMap资源如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-appconfigfiles
data:
  key-serverxml: |
    <?xml version='1.0' encoding='utf-8'?>
    ......
  key-loggingproperties: "handlers
    ......
    = 4host-manager.org.apache.juli.FileHandler\r\n\r\n"

    在Pod的YAML配置中,可以将ConfigMap设置为一个Volume,然后在容器中通过VolumeMounts将ConfigMap类型的Volume挂载到/config目录下:

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-app
spec:
  containers:
  - name: cm-test-app
    image: kubeguide/tomcat-app:v1
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: serverxml
      mountPath: /configfiles
  volumes:
  - name: serverxml
    configMap:
      name: cm-appconfigfiles
      items:
      - key: key-serverxml
        path: server.xml
      - key: key-loggingproperties
        path: logging.properties

    在Pod成功创建之后,进入容器内部查看在/config目录下有两个文件

 

 ConfigMap中的配置内容如果是UTF-8编码的字符,则将被系统认为是文本文件,如果是其它字符,则系统将以二进制数据格式进行保存(设置binaryData字段)

二、Secret

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque #
data:
  password: dmFsdWUtMg0K #base64编码
  username: dmFsdWUtMg0K #base64编码
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
  volumes:
  - name: foo
    secret:
      secretName: mysecret

 

三、Downward API

 通过Downward API可以将Pod或Container的某些元数据信息(例如Pod名称、Pod IP、Node IP、Label、 Annotation、容器资源限制等)以文件形式挂载到容器内,供容器内部使用。下面是将Pod的标签通过DownWard API挂载为容器内文件:

apiVersion: v1
kind: Pod
metadata:
  name: downward-api-test
  labels:
    zone: us-est-coast
    cluster: test-cluster
    rack: rack-001
  annotations:
    build: two
    builder: chugao
spec:
  containers:
  - name: client-container
    image: busybox
    command: ["sh", "-c"]
    args:
    - while true; do
      if [[ -e /etc/podinfo/labels ]]; then
        echo -en '\n\n'; cat /etc/podinfo/labels; fi;
      if [[ -e /etc/podinfo/annotations ]]; then
        echo -en '\n\n'; cat /etc/podinfo/annotations; fi;
        sleep 5;
      done;
    volumeMounts:
      - name: podinfo
        mountPath: /etc/podinfo
  volumes:
    - name: podinfo
      downwardAPI:
        items:
        - path: "labels"
          fieldRef:
            fieldPath: metadata.labels
        - path: "annotations"
          fieldRef:
            fieldPath: metadata.annotations

 

 

 

四、Projected Volume和Service Account Token

     Projected Volume是一种特殊的卷类类型,用于将(ConfigMap、Secret、Downward API)一个或多个资源一次性挂载到容器内的同一个目录下。

     如果Pod希望同时挂载ConfigMap、Secret、Downward API,则需要设置不同类型的Volume都挂载为容器内的目录或文件。如果应用程序希望将配置文件和秘钥文件放在容器内的同一个目录下,则通过多个Volume就无法实现。为了支持这种需求,Kubernetes引入了一种新的Projected Volume存储卷类型,用于将多种配置类型数据通过单个Volume挂载到容器内的单个目录下:

   Projected Volume的一些常见的应用场景:

  1. 通过Pod的标签生成的不同的配置文件,需要使用配置文件,以及用户名和密码,这时需要使用3种资源:ConfigMap、Secret、Downward API
  2. 在自动化运维应用中使用配置文件和账号信息时,需要使用ConfigMap、Secret
  3. 在配置文件内使用Pod名称(metadata.name)记录日志时,需要使用ConfigMap、Downward API
  4. 如果某个Secret对Pod所在命名空间(metadata.namespace)进行加密时,需要使用Secret、Downward API

Projected Volume在Pod的Volume定义中类型projected,通过srouces字段设置一个或多个ConfigMap、Sectet、Downward API、ServiceAccountToken资源。各种类型的资源配置内容与单独设置Volume时基本一样,但有两点不同:

  • 对于Secret类型从Volume字段为"secretName"在projected.source.secret中被改为”name"
  • Volume的挂载模式为“defaultMode”仅可以设置在projected级别,对于各子项,仍然可以设置各自的挂载模式,使用字段名为“mode”
    #
    #使用Projected Volume挂载COnfigMap、Sectet、Downward API 三种资源
    #
    apiVersion: v1
    kind: Pod
    metadata:
      name: volume-test
    spec:
      containers:
      - name: container-test
        image: busybox
        volumeMounts:
        - name: all-in-one
          mountPath: "/projected-volume"
          readOnly: true
      volumes:
      - name: all-in-one
        projected:
          sources:
          - secret:
              name: mysecret
              items:
                - key: username
                  path: my-group/my-username
          - downwardAPI:
              items:
                - path: "labels"
                  fieldRef:
                    fieldPath: metadata.labels
                - path: "cpu_limit"
                  resourceFieldRef:
                    containerName: container-test
                    resource: limits.cpu  
          - configMap:
              name: muconfigmap
              items:
                - key: config
                  path: my-group/my-configmap

  使用projected Volume挂载两个Secret资源,其中一个设置为非默认挂载

#
#使用Projected Volume挂载ServiceAccountToken
#
apiVersion: v1
kind: Pod
metadate:
  name: sa-token-test
spec:
  containers:
  - name: container-test
    image: busybox
    volumemounts:
    - name: token-vol
      mountPath: "/service-account"
      readOnly: true
  volumes:
  - name: token-val
    projected:
      sources:
      - serviceAccountToken:
        audience: api
        expirationsSeconds: 3600
        path: token

 

#
#使用projected挂载两个secret并同一个设置挂载模式
#
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: container-test
    image: busybox
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: my-group/my-username
      - secret:
          name: mysecret2
          items:
            - key: passwoed
              path: my-group/my-password
              mode: 0511                       #设置非默认挂载

对于ServiceAccountToken类型为Volume,可以设置Token的audience、expirationsSeconds、path等属性信息

  • audience: 预期受众的名称。Token的接收者必须使用其中的audience标识符来标识自己,否则应该拒绝该Token。该字段是可选的,默认为API Server的标识符“api”
  • expirationsSeconds: Service Account Token的过期时间,默认为1h至少为10min。管理员可以通过kube-apiver的启动参数--service-account-max-token-expiration限制token的最长生效
  • path:挂载目录下的相对路径
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值