ConfigMap
基础理论
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到健值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap 将您的环境配置信息和 容器镜像 解耦,便于应用配置的修改。
注意:ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret, 或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap。
使用 ConfigMap 来将你的配置数据和应用程序代码分开。
ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。
创建ConfigMap
创建ConfigMap
[root@clientvm ~]# kubectl create configmap -hUsage:kubectl create configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run=server|client|none][options]Examples:# Create a new configmap named my-config based on folder barkubectl create configmap my-config --from-file=path/to/bar# Create a new configmap named my-config with specified keys instead of file basenames on diskkubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt# Create a new configmap named my-config with key1=config1 and key2=config2kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2# Create a new configmap named my-config from the key=value pairs in the filekubectl create configmap my-config --from-file=path/to/bar# Create a new configmap named my-config from an env filekubectl create configmap my-config --from-env-file=path/to/bar.env
从配置文件创建
[root@clientvm ~]# kubectl create configmap haproxy --from-file=/etc/haproxy/haproxy.cfgconfigmap/haproxy created[root@clientvm ~]# kubectl describe configmaps haproxyName: haproxyNamespace: defaultLabels: <none>Annotations: <none>Data====haproxy.cfg:......
kubectl create configmap my-config --from-literal=db_name=wordpress --from-literal=db_user=redhat
使用configMap
通过容器的环境变量使用ConfigMap
[root@clientvm ~]# cat configmap-env-pod.yamlapiVersion: v1kind: Podmetadata:name: test-pod-envspec:containers:- name: test-containerimage: busyboximagePullPolicy: IfNotPresentcommand: [ "/bin/sh", "-c", "env" ]env:- name: DB_USERvalueFrom:configMapKeyRef:name: my-configkey: db_user- name: DB_NAMEvalueFrom:configMapKeyRef:name: my-configkey: db_namerestartPolicy: Never
[root@clientvm ~]# kubectl apply -f configmap-env-pod.yamlpod/test-pod-env created[root@clientvm ~]# kubectl get podNAME READY STATUS RESTARTS AGEtest-pod-env 0/1 Completed 0 23s[root@clientvm ~]# kubectl logs test-pod-env | grep DBDB_NAME=wordpressDB_USER=redhat
将 ConfigMap 以卷的形式进行挂载的 Pod 示例:
[root@clientvm ~]# cat configmap-file-pod.yamlapiVersion: v1kind: Podmetadata:name: mypod-configmap-filespec:containers:- name: mypodimage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: foomountPath: "/mnt/conf"readOnly: truevolumes:- name: fooconfigMap:name: haproxy
[root@clientvm ~]# kubectl get podNAME READY STATUS RESTARTS AGEmypod-configmap-file 1/1 Running 0 4s[root@clientvm ~]# kubectl exec mypod-configmap-file -it -- bashroot@mypod-configmap-file:/# ls /mnt/conf/haproxy.cfg
Secret
基础理论
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。
要使用 Secret,Pod 需要引用 Secret。 Pod 可以用三种方式之一来使用 Secret:
- 作为挂载到一个或多个容器上的 卷 中的文件。
- 作为容器的环境变量
- 由 kubelet 在为 Pod 拉取镜像时使用
创建generic Secret
[root@clientvm ~]# kubectl create secret -hCreate a secret using specified subcommand.Available Commands:docker-registry Create a secret for use with a Docker registrygeneric Create a secret from a local file, directory or literal valuetls Create a TLS secretUsage:kubectl create secret [flags] [options]
[root@clientvm ~]# echo root>username.txt[root@clientvm ~]# echo redhat>password.txt[root@clientvm ~]# kubectl create secret generic my-secret1 --from-file=username.txt --from-file=password.txtsecret/my-secret1 created[root@clientvm ~]# kubectl describe secrets my-secret1Name: my-secret1Namespace: defaultLabels: <none>Annotations: <none>Type: OpaqueData====password.txt: 7 bytesusername.txt: 5 bytes
[root@clientvm ~]# kubectl create secret generic my-secret2 --from-file=user=username.txt --from-file=passwd=password.txtsecret/my-secret2 created[root@clientvm ~]# kubectl describe secrets my-secret2Name: my-secret2Namespace: defaultLabels: <none>Annotations: <none>Type: OpaqueData====passwd: 7 bytesuser: 5 bytes
[root@clientvm ~]# kubectl create secret generic my-secret3 --from-literal=user=root --from-literal=passwd='redhat'secret/my-secret3 created[root@clientvm ~]# kubectl edit secrets my-secret3......apiVersion: v1data:passwd: cmVkaGF0user: cm9vdA==kind: Secret......[root@clientvm ~]# echo cmVkaGF0 |base64 --decoderedhat
创建docker-registry Secret
kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER--docker-password=DOCKER_PASSWORD
apiVersion: v1kind: Podmetadata:name: private-regspec:containers:- name: private-reg-containerimage: <your-private-image>imagePullSecrets:- name: my-secret
创建TLS Secret
kubectl create secret tls my-tls-secret --cert=path/to/cert/file --key=path/to/key/file
apiVersion: v1kind: Podmetadata:name: mynginxspec:containers:- name: mypodimage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: foomountPath: "/etc/nginx/ssl"readOnly: truevolumes:- name: foosecret:secretName: my-tls-secret
使用Secret
以环境变量方式使用secret
[root@clientvm ~]# cat secret-env-pod.yamlapiVersion: v1kind: Podmetadata:name: secret-test-pod-envspec:containers:- name: test-containerimage: busyboximagePullPolicy: IfNotPresentcommand: [ "/bin/sh", "-c", "env" ]envFrom:- secretRef:name: my-secret3restartPolicy: Never[root@clientvm ~]# kubectl apply -f secret-env-pod.yamlpod/secret-test-pod-env created[root@clientvm ~]# kubectl get podNAME READY STATUS RESTARTS AGEsecret-test-pod-env 0/1 Completed 0 8s[root@clientvm ~]# kubectl logs secret-test-pod-envuser=rootpasswd=redhat
已卷形式挂载Secret
[root@clientvm ~]# cat secret-env-volume.yamlapiVersion: v1kind: Podmetadata:name: test-pod-secret-volumespec:containers:- name: mypodimage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: foomountPath: "/mnt/aaa"readOnly: truevolumes:- name: foosecret:secretName: my-secret1[root@clientvm ~]# kubectl apply -f secret-env-volume.yamlpod/test-pod-secret-volume created[root@clientvm ~]# kubectl exec test-pod-secret-volume -it -- bashroot@test-pod-secret-volume:/# cat /mnt/aaa/username.txtrootroot@test-pod-secret-volume:/# cat /mnt/aaa/password.txtredhat
