一、总览
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:
- 作为挂载到一个或多个容器上的 卷 中的文件。(volume进行挂载)
- 作为容器的环境变量(envFrom字段引用)
- 由 kubelet 在为 Pod 拉取镜像时使用(此时Secret是docker-registry类型的)
Secret 对象的名称必须是合法的 DNS 子域名。 在为创建 Secret 编写配置文件时,你可以设置 data 与/或 stringData 字段。 data 和 stringData 字段都是可选的。data 字段中所有键值都必须是 base64 编码的字符串。如果不希望执行这种 base64 字符串的转换操作,你可以选择设置 stringData 字段,其中可以使用任何字符串作为其取值。
2、创建Secret
## 命令行#### 1、使用基本字符串kubectl create secret generic dev-db-secret \--from-literal=username=devuser \--from-literal=password='S!B\*d$zDsb='## 参照以下yamlapiVersion: v1kind: Secretmetadata:name: dev-db-secretdata:password: UyFCXCpkJHpEc2I9 ## base64编码了一下username: ZGV2dXNlcg==#### 2、使用文件内容echo -n 'admin' > ./username.txtecho -n '1f2d1e2e67df' > ./password.txtkubectl create secret generic db-user-pass \--from-file=./username.txt \--from-file=./password.txt# 默认密钥名称是文件名。 你可以选择使用 --from-file=[key=]source 来设置密钥名称。如下kubectl create secret generic db-user-pass-02 \--from-file=un=./username.txt \--from-file=pd=./password.txt
- 获取Secret内容
kubectl get secret dev-db-secret -o jsonpath=’{.data}’
3、使用Secret
apiVersion: v1kind: Podmetadata:name: secret-env-podspec:containers:- name: mycontainerimage: redisenv:- name: SECRET_USERNAMEvalueFrom:secretKeyRef:name: mysecretkey: username- name: SECRET_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: passwordrestartPolicy: Never
apiVersion: v1kind: Podmetadata:name: mypodspec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"readOnly: truevolumes:- name: foosecret:secretName: mysecret
2、ConfigMap
- ConfigMap 来将你的配置数据和应用程序代码分开。
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
apiVersion: v1kind: ConfigMapmetadata:name: game-demodata:# 类属性键;每一个键都映射到一个简单的值player_initial_lives: "3"ui_properties_file_name: "user-interface.properties"# 类文件键game.properties: |enemy.types=aliens,monstersplayer.maximum-lives=5user-interface.properties: |color.good=purplecolor.bad=yellowallow.textmode=true
你可以使用四种方式来使用 ConfigMap 配置 Pod 中的容器:
- 在容器命令和参数内
- 容器的环境变量
- 在只读卷里面添加一个文件,让应用来读取
- 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap
apiVersion: v1kind: Podmetadata:name: configmap-demo-podspec:containers:- name: demoimage: alpinecommand: ["sleep", "3600"]env:# 定义环境变量- name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的valueFrom:configMapKeyRef:name: game-demo # 这个值来自 ConfigMapkey: player_initial_lives # 需要取值的键- name: UI_PROPERTIES_FILE_NAMEvalueFrom:configMapKeyRef:name: game-demokey: ui_properties_file_namevolumeMounts:- name: configmountPath: "/config"readOnly: truevolumes:# 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中- name: configconfigMap:# 提供你想要挂载的 ConfigMap 的名字name: game-demo# 来自 ConfigMap 的一组键,将被创建为文件items:- key: "game.properties"path: "game.properties"- key: "user-interface.properties"path: "user-interface.properties"
apiVersion: v1kind: Podmetadata:name: mypodspec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"readOnly: truevolumes:- name: fooconfigMap:name: myconfigmap
