ConfigMap 一般用于去存储 Pod 中应用所需的一些配置信息,或者环境变量,将配置于 Pod 分开,避免应为修改配置导致还需要重新构建 镜像与容器。
创建configMap 使用 kubectl create configmap -h
查看示例,构建 configmap
对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Examples: kubectl create configmap my-config --from-file=path/to/bar kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2 kubectl create configmap my-config --from-file=path/to/bar kubectl create configmap my-config --from-env-file=path/to/foo.env --from-env-file=path/to/bar.env
首先准备两个文件
路径:~/k8s/config/test
db.properties
1 2 username =root password =admin
redis.properties
1 2 host : 127.0.0.1 port : 6379
通过文件夹创建 kubectl create configmap test-dir-config --from-file=test/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [root@k8s-master config] Name: test-dir-config Namespace: default Labels: <none> Annotations: <none> Data ==== db.properties: ---- username=root password=admin redis.properties: ---- host: 127.0.0.1 port: 6379 BinaryData ==== Events: <none>
通过文件创建 创建一个app.yml
1 2 3 4 5 spring: application: name: test-app server: port: 8080
kubectl create cm spring-boot-test-yaml --from-file=app.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 kubectl describe cm spring-boot-test-yaml Name: spring-boot-test-yaml Namespace: default Labels: <none> Annotations: <none> Data ==== app.yml: ---- spring: application: name: test-app server: port: 8080 BinaryData ==== Events: <none>
通过key-value创建 kubectl create configmap my-config --from-literal=username=root --from-literal=password=admin
使用configmap 创建pod时使用configmap指定环境变量 方法1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 kubectl create configmap test-env-config --from-literal=JAVA_OPTS_TEST='-Xms512m -Xmx512m' --from-literal=APP_NAME=springboot-env-test kubectl describe configmap/test-env-config Name: test-env-config Namespace: default Labels: <none> Annotations: <none> Data ==== APP_NAME: ---- springboot-env-test JAVA_OPTS_TEST: ---- -Xms512m -Xmx512m BinaryData ==== Events: <none>
创建env-test-pod.yaml
,准备创建pod
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 apiVersion: v1 kind: Pod metadata: name: test-env-pod spec: containers: - name: env-test image: alpine command: ["/bin/sh" ,"-c" ,"env;sleep 3600" ] imagePullPolicy: IfNotPresent env: - name: JAVA_VM_OPTS valueFrom: configMapKeyRef: name: test-env-config key: JAVA_OPTS_TEST - name: APP valueFrom: configMapKeyRef: name: test-env-config key: APP_NAME
创建pod,然后使用logs查看日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 kubectl logs -f test-env-pod KUBERNETES_SERVICE_PORT=443 KUBERNETES_PORT=tcp://10.96.0.1:443 NGINX_SVC_SERVICE_HOST=10.99.241.192 HOSTNAME=test-env-pod NGINX_SVC_EXTERNAL_SERVICE_HOST=10.96.123.27 SHLVL=1 HOME=/root JAVA_VM_OPTS=-Xms512m -Xmx512m NGINX_SVC_SERVICE_PORT=80 NGINX_SVC_PORT=tcp://10.99.241.192:80 NGINX_SVC_EXTERNAL_PORT=tcp://10.96.123.27:80 NGINX_SVC_EXTERNAL_SERVICE_PORT=80 NGINX_SVC_SERVICE_PORT_WEB=80 NGINX_SVC_PORT_80_TCP_ADDR=10.99.241.192 APP=springboot-env-test NGINX_SVC_PORT_80_TCP_PORT=80 NGINX_SVC_EXTERNAL_SERVICE_PORT_WEB=80 NGINX_SVC_PORT_80_TCP_PROTO=tcp NGINX_SVC_EXTERNAL_PORT_80_TCP_ADDR=10.96.123.27 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 PATH=/usr/local /sbin:/usr/local /bin:/usr/sbin:/usr/bin:/sbin:/bin NGINX_SVC_EXTERNAL_PORT_80_TCP_PORT=80 KUBERNETES_PORT_443_TCP_PORT=443 NGINX_SVC_EXTERNAL_PORT_80_TCP_PROTO=tcp KUBERNETES_PORT_443_TCP_PROTO=tcp NGINX_SVC_PORT_80_TCP=tcp://10.99.241.192:80 NGINX_SVC_EXTERNAL_PORT_80_TCP=tcp://10.96.123.27:80 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 KUBERNETES_SERVICE_HOST=10.96.0.1 PWD=/
从打印出的环境变量中可以看到刚才设置的JAVA_VM_OPTS
和APP
都被设置成了和configmap中一样的值
方法2 创建file-test-pod.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 apiVersion: v1 kind: Pod metadata: name: test-configfile-po spec: containers: - name: config-test image: alpine command: ["/bin/sh" ,"-c" ,"sleep 3600" ] imagePullPolicy: IfNotPresent env: - name: JAVA_VM_OPTS valueFrom: configMapKeyRef: name: test-env-config key: JAVA_OPTS_TEST - name: APP valueFrom: configMapKeyRef: name: test-env-config key: APP_NAME volumeMounts: - name: db-config mountPath: "/usr/local/mysql/conf" readOnly: true volumes: - name: db-config configMap: name: test-dir-config items: - key: "db.properties" path: "db.properties"
创建pod,进入容器查看/usr/local/mysql/conf
1 2 3 4 5 6 7 kubectl exec -it test-configfile-po -- sh / /usr/local /mysql/conf db.properties /usr/local /mysql/conf username=root password=admin
Secret 与 ConfigMap 类似,用于存储配置信息,但是主要用于存储敏感信息、需要加密的信息,Secret 可以提供数据加密、解密功能。
在创建 Secret 时,要注意如果要加密的字符中,包含了有特殊字符,需要使用转义符转移,例如 $ 转义后为 \$,也可以对特殊字符使用单引号描述,这样就不需要转义例如 1$289*-! 转换为 ‘1$289*-!’
Subpath 直接使用configmap挂载如果路径不存在会创建路径,如果存在会覆盖写(先将路径清空再写)。使用subpath可以解决这个问题
创建nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 user nginx; worker_processes 1; error_log /var /log /nginx/error .log warn; pid /var /run /nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local ] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" '; access_log /var /log /nginx/access.log main; sendfile on ; #tcp_nopush on ; keepalive_timeout 65; #gzip on ; include /etc/nginx/conf .d
使用nginx.conf创建一个configmap
更改nginx-deploy
更改之后deploy自动执行滚动更新,但是查看pod会发现pod启动失败,查看日志发现提示文件找不到
再次更改deploy
deploy更新后,进入容器查看,发现/etc/nginx/中只有nginx.conf一个文件
下面使用subpath,对nginx-deploy做下面的更改
deploy更新后,再次进入容器,发现这次/etc/nginx中文件齐全
不可变的 Secret 和 ConfigMap 对于一些敏感服务的配置文件,在线上有时是不允许修改的,此时在配置 configmap 时可以设置 immutable: true 来禁止修改
持久化存储 HostPath 将节点上的文件或目录挂载到 Pod 上,此时该目录会变成持久化存储目录,即使 Pod 被删除后重启,也可以重新加载到该目录,该目录下的文件不会丢失
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: nginx name: nginx-volume volumeMounts: - mountPath: /test-pd name: test-volume volumes: - name: test-volume hostPath: path: /data type: Directory
类型: 空字符串:默认类型,不做任何检查 DirectoryOrCreate:如果给定的 path 不存在,就创建一个 755 的空目录 Directory:这个目录必须存在 FileOrCreate:如果给定的文件不存在,则创建一个空文件,权限为 644 File:这个文件必须存在 Socket:UNIX 套接字,必须存在 CharDevice:字符设备,必须存在 BlockDevice:块设备,必须存在
EmptyDir EmptyDir 主要用于一个 Pod 中不同的 Container 共享数据使用的,由于只是在 Pod 内部使用,因此与其他 volume 比较大的区别是,当 Pod 如果被删除了,那么 emptyDir 也会被删除。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 apiVersion: v1 kind: Pod metadata: name: empty-dir-pd spec: containers: - image: alpine name: nginx-emptydir1 command: ["/bin/sh" ,"-c" ,"sleep 3600;" ] volumeMounts: - mountPath: /cache name: cache-volume - image: alpine name: nginx-emptydir2 command: ["/bin/sh" ,"-c" ,"sleep 3600;" ] volumeMounts: - mountPath: /opt name: cache-volume volumes: - name: cache-volume emptyDir: {}
在上面的配置文件中创建了一个EmptyDir,将nginx-emptydir1中的/cache与nginx-emptydir2中的/opt进行共享