ConfigMap
ConfigMap 允许您将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性。
你可以使用四种方式来使用 ConfigMap 配置 Pod 中的容器:
- 在容器命令和参数内
- 容器的环境变量
- 在只读卷里面添加一个文件,让应用来读取
- 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap
例子
创建configmap.yaml:
1
apiVersion: v1 kind: ConfigMap metadata: name: game-config namespace: dev 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
1
[root@master ~]# kubectl create -f configmap.yaml configmap/game-config created [root@master ~]# kubectl describe cm game-config -n dev Name: game-config Namespace: dev Labels: <none> Annotations: <none> Data ==== game.properties: ---- enemy.types=aliens,monsters player.maximum-lives=5 player_initial_lives: ---- 3 ui_properties_file_name: ---- user-interface.properties user-interface.properties: ---- color.good=purple color.bad=yellow allow.textmode=true Events: <none>
创建pod-configmap.yaml
1
apiVersion: v1 kind: Pod metadata: name: configmap-game namespace: dev spec: containers: - name: game image: nginx:1.17.1 command: ["sleep", "3600"] env: # 定义环境变量 - name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的 valueFrom: configMapKeyRef: name: game-config # 这个值来自 ConfigMap key: player_initial_lives # 需要取值的键 - name: UI_PROPERTIES_FILE_NAME valueFrom: configMapKeyRef: name: game-config key: ui_properties_file_name volumeMounts: - name: config mountPath: "/config" readOnly: true volumes: # 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中 - name: config configMap: # 提供你想要挂载的 ConfigMap 的名字 name: game-config
如果 Pod 中有多个容器,则每个容器都需要自己的
volumeMounts
块,但针对 每个 ConfigMap,你只需要设置一个spec.volumes
块。1
[root@master ~]# kubectl create -f pod-configmap.yaml pod/configmap-game created [root@master ~]# kubectl get pod configmap-game -n dev NAME READY STATUS RESTARTS AGE configmap-game 1/1 Running 0 33s [root@master ~]# kubectl exec -it configmap-game -n dev /bin/sh # cd config # ls game.properties player_initial_lives ui_properties_file_name user-interface.properties # cat user-interface.properties color.good=purple color.bad=yellow allow.textmode=true
当卷中使用的 ConfigMap 被更新时,所投射的键最终也会被更新。 kubelet 组件会在每次周期性同步时检查所挂载的 ConfigMap 是否为最新。
以环境变量方式使用的 ConfigMap 数据不会被自动更新。 更新这些数据需要重新启动 Pod。
Secret
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。Secrets其用法是跟ConfigMap基本上是一致,区别不同是ConfigMap是明文,而Secrets是经过base64加密过的。
有几种不同的方式来创建 Secret:
- 使用 kubectl 命令创建 Secret
- 使用配置文件来创建 Secret
- 使用 kustomize 来创建 Secret
配置文件创建
数据进行编码
1
[root@master ~]# echo -n 'admin' | base64 YWRtaW4= [root@master ~]# echo -n '123456' | base64 MTIzNDU2
创建secret.yaml
1
apiVersion: v1 kind: Secret metadata: name: secret namespace: dev type: Opaque data: username: YWRtaW4= password: MTIzNDU2
1
[root@master ~]# kubectl create -f secret.yaml secret/secret created [root@master ~]# kubectl describe secret secret -n dev Name: secret Namespace: dev Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 6 bytes username: 5 bytes
环境变量引用
创建secretenv.yaml
1 | apiVersion: v1 kind: Pod metadata: name: secret-pod namespace: dev spec: containers: - name: mycontainer image: nginx:1.17.1 env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: secret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: secret key: password restartPolicy: Never |
1 | [root@master ~]# vi secretenv.yaml [root@master ~]# kubectl create -f secretenv.yaml pod/secret-pod created [root@master ~]# kubectl get pod secret-pod -n dev NAME READY STATUS RESTARTS AGE secret-pod 1/1 Running 0 4s [root@master ~]# kubectl exec -it secret-pod -n dev /bin/sh # echo $SECRET_USERNAME admin # echo $SECRET_PASSWORD 123456 |