1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > @kubernetes(k8s) 应用配置管理(ConfigMap subPath Secret)

@kubernetes(k8s) 应用配置管理(ConfigMap subPath Secret)

时间:2019-09-21 21:33:35

相关推荐

@kubernetes(k8s) 应用配置管理(ConfigMap subPath Secret)

k8s 应用配置管理 ConfigMap

文章目录

k8s 应用配置管理 ConfigMap一、 ConfigMap1、configmap的介绍2、congfigmap的创建方式(四种)【指定配置文件】【指定配置目录】【指定配置值项】【指定配置清单yaml创建】3、环境变量的使用4、使用ConfigMap的限制条件5、使用configmap二、subPath(覆盖单一文件)1、subpath的使用2、configmap(热更新)三、Secret(支持加密)1、加密的三种类型2、Opaque Secret【加密格式】【Opaque Secret使用】【案列】3、kubernetes.io/dockerconfigjson【定义】【测试】【Service Account】(服务账户)

一、 ConfigMap

在生产环境中经常会遇到需要修改配置文件的情况,传统的修改方式不仅会影响到服务的正常运行,而且操作步骤也很繁琐。为了解决这个问题,kubernetes项目从1.2版本引入了ConfigMap功能,用于将应用的配置信息与程序的分离。这种方式不仅可以实现应用程序被的复用,而且还可以通过不同的配置实现更灵活的功能。在创建容器时,用户可以将应用程序打包为容器镜像后,通过环境变量或者外接挂载文件的方式进行配置注入。ConfigMap && Secret 是K8S中的针对应用的配置中心,它有效的解决了应用挂载的问题,并且支持加密以及热更新等功能,可以说是一个k8s提供的一件非常好用的功能

1、configmap的介绍

ConfigMap顾名思义,是用于保存配置数据的键值对,可以用来保存单个属性,也可以保存配置文件。Secret可以为Pod提供密码、Token、私钥等敏感数据;对于一些非敏感数据,比如应用的配置信息,则可以使用ConfigMapps : ConfigMap的创建和使用方式与Secret非常类似,主要的不同是以明文的形式存放

2、congfigmap的创建方式(四种)

可以使用kubectl create configmap从文件、目录或者 key-value 字符串创建等创建 ConfigMap。也可以通过kubectl create -f从描述文件创建

【指定配置文件】

kubectl create configmap my-config-file --from-file=/etc/resolv.conf

key :键的名称是文件名称

value:的值是这个文件的内容

#指定配置文件创建[root@m01 ~]# kubectl create configmap my-conf-file --from-file=/etc/resolv.conf configmap/my-conf-file created#查看cm的详细内容[root@m01 ~]# kubectl describe configmaps my-conf-file Name: my-conf-fileNamespace: defaultLabels: <none>Annotations: <none>Data====resolv.conf:----# Generated by NetworkManagernameserver 114.114.114.114Events: <none>#查看当前的cm[root@m01 ~]# kubectl get cmNAMEDATA AGEkube-root-ca.crt 127hmy-conf-file 176s

【指定配置目录】

kubectl create configmap my-config-3 --from-file=test

key:目录中的文件名为

value :文件内容

#创建目录[root@m01 ~]# mkdir configmap#添加测试文件[root@m01 ~/configmap]# cp /etc/passwd /configmap/[root@m01 ~/configmap]# cp /etc/shells /configmap/#创建configmap[root@m01 ~]# kubectl create configmap my-file --from-file=/configmapconfigmap/my-file created[root@m01 ~]# kubectl get configmaps my-file NAMEDATA AGEmy-file 223s#查看详cm细信息[root@m01 ~]# kubectl describe cm my-file Name: my-fileNamespace: defaultLabels: <none>Annotations: <none>Data====passwd:----root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinsystemd-network:x:192:192:systemd Network Management:/:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinpolkitd:x:999:997:User for polkitd:/:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologintcpdump:x:72:72::/:/sbin/nologinntp:x:38:38::/etc/ntp:/sbin/nologinnscd:x:28:28:NSCD Daemon:/:/sbin/nologinrpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologinrpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologinnfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologinwww:x:1000:1000::/home/www:/bin/bashshells:----/bin/sh/bin/bash/usr/bin/sh/usr/bin/bashEvents: <none>

【指定配置值项】

kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

#创建配置文件(直接指定配置名称及文件内容)[root@m01 ~]# kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2configmap/my-config created[root@m01 ~]# kubectl get cm my-config NAME DATA AGEmy-config 293s#查看configmap详情[root@m01 ~]# kubectl describe cm my-config Name: my-configNamespace: defaultLabels: <none>Annotations: <none>Data====key1:#key值 ----config1 #valuekey2:----config2Events: <none>

【指定配置清单yaml创建】

#编写配置清单apiVersion: v1kind: ConfigMapmetadata:name: nginxdata:default.conf: |-server {listen 90;server_name ;location / {root /daima;autoindex on;autoindex_localtime on;autoindex_exact_size on;}}#创建configmap [root@m01 ~]# kubectl apply -f hzl.yaml configmap/nginx created#查看configmap[root@m01 ~]# kubectl get cmNAMEDATA AGEkube-root-ca.crt 129hmy-config269mnginx 140s#查看详cm细内容[root@m01 ~]# kubectl describe cm nginx Name: nginxNamespace: defaultLabels: <none>Annotations: <none>Data====default.conf:----server {listen 90;server_name ;location / {root /daima;autoindex on;autoindex_localtime on;autoindex_exact_size on;}}Events: <none>

3、环境变量的使用

kind: ConfigMapapiVersion: v1metadata:name: test-mysqldata:MYSQL_ROOT_PASSWORD: "123456"MYSQL_DATABASE: discuz---kind: DeploymentapiVersion: apps/v1metadata:name: test-mysqlspec:selector:matchLabels:app: test-mysqltemplate:metadata:labels:app: test-mysqlspec:containers:- name: mysqlimage: mysql:5.7envFrom: #引用数据中心定义的环境变量- configMapRef:name: test-mysql

4、使用ConfigMap的限制条件

1)ConfigMap必须在Pod之前创建。2)ConfigMap受Namespace限制, 只有处于相同Namespace中的Pod才可以引用它。3)ConfigMap中的配额管理还未能实现。4)kubelet只支持可以被API Server管理的Pod使用ConfigMap。kubelet在本Node上通过–manifest- url或- config自动创建的静态Pod将无法引用ConfigMap。5)在Pod对ConfigMap进行挂载(volumeMount) 操作时,在容器内部只能挂载为“目录”,无法挂载为“文件”。在挂载到容器内部后,在目录下将包含ConfigMap定义的每个item,如果在该目录下原来还有其他文件,则容器内的该目录将被挂载的ConfigMap覆盖。

5、使用configmap

通过挂载方式使用configmap

#编写资源清单[root@m01 ~]# vim configmap.yamlkind: ConfigMapapiVersion: v1metadata:name: configmap-yamllabels:app: configmapdata:key: valuenginx_config: |- #设定配置文件名称及添加文件内容upstream tomcatserver1 {server 192.168.15.55:8081;}server {listen 80;server_name ;location / {proxy_pass http://tomcatserver1;index index.html index.htm;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}---kind: PodapiVersion: v1metadata:name: configmap-podlabels:app: configmap-podspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80volumeMounts:- mountPath: /usr/share/nginx/demoname: conf-namevolumes:- name: conf-nameconfigMap:name: configmap-yamlitems:- key: nginx_configpath: nginx_config- key: keypath: key#创建configmap文件 [root@m01 ~]# kubectl apply -f test.yamlconfigmap/configmap-yaml unchangedpod/configmap-pod created#查看configmap[root@m01 ~]# kubectl get pod -l app=configmap-podNAME READY STATUS RESTARTS AGEconfigmap-pod 1/1Running 025s#进入创建的容器[root@m01 ~]# kubectl exec -it configmap-pod -- bashroot@configmap-pod:/# cd /usr/share/nginx/root@configmap-pod:/usr/share/nginx# ls -ltotal 8drwxrwxrwx 3 root root 4096 Oct 7 12:57 demodrwxr-xr-x 2 root root 4096 Sep 10 12:33 htmlroot@configmap-pod:/usr/share/nginx# cd demo/root@configmap-pod:/usr/share/nginx/demo# lskey nginx_config#查看已经挂载root@configmap-pod:/usr/share/nginx/demo# cat nginx_configupstream tomcatserver1 {server 192.168.15.55:8081;}upstream tomcatserver2 {server 192.168.15.56:8082;}server {listen 80;server_name ;location / {proxy_pass http://tomcatserver1;index index.html index.htm;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}root@configmap-pod:/usr/share/nginx/demo# cat keyvalueroot@configmap-pod:/usr/share/nginx/demo#

二、subPath(覆盖单一文件)

mountPath结合subPath(也可解决多个configmap挂载同一目录,导致覆盖)作用

之所以会产生这种挂载,是为了解决多配置文件挂载,互相覆盖的问题,这种模式只会覆盖单一的配置文件

1、subpath的使用

apiVersion: v1kind: ConfigMapmetadata:name: nginx-confdata:nginx.conf: |-user nginx;worker_processes auto;error_log /var/log/nginx/error.log;pid /run/nginx.pid;include /usr/share/nginx/modules/*.conf;events {worker_connections 1024;}http {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_nopushon;tcp_nodelay on;keepalive_timeout 65;types_hash_max_size 4096;include /etc/nginx/mime.types;default_type application/octet-stream;include /etc/nginx/conf.d/*.conf;}default.conf: |-server {listen 90;server_name ;location / {root /daima;autoindex on;autoindex_localtime on;autoindex_exact_size on;}}---apiVersion: apps/v1kind: Deploymentmetadata:name: nginxspec:selector:matchLabels:app: nginxtemplate:metadata:name: nginxlabels:app: nginxspec:containers:- name: nginximage: nginxvolumeMounts:- mountPath: /etc/nginx/conf.dname: nginx-default- mountPath: /etc/nginx/nginx.conf # 精确到文件name: nginx-confsubPath: nginx.conf # 精确到文件volumes:- name: nginx-defaultconfigMap:name: nginx-confitems:- key: default.confpath: default.conf- name: nginx-confconfigMap:name: nginx-confitems:- key: nginx.confpath: nginx.conf

# 进入容器查看[root@m01 k8s]# kubectl exec -it nginx-b46f4f758-68ggn -- bash root@nginx-b46f4f758-68ggn:/etc/nginx# lsconf.dfastcgi_paramsmime.types modules nginx.conf scgi_params uwsgi_params#文件都存在,只单独覆盖了nginx.confroot@nginx-b46f4f758-68ggn:/etc/nginx# cd conf.d/root@nginx-b46f4f758-68ggn:/etc/nginx/conf.d# lsdefault.conf#查看文件内容(配置文件已经替换)root@nginx-b46f4f758-mzwwx:/etc/nginx# cat conf.d/default.conf server {listen 90;server_name ;location / {root /daima;autoindex on;autoindex_localtime on;autoindex_exact_size on;}}root@nginx-b46f4f758-mzwwx:/etc/nginx#

2、configmap(热更新)

在不停服的前提下,可以更新配置文件

实现修改配置文件可以做到动态更新

#configmap的热更新1>使用该 ConfigMap 挂载的 Env 不会同步更新2>使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新ps: 当ConfigMap以数据卷的形式挂载进Pod时,更新ConfigMap(或删掉重建ConfigMap),Pod内挂载的配置信息会热更新,但使用环境变量方式加载到pod,则不会自动更新(ENV 是在容器启动的时候注入的,启动之后 kubernetes 就不会再改变环境变量的值)。且同一个 namespace 中的 pod 的环境变量是不断累加的

DEBUG[root@kubernetes-master-01 configmap]# cat test.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: my-nginxspec:replicas: 1selector:matchLabels:run: my-nginxtemplate:metadata:labels:run: my-nginxspec:containers:- name: my-nginximage: nginxports:- containerPort: 80envFrom:- configMapRef:name: env-configvolumeMounts:- mountPath: /usr/share/nginx/demo/name: configvolumes:- name: configconfigMap:name: env-configitems:- key: log_levelpath: log_level---apiVersion: v1kind: ConfigMapmetadata:name: env-confignamespace: defaultdata:log_level: INFO

#创建pod[root@m01 ~]# kubectl apply -f hzl.yaml deployment.apps/my-nginx createdconfigmap/env-config created#查看容器(统计信息)[root@kubernetes-master-01 configmap]# kubectl exec my-nginx-6947589dc-tbvs5 -- cat /usr/share/nginx/demo/log_levelINFO#更改文件(再现更改)[root@kubernetes-master-01 configmap]# kubectl edit configmaps env-configconfigmap/env-config edited[root@kubernetes-master-01 configmap]# kubectl exec my-nginx-6947589dc-tbvs5 -- cat /usr/share/nginx/demo/log_levelDEBU

三、Secret(支持加密)

Secret解决了密码、token、密钥等敏感数据的配置问题,可以以Volume或者环境变量的方式去使用

1、加密的三种类型

1》Service Account :用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中;2》Opaque :base64编码格式的Secret,用来存储密码、密钥等;3》kubernetes.io/dockerconfigjson :用来存储私有docker registry的认证信息

2、Opaque Secret

Opaque类型的数据是一个map类型,要求value是base64编码格式

【加密格式】

#opaque的数据类型是一个map类型,要求value是base64的编码格式1》加密[root@m01 ~]# echo 1234abc1234 |base64MTIzNGFiYzEyMzQK 2》解密[root@m01 ~]# echo MTIzNGFiYzEyMzQK |base64 -d1234abc1234

【Opaque Secret使用】

#资源清单编写apiVersion: v1kind: Secretmetadata:name: mysql-passworddata:password: MTIzNGFiYzEyMzQK #使用加密#创建secret数据 [root@m01 ~]# kubectl apply -f hzl.yaml secret/mysql-password created#查看secret[root@m01 ~]# kubectl get secrets mysql-password NAME TYPEDATA AGEmysql-password Opaque 1118s

【案列】

#编写资源清单[root@m01 ~]# cat hzl.yaml kind: DeploymentapiVersion: apps/v1metadata:name: mysecretspec:selector:matchLabels:app: mysecrettemplate:metadata:labels:app: mysecretspec:containers:- name: nginximagePullPolicy: IfNotPresentimage: nginxvolumeMounts:- name: mysecretmountPath: "/opt/secrets"readOnly: truevolumes:- name: mysecretsecret:secretName: mysecret#创建secret[root@m01 ~]# kubectl apply -f hzl.yaml secret/mysql-password createddeployment.apps/test-secret created#创建测试[root@m01 ~]# kubectl apply -f hzl.yaml secret/mysecret createddeployment.apps/my-secret created[root@kubernetes-master-01 secret]# kubectl exec -it mysecret-5bcb897fff-77bn5 -- bashroot@mysecret-5bcb897fff-77bn5:/# cd /opt/secrets/root@mysecret-5bcb897fff-77bn5:/opt/secrets# lspassword usernameroot@mysecret-5bcb897fff-77bn5:/opt/secrets# cat usernameoldboyroot@mysecret-5bcb897fff-77bn5:/opt/secrets# cat passwordoldboy123

3、kubernetes.io/dockerconfigjson

来存储私有docker registry的认证信息

【定义】

#定义变量export DOCKER_REGISTRY_SERVER=10.0.0.100export DOCKER_USER=rootexport DOCKER_PASSWORD=root@123 #用户密码export DOCKER_EMAIL=root@ #用户邮箱#创建secret命令kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

【测试】

#定义变量[root@m01 ~]# export DOCKER_REGISTRY_SERVER=10.0.0.100[root@m01 ~]# export DOCKER_USER=root[root@m01 ~]# export DOCKER_PASSWORD=root@123[root@m01 ~]# export DOCKER_EMAIL=root@#测试使用[root@kubernetes-master-01 secret]# kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAILsecret/myregistrykey created#查看状态[root@m01 ~]# kubectl describe secret myregistrykeyName: myregistrykeyNamespace: defaultLabels: <none>Annotations: <none>Type: kubernetes.io/dockerconfigjsonData====.dockerconfigjson: 161 bytes

spec:imagePullSecrets:- name: ailiyuncontainers:- name: mysqlimage: -/hzl_images/mysql:5.7envFrom:- secretRef:name: mysql-password

【Service Account】(服务账户)

Service Account用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中

[root@m01 ~]# kubectl exec nginx-6cf7488b57-bd887 -- ls /run/secrets/kubernetes.io/serviceaccountca.crtnamespaceToken

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。