一、总览

Kubernetes 目前支持多达 28 种数据卷类型(其中大部分特定于具体的云环境如 GCE/AWS/Azure 等),如需查阅所有的数据卷类型,请查阅 Kubernetes 官方文档 Volumes 。如:

  • 非持久性存储
    • emptyDir
    • HostPath
  • 网络连接性存储
    • SAN:iSCSI、ScaleIO Volumes、FC (Fibre Channel)
    • NFS:nfs,cfs
  • 分布式存储
    • Glusterfs
    • RBD (Ceph Block Device)
    • CephFS
    • Portworx Volumes
    • Quobyte Volumes
  • 云端存储
    • GCEPersistentDisk
    • AWSElasticBlockStore
    • AzureFile
    • AzureDisk
    • Cinder (OpenStack block storage)
    • VsphereVolume
    • StorageOS
  • 自定义存储
    • FlexVolume

二、配置

配置最佳实战:

  • 云原生 应用12要素 中,提出了配置分离。https://www.kdocs.cn/view/l/skIUQnbIc6cJ
  • 在推送到集群之前,配置文件应存储在版本控制中。 这允许您在必要时快速回滚配置更改。 它还有助于集群重新创建和恢复。
  • 使用 YAML 而不是 JSON 编写配置文件。虽然这些格式几乎可以在所有场景中互换使用,但 YAML 往往更加用户友好。
  • 建议相关对象分组到一个文件。比如 guestbook-all-in-one.yaml
  • 除非必要,否则不指定默认值:简单的最小配置会降低错误的可能性。
  • 将对象描述放在注释中,以便更好地进行内省。

1、Secret

  • Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。
  • Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。用户可以创建 Secret,同时系统也创建了一些 Secret。

1、Pod如何引用

要使用 Secret,Pod 需要引用 Secret。 Pod 可以用三种方式之一来使用 Secret:

Secret 对象的名称必须是合法的 DNS 子域名。 在为创建 Secret 编写配置文件时,你可以设置 data 与/或 stringData 字段。 datastringData 字段都是可选的。data 字段中所有键值都必须是 base64 编码的字符串。如果不希望执行这种 base64 字符串的转换操作,你可以选择设置 stringData 字段,其中可以使用任何字符串作为其取值。

2、创建Secret

  1. ## 命令行
  2. #### 1、使用基本字符串
  3. kubectl create secret generic dev-db-secret \
  4. --from-literal=username=devuser \
  5. --from-literal=password='S!B\*d$zDsb='
  6. ## 参照以下yaml
  7. apiVersion: v1
  8. kind: Secret
  9. metadata:
  10. name: dev-db-secret
  11. data:
  12. password: UyFCXCpkJHpEc2I9 ## base64编码了一下
  13. username: ZGV2dXNlcg==
  14. #### 2、使用文件内容
  15. echo -n 'admin' > ./username.txt
  16. echo -n '1f2d1e2e67df' > ./password.txt
  17. kubectl create secret generic db-user-pass \
  18. --from-file=./username.txt \
  19. --from-file=./password.txt
  20. # 默认密钥名称是文件名。 你可以选择使用 --from-file=[key=]source 来设置密钥名称。如下
  21. kubectl create secret generic db-user-pass-02 \
  22. --from-file=un=./username.txt \
  23. --from-file=pd=./password.txt
  • 获取Secret内容

kubectl get secret dev-db-secret -o jsonpath=’{.data}’

3、使用Secret

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: secret-env-pod
  5. spec:
  6. containers:
  7. - name: mycontainer
  8. image: redis
  9. env:
  10. - name: SECRET_USERNAME
  11. valueFrom:
  12. secretKeyRef:
  13. name: mysecret
  14. key: username
  15. - name: SECRET_PASSWORD
  16. valueFrom:
  17. secretKeyRef:
  18. name: mysecret
  19. key: password
  20. restartPolicy: Never
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: mypod
  5. spec:
  6. containers:
  7. - name: mypod
  8. image: redis
  9. volumeMounts:
  10. - name: foo
  11. mountPath: "/etc/foo"
  12. readOnly: true
  13. volumes:
  14. - name: foo
  15. secret:
  16. secretName: mysecret

2、ConfigMap

  • ConfigMap 来将你的配置数据和应用程序代码分开。
  • ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: game-demo
    5. data:
    6. # 类属性键;每一个键都映射到一个简单的值
    7. player_initial_lives: "3"
    8. ui_properties_file_name: "user-interface.properties"
    9. # 类文件键
    10. game.properties: |
    11. enemy.types=aliens,monsters
    12. player.maximum-lives=5
    13. user-interface.properties: |
    14. color.good=purple
    15. color.bad=yellow
    16. allow.textmode=true

    你可以使用四种方式来使用 ConfigMap 配置 Pod 中的容器:

  1. 在容器命令和参数内
  2. 容器的环境变量
  3. 在只读卷里面添加一个文件,让应用来读取
  4. 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: configmap-demo-pod
    5. spec:
    6. containers:
    7. - name: demo
    8. image: alpine
    9. command: ["sleep", "3600"]
    10. env:
    11. # 定义环境变量
    12. - name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的
    13. valueFrom:
    14. configMapKeyRef:
    15. name: game-demo # 这个值来自 ConfigMap
    16. key: player_initial_lives # 需要取值的键
    17. - name: UI_PROPERTIES_FILE_NAME
    18. valueFrom:
    19. configMapKeyRef:
    20. name: game-demo
    21. key: ui_properties_file_name
    22. volumeMounts:
    23. - name: config
    24. mountPath: "/config"
    25. readOnly: true
    26. volumes:
    27. # 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中
    28. - name: config
    29. configMap:
    30. # 提供你想要挂载的 ConfigMap 的名字
    31. name: game-demo
    32. # 来自 ConfigMap 的一组键,将被创建为文件
    33. items:
    34. - key: "game.properties"
    35. path: "game.properties"
    36. - key: "user-interface.properties"
    37. path: "user-interface.properties"
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: mypod
  5. spec:
  6. containers:
  7. - name: mypod
  8. image: redis
  9. volumeMounts:
  10. - name: foo
  11. mountPath: "/etc/foo"
  12. readOnly: true
  13. volumes:
  14. - name: foo
  15. configMap:
  16. name: myconfigmap