ConfigMap
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
configMap 使用
使用 kubectl 管理 ConfigMap
$ kubectl create configmap configmapname --from-literal=key=value
# 获取整个configmap 数据
$ kubectl get configmap configmapname -o go-template='{{.data}}'
# 查看详情
$ kubectl describe configmap configmapname
# 获取具体某个key值
$ kubectl get configmap configmapname -o go-template='{{.data.key}}'
# 删除
$ kubectl delete configmap configmapname
# 再查看
$ kubectl get configmap configmapname
# 通过文件创建ConfigMap
$ echo hello > test1.txt
$ ehco world > test2.txt
$ kubectl create configmap my-config --from-file=key1=test1.txt --from-file=key2=test2.txt
$ kubectl describe configmap my-config
使用配置文件管理 ConfigMap
configmap.yaml
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
pod.yaml
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"
上面的例子定义了一个卷并将它作为 /config
文件夹挂载到 demo
容器内, 创建两个文件,/config/game.properties
和 /config/user-interface.properties
.
secret
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。
Secret 类似于 ConfigMap,专门用于保存机密数据。
Secret 的使用
使用 kubectl 管理 Secret
echo -n 'admin' > ./username.txt
echo -n '1f2d1e2e67df' > ./password.txt
使用 kubectl create secret
创建
kubectl 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 \
--from-file=username=./username.txt \
--from-file=password=./password.txt
还可以使用 --from-literal=<key>=<value>
标签提供 Secret 数据。
特殊字符(、
\`。 最简便的方法使用单引号括起来
查看 Secret
$ kubectl get secrets
NAME TYPE DATA AGE
db-user-pass Opaque 2 51s
查看 Secret 的描述:
$ kubectl describe secrets/db-user-pass
解码 Secret
$ kubectl get secret db-user-pass -o jsonpath='{.data}'
{"password":"MWYyZDFlMmU2N2Rm","username":"YWRtaW4="}
# 解码 password 的数据
$ echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
1f2d1e2e67df
# 避免在 shell 历史记录中存储 Secret 的编码值,可以执行如下命令:
$ kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
1f2d1e2e67df
清理 Secret
$ kubectl delete secret db-user-pass
使用配置文件管理 Secret
1.将字符串转换为 base64
$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
2.创建 secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
3.使用 kubectl apply
创建 Secret
$ kubectl apply -f secret.yaml
imagePullSecret:Pod 拉取私有镜像仓库时使用的账户信息,会传递给 kubelet,然后 kubelet 就可以拉取仓库里的镜像。
创建一个docker registry 的 secret
$ kubectl create secret docker-registry <name> --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAI
subPath
解决目录覆盖问题
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-nginx
spec:
selector:
matchLabels:
app: demo-nginx
template:
metadata:
labels:
app: demo-nginx
spec:
containers:
- name: demo-nginx
image: nginx
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/nginx.conf
subPath: etc/nginx/nginx.conf
volumes:
- name: config-volume
configMap:
name: nginx-conf
items:
- key: nginx-conf
path: etc/nginx/nginx.conf
$ kubectl create cm nginx-conf --from-file=nginx.conf
热更新
更新方式:edit、create
edit 更新
$ kubectl edit cm nginx-conf
ConfigMap 和 Secret 如果是以subPath 的形式挂载的,那么 Pod 是不会感知到 ConfigMap 和 Secret 更新的。
如果 Pod 的变量来自于 ConfigMap 和 Secret 中定义的内容,那么 ConfigMap 和 Secret 更新后,也不会更新 Pod 的变量。
create 更新
$ kubectl create cm nginx-conf --from-file=nginx.conf --dry-run -oyaml | kubectl replace -f-
不可变
安全配置
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp
data:
key: value
immutable:true
网友评论