
k8s使用ConfigMap和Secret示例
1.Configmap存储配置文件
应用场景:应用程序配置,将配置数据和应用程序代码分开
创建ConfigMap后,数据实际会存储在k8s中Etcd,然后通过创建Pod时引用该数据
Pod使用ConfigMap数据有两种方式
- 变量注入
- 数据卷挂载
两种数据类型:
- 键值
- 多行数据
ConfigMap在设计上不是用来保持大量数据的,在ConfigMap中保存的数据不可超过1Mib
2.ConfigMaps和Pods
Pod和ConfigMap必须要在同一个命名空间中
1.创建一个ConfigMap
# 类属性键 apiVersion: v1 kind: ConfigMap metadata: name: game-key-value data: player-initial_lives: "3" ui_properties_file_name: "user-initerface.properties"# 类文件键 apiVersion: v1 kind: ConfigMap metadata: name: game-key-value data: game.properties: enemy.types=aliens,monsters player.maxumum-lives=5 user-interface.properties: | color.good=purple color.bad=yellow allow.textmode=true2.创建一个Pod
四种方式使用ConfigMap
- 在容器命令和参数内
- 容器的环境变量
- 在只读卷里面添加一个文件,让应用来读
- 编写代码在Pod中运行,使用Kubernetes API来读取ConfigMap
apiVersion: v1 kind: Pod metadata: name: configmap-demo-pod spec: containers: - name: demo image: alpine command: ["sleep", "3600"] env: # 定义环境变量 - name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的 valueFrom: configMapKeyRef: name: game-demo # 这个值来自 ConfigMap key: player_initial_lives # 需要取值的键 - name: UI_PROPERTIES_FILE_NAME valueFrom: configMapKeyRef: name: game-demo key: ui_properties_file_name volumeMounts: - name: config mountPath: "/config" readOnly: true volumes: # 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中 - name: config configMap: # 提供你想要挂载的 ConfigMap 的名字 name: game-demo # 来自 ConfigMap 的一组键,将被创建为文件 items: - key: "game.properties" path: "game.properties" - key: "user-interface.properties" path: "user-interface.properties" --- apiVersion: v1 kind: ConfigMap metadata: name: game-demo data: # 类属性键;每一个键都映射到一个简单的值 player_initial_lives: "3" ui_properties_file_name: "user-interface.properties" # 类文件键 game.properties: | enemy.types=aliens,monsters player.maximum-lives=5 user-interface.properties: | color.good=purple color.bad=yellow allow.textmode=true定义了一个卷并将它作为
/config文件夹挂载到demo容器内, 创建两个文件,/config/game.properties和/config/user-interface.properties, 尽管 ConfigMap 中包含了四个键。 这是因为 Pod 定义中在volumes节指定了一个items数组。 如果你完全忽略items数组,则 ConfigMap 中的每个键都会变成一个与 该键同名的文件,因此你会得到四个文
3.使用ConfigMap
ConfigMap 可以作为数据卷挂载,在Pod中将ConfigMap当作文件使用
- 创建一个 ConfigMap 对象或者使用现有的 ConfigMap 对象。多个 Pod 可以引用同一个 ConfigMap。
- 更改你的镜像或者命令行,以便程序能够从该目录中查找文件。ConfigMap 中的每个
data键会变成mountPath下面的一个文件名ConfigMap 以卷的形式进行挂载 Pod的yaml
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: redis volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo configMap: name: myconfigmap被挂载的 ConfigMap 内容会被自动更新
4.基于目录创建 ConfigMap
使用
kubectl create configmap基于同一目录中的多个文件创建 ConfigMap# 创建本地目录 mkdir -p configure-pod-container/configmap/ # 将实例文件下载到 `configure-pod-container/configmap/` 目录 wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties # 创建 configmap kubectl create configmap game-config --from-file=configure-pod-container/configmap/查看内容kubectl get configmaps game-config -o yaml
apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: 2016-02-18T18:52:05Z name: game-config namespace: default resourceVersion: "516" selfLink: /api/v1/namespaces/default/configmaps/game-config uid: b4952dc3-d670-11e5-8cd0-68f728db1985 data: game.properties: | enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 ui.properties: | color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice.
5.基于文件创建 ConfigMap
使用
kubectl create configmap基于单个文件或多个文件创建 ConfigMap# 单个文件 kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties # 多个文件 kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.properties.
6.定义从文件创建 ConfigMap 时要使用的键
<my-key-name>是你要在 ConfigMap 中使用的键名,<path-to-file>是你想要键表示数据源文件的位置kubectl create configmap game-config-3 --from-file=game-special-key=configure-pod-container/configmap/game.properties查看configmap
apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: 2016-02-18T18:54:22Z name: game-config-3 namespace: default resourceVersion: "530" selfLink: /api/v1/namespaces/default/configmaps/game-config-3 uid: 05f8da22-d671-11e5-8cd0-68f728db1985 data: game-special-key: | enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30.
7.Secret存储敏感数据
Secret主要存储敏感数据,所有的数据要经过bsae64编码
应用场景:凭据
kubectl create secret支持三种数据类型:
- docker-registry:存储镜像仓库认证信息
- generic:密码
- tls:存储证书,例从文件、目录或者字符串创建,例如存储用户名如HTTPS证书
Pod可以用三种方式来使用Secret:
- 作为挂载到一个或多个容器上的卷中文件
- 由k8s在为Pod拉取镜像时使用
- 作为容器的环境bian liang
支持的类型,针对这些类型,Kubernetes 所执行的合法性检查操作以及对其所实施的限制各不相同。
内置类型 用法 Opaque用户定义的任意数据 kubernetes.io/service-account-token服务账号令牌 kubernetes.io/dockercfg~/.dockercfg文件的序列化形式kubernetes.io/dockerconfigjson~/.docker/config.json文件的序列化形式kubernetes.io/basic-auth用于基本身份认证的凭据 kubernetes.io/ssh-auth用于 SSH 身份认证的凭据 kubernetes.io/tls用于 TLS 客户端或者服务器端的数据 bootstrap.kubernetes.io/token启动引导令牌数据 通过为 Secret 对象的
type字段设置一个非空的字符串值,你也可以定义并使用自己 Secret 类型。如果type值为空字符串,则被视为Opaque类型。 Kubernetes 并不对类型的名称作任何限制。不过,如果你要使用内置类型之一, 则你必须满足为该类型所定义的所有要求。
8.创建Secret
创建一个空的
Opaque类型 Secret 对象kubectl create secret generic empty-secret1.基本身份认证 Secret
键值都是 base64 编码的字符串。
也可以在创建 Secret 时使用
stringData字段来提供明文形式的内容#echo "admin" | base64 YWRtaW4K #echo "YWRtaW4K" | base64 -d adminapiVersion: v1 kind: Secret metadata: name: secret-basic-auth type: kubernetes.io/basic-auth stringData: username: admin password: t0p-Secret2.SSH 身份认证 Secret
apiVersion: v1 kind: Secret metadata: name: secret-ssh-auth type: kubernetes.io/ssh-auth data: # 此例中的实际数据被截断 ssh-privatekey: | MIIEpQIBAAKCAQEAulqb/Y ...3.TLS Secret
apiVersion: v1 kind: Secret metadata: name: secret-tls type: kubernetes.io/tls data: # 此例中的数据被截断 tls.crt: | MIIC2DCCAcCgAwIBAgIBATANBgkqh ... tls.key: | MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...使用
kubectl来创建 TLS Secret Lkubectl create secret tls my-tls-secret \ --cert=path/to/cert/file \ --key=path/to/key/file4.启动引导令牌 Secret
清单文件形式
apiVersion: v1 kind: Secret metadata: name: bootstrap-token-5emitj namespace: kube-system type: bootstrap.kubernetes.io/token data: auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4= expiration: MjAyMC0wOS0xM1QwNDozOToxMFo= token-id: NWVtaXRq token-secret: a3E0Z2lodnN6emduMXAwcg== usage-bootstrap-authentication: dHJ1ZQ== usage-bootstrap-signing: dHJ1ZQ==.
9.存储方式使用 Secret
多个 Pod 可以引用同一个 Secret
# 全部映射 apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: redis volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: mysecret控制 Secret 键名在存储卷中映射的的路径
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: redis volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: mysecret items: - key: username path: my-group/my-username.
10.环境变量方式使用Secret
使用来自环境变量中的 Secret 值
apiVersion: v1 kind: Pod metadata: name: secret-env-pod spec: containers: - name: mycontainer image: redis env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password restartPolicy: Never.
11.包含 SSH 密钥的 Pod
创建一个包含 SSH 密钥的 Secret:
kubectl create secret generic ssh-key-secret \ --from-file=ssh-privatekey=/path/to/.ssh/id_rsa \ --from-file=ssh-publickey=/path/to/.ssh/id_rsa.pub现在我们可以创建一个 Pod,令其引用包含 SSH 密钥的 Secret,并通过存储卷来使用它:
apiVersion: v1 kind: Pod metadata: name: secret-test-pod labels: name: secret-test spec: volumes: - name: secret-volume secret: secretName: ssh-key-secret containers: - name: ssh-test-container image: mySshImage volumeMounts: - name: secret-volume readOnly: true mountPath: "/etc/secret-volume"容器中的命令运行时,密钥的片段可以在以下目录找到:
/etc/secret-volume/ssh-publickey /etc/secret-volume/ssh-privatekey然后容器可以自由使用 Secret 数据建立一个 SSH 连接。
12.镜像仓库认证
将镜像仓库认证凭据保存在k8s Secret中
kubectl create secret docker-registry registry-auth --docker-username=admin --dcoker-password=Harbor12345 --docker-server=192.168.122.70在yaml中使用这个认证凭据
kubectl create secret docker-registry registry-auth --docker-username=admin --docker-password=Harbor12345 --docker-server=192.168.122.70.