K8S-ConfigMap,Secret
一、描述信息
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制等对象。
1.1 ConfigMap
configmap 配置中心(明文存放)
1.可以轻松应对各种环境(开发、测试、生产),当启动容器时,根据需求去加载对应的配置文件。
2.当需要对容器内的配置进行修改时,只需要修改配置中心的配置文件。
3.也可以进行灰度发布,针对单个pod内容器进行更新
1.2 加载方式 重要
1.当启动pod时,可以将配置中心的配置文件关联到pod上,从中读取数据传递给pod内容器的一个变量,变量注入方式传递给容器;但是当configmap 发生改变时,并不会同步到容器内变量中,仅在pod启动时生效。
2.也可以把configmap当做存储卷,直接挂载到容器内的目录上,应用程序去读取这个目录的配置文件,同时支持自动同步。
二、ConfigMap 的创建
2.1 使用目录创建
创建测试文件
[root@master cm]# cat game.txt version=1.17 name=dave age=18 [root@master cm]# cat ui.properties level=2 color=yellow
创建cm,指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容
[root@master cm]# kubectl create configmap game-cm --from-file=/root/cm/ configmap/game-cm created
[root@master cm]# kubectl get cm NAME DATA AGE game-cm 2 5s //data为2,表示有两组键值对
[root@master cm]# kubectl describe cm game-cm Name: game-cm Namespace: default Labels:Annotations: Data ==== game.txt: //未指定文件名,默认文件名为key ---- version=1.17 name=dave age=18 ui.properties: ---- level=2 color=yellow Events:
2.2 使用文件创建configmap,`—from-file ` **这个参数可以使用多次,你可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的**
kubectl create configmap game-config-2 --from-file=./game.file
2.3 使用字面值创建,使用文字值创建,利用 `—from-literal` 参数传递配置信息,该参数可以使用多次,格式如下
$ kubectl create configmap literal-config --from-literal=name=dave --from-literal=password=pass $ kubectl get configmaps literal-config -o yaml
2.4 使用 ConfigMap 来替代环境变量
2.4.1 创建cm
apiVersion: v1 kind: ConfigMap metadata: name: literal-config namespace: default data: name: dave password: pass --- apiVersion: v1 kind: ConfigMap metadata: name: env-config namespace: default data: log_level: INFO
2.4.2 创建pod
apiVersion: v1 kind: Pod metadata: name: cm-env-test-pod spec: containers: - name: test-container image: wangyanglinux/myapp:v1 command: [ "/bin/sh", "-c", "env" ] env: //导入单个变量 - name: USERNAME //导入后显示的key值 valueFrom: configMapKeyRef: name: literal-config //cm名称 key: name //cm key - name: PASSWORD valueFrom: configMapKeyRef: name: literal-config key: password envFrom: //导入cm所有变量 - configMapRef: name: env-config restartPolicy: Never
2.5 ConfigMap 设置命令行参数
apiVersion: v1 kind: Pod metadata: name: cm-command-dapi-test-pod spec: containers: - name: test-container image: wangyanglinux/myapp:v1 command: [ "/bin/sh", "-c", "echo $(USERNAME) $(PASSWORD)" ] env: - name: USERNAME valueFrom: configMapKeyRef: name: literal-config key: name - name: PASSWORD valueFrom: configMapKeyRef: name: literal-config key: password restartPolicy: Never
2.6 通过数据卷插件使用ConfigMap
定义一个ConfigMap
apiVersion: v1 kind: ConfigMap metadata: name: nginx-config namespace: linux40 data: default: | server { listen 80; server_name www.mysite.com; index index.html; location / { root /data/nginx/html; if (!-e $request_filename) { rewrite ^/(.*) /index.html last; } } } -- #apiVersion: extensions/v1beta1 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: linux40 spec: replicas: 1 selector: matchLabels: app: ng-deploy-80 template: metadata: labels: app: ng-deploy-80 spec: containers: - name: ng-deploy-80 image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 volumeMounts: - mountPath: /data/nginx/html name: nginx-static-dir - name: nginx-config mountPath: /etc/nginx/conf.d volumes: - name: nginx-static-dir hostPath: path: /data/nginx/linux39 - name: nginx-config //name和volumeMounts.name保持一致 configMap: name: nginx-config //name和metadata.name保持一致 items: - key: default path: mysite.conf -- apiVersion: v1 kind: Service metadata: name: ng-deploy-80 namespace: linux40 spec: ports: - name: http port: 81 targetPort: 80 nodePort: 30019 protocol: TCP type: NodePort selector: app: ng-deploy-80
使用命令行创建configmap
当不指定key值时,默认使用文件名来key值
查看configmap详情
创建pod
挂载configmap 文件到容器
创建pod并验证挂载
验证自动同步功能
修改configmap 文件value
可以看到已同步到容器内
当configmap配置文件发生修改后,虽然容器内应用服务的配置文件发生了改变,还得重新启动服务使配置文件生效
验证 实现启动pod时只加载configmap部分的键值secret (加密存放的配置文件)
secret 存放敏感数据 比如:私钥与证书
docker 认证:用于在私有仓库拖镜像时使用的账号密码
手动创建一个secret
查看并解码
注入到容器内