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

查看并解码

注入到容器内

 
k8s