一、ConfigMap介绍

1.1 概述

在部署应用程序时,我们都会涉及到应用的配置,在容器中,如Docker容器中,如果将配置文件打入容器镜像,这种行为等同于写死配置,每次修改完配置,镜像就得重新构建。当然,我们也可以通过挂载包含该文件的卷进行配置管理和修改。而在k8s中,我们要讲一种更好的方式,即ConfigMap,这种资源对象的出现,更是极大的方便了应用程序的配置管理。
  ConfigMap是一个或多个key/value的形式保存在k8s中,内部可以管理变量也可以管理完整的配置文件内容。

1.2 用法

  1. 生成容器内的环境变量,在pod中可以通过spec.env或者spec.envFrom进行引用。
  2. 设置容器启动命令的启动参数,前提是设置为环境变量。
  3. 以卷volume的方式挂载到容器内部的文件或目录,通过spec.volumes引用。

注:在使用命令的时候注意单词: configmap等价于cm,cm算是简写,类似于deployment可以使用命令时写成deploy,service可以写成svc,namespace可以写成ns,pod可以写成po。

1.3 创建

1.3.1yaml文件方式创建

示例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-test01
data:
  appconf01: value01
  appconf02: value02

命令:

[root@k8s-master k8s]# kubectl create -f cm-test01.yaml 
configmap/cm-test01 created

1.3.2 命令行方式创建

  • 读取文件方式(也可以是目录)通过--from-file参数从文件中读取。可以指定key的名称,若不指定,则默认使用文件名为key。
    如当前目录有一个配置文件为test.properties
[root@k8s-master k8s]# cat test.properties 
key01:value01
key02:value02
conf01: value03

命令:

[root@k8s-master k8s]# kubectl create cm cm-test-file --from-file=test.properties
configmap/cm-test-file created
//指定参数方式,通过--from-literal指定keyxx=valuexx创建confimap中的data内配置属性。
[root@k8s-master k8s]#  kubectl create configmap cm-test-literal --from-literal=key01=value01 --from-literal=key02=value02
configmap/cm-test-literal created

1.4 查询

1.4.1 查询configmap列表

[root@k8s-master k8s]# kubectl get cm
NAME               DATA   AGE
cm-test-file       1      3m51s
cm-test-literal    2      3m30s
cm-test01          2      9m2s
kube-root-ca.crt   1      4d16h

1.4.2 查看configmap详细信息

[root@k8s-master k8s]# kubectl describe cm cm-test01
Name:         cm-test01
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
appconf01:
----
value01
appconf02:
----
value02
Events:  <none>
[root@k8s-master k8s]# kubectl describe cm cm-test-file
Name:         cm-test-file
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
test.properties:
----
key01:value01
key02:value02
conf01: value03


Events:  <none>
[root@k8s-master k8s]# kubectl describe cm cm-test-literal
Name:         cm-test-literal
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
key01:
----
value01
key02:
----
value02
Events:  <none>

1.4.3 查看yaml输出

[root@k8s-master k8s]# kubectl get cm cm-test01 -o yaml
apiVersion: v1
data:
  appconf01: value01
  appconf02: value02
kind: ConfigMap
metadata:
  creationTimestamp: "2022-08-07T00:18:47Z"
  name: cm-test01
  namespace: default
  resourceVersion: "44876"
  uid: 7492a928-b163-4b86-a3dd-54a7fbe59a10
[root@k8s-master k8s]# kubectl get configmap cm-test-file -o yaml
apiVersion: v1
data:
  test.properties: |+
    key01:value01
    key02:value02
    conf01: value03

kind: ConfigMap
metadata:
  creationTimestamp: "2022-08-07T00:23:58Z"
  name: cm-test-file
  namespace: default
  resourceVersion: "45341"
  uid: 818a39b4-cbaf-4643-9541-1119b4d61982
[root@k8s-master k8s]# kubectl get cm cm-test-literal -o yaml
apiVersion: v1
data:
  key01: value01
  key02: value02
kind: ConfigMap
metadata:
  creationTimestamp: "2022-08-07T00:24:19Z"
  name: cm-test-literal
  namespace: default
  resourceVersion: "45372"
  uid: 051849e0-bf0a-4926-a549-2405dc4963cc

1.5 更新

1.5.1 edit

[root@k8s-master k8s]# kubectl edit cm cm-test01
configmap/cm-test01 edited

[root@k8s-master k8s]# kubectl edit cm cm-test01
configmap/cm-test01 edited

通过kubectl describe cm cm-test01查看更新是否生效

[root@k8s-master k8s]# kubectl describe cm cm-test01
Name:         cm-test01
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
appconf02:
----
value02
appconf01:
----
value001
Events:  <none>

1.5.2 apply

直接更新yaml文件里的值,通过 kubectl apply -f configmap-test01.yaml重新发布一遍进行更新

1.6 删除

1.6.1 通过yaml文件方式删除

$ kubectl delete -f configmap-test01.yaml

1.6.2 直接删除资源

kubectl delet cm cm-test01

二、ConfigMap和Pod的使用

容器应用对ConfigMap的使用主要是两种:
1)通过环境变量获取ConfigMap的内容:spec.envspec.envFrom
2)通过卷volume挂载的方式将ConfigMap的内容挂载到容器内部的文件或目录:spec.volumes

以下内容均以上述的ConfigMap资源cm-test01为例

2.1 环境变量方式

sepc.env方式

2.1.1 创建pod

[root@k8s-master k8s]# vim pod-test01.yaml

apiVersion: v1
kind: Pod
metadata:
  name: cm-pod-test001
spec:
  containers:
  - name: cm-test
    image: tomcat:8
    command: [ "/bin/sh", "-c", "env | grep APP"]
    env:
    - name: APPCONF01 		# 定义环境变量的名称
      valueFrom:	  		# key “appconf01”的值获取
        configMapKeyRef:
          name: cm-test01	# 环境变量的值来自于configmap cm-test01
          key: appconf01	# configmap中的配置key为appconf01
    - name: APPCONF02		# 定义环境变量的名称
      valueFrom:			# key “appconf02”的值获取
        configMapKeyRef:
          name: cm-test01	# 环境变量的值来自于configmap cm-test01
          key: appconf02	# configmap中的配置key为appconf02
  restartPolicy: Never		# 重启策略:从不。

执行创建pod:

[root@k8s-master k8s]# kubectl create -f pod-test01.yaml
pod/cm-test001 created

2.1.2 查看pod

[root@k8s-master k8s]# kubectl get pods
[root@k8s /cm/test]#  kubectl get pods
NAME             READY     STATUS      RESTARTS   AGE
cm-pod-test001   0/1       Completed   0          1h

 2.1.3 查看pod日志

[root@k8s-master k8s]# kubectl logs cm-pod-test001
APPCONF01=value01
APPCONF02=value02

说明容器内部的环境变量使用ConfigMap中进行读取的

spec.envFrom方式

2.1.4 创建pod

yaml文件

[root@k8s-master k8s]# vim pod-test02.yaml

piVersion: v1
kind: Pod
metadata:
  name: cm-pod-test002
spec:
  containers:
  - name: cm-test2
    image: tomcat:8
    command: [ "/bin/sh", "-c", "env"]
    envFrom:
    - configMapRef:
      name: cm-test01  # 根据ConfigMap cm-test01资源自动生成环境变量
  restartPolicy: Never

执行创建pod:

[root@k8s-master k8s]# kubectl create -f pod-test02.yaml

2.1.5 查看pod:

[root@k8s-master k8s]#  kubectl get po
NAME             READY     STATUS      RESTARTS   AGE
cm-pod-test001   0/1       Completed   0          2h
cm-pod-test002   0/1       Completed   0          1h

注意:
环境变量的名称受限制:[a-zA-Z][a-zA-Z0-9_]*,不能以数字或非法字符开头。

2.2 卷挂载方式

指定items

[root@k8s-master k8s]#  vim pod-test03.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-pod-test003
spec:
  containers:
  - name: cm-test3
    image: tomcat:8
    volumeMounts:
    - name: vm-01-1
      mountPath: /conf
  volumes:
  - name: vm-01-1
    configMap:
      name: cm-test-file
      items:
      - key: key-testproperties
        path: test.properties
  restartPolicy: Never

不指定items

[root@k8s-master k8s]#  vim pod-test04.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-pod-test004
spec:
  containers:
  - name: cm-test4
    image: tomcat:8
    volumeMounts:
    - name: vm-02-2
      mountPath: /conf
  volumes:
  - name: vm-02-2
    configMap:
      name: cm-test-file
  restartPolicy: Never

进入容器中查看

[root@k8s-master k8s]# kubectl exec -it cm-pod-test004 -c cm-test4 -- bash


进入容器后,ls /conf查看是否有test.properties文件。

[root@k8s-master k8s]#  kubectl exec -it cm-pod-test004 -c cm-test4  -- bash
root@cm-pod-test004:/usr/local/tomcat# ls /conf
test.properties

2.3 补充

关于--from-file的方式的创建指定key和不指定key的区别
1)不指定key名
 

创建:
[root@k8s-master k8s]# kubectl create cm cm-test-file --from-file=test.properties
输出:
[root@k8s-master k8s]# kubectl get cm cm-test-file -o yaml

2)指定key

2)指定key
创建:
[root@k8s-master k8s]# kubectl create cm cm-test-file02 --from-file=tp=test.properties
输出:
[root@k8s-master k8s]# kubectl get cm cm-test-file -o yaml

 

 若指定key的名称,configmap中将会使用指定名称;若不指定,则默认使用文件名为key。

三、secret

3.1 概述

Secret对象与ConfigMap对象类似,但它主要用于存储以下敏感信息,例如密码,OAuth token和SSH key等等。将这些信息存储在secret中,和直接存储在Pod的定义中,或Docker镜像定义中相比,更加安全和灵活。

3.2 secret类型

Secret有三种类型:

  • Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
  • kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
  • kubernetes.io/service-account-token:用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

3.3 常见的Opaque Secret

Opaque类型的Secret,其value为base64编码后的值。

其他的参考Secret | Kubernetes

3.3.1 从文件中创建Secret

分别创建两个名为username.txt和password.txt的文件:

[root@k8s-master k8s]# echo -n "admin" > ./username.txt
[root@k8s-master k8s]# echo -n "123456" > ./password.txt
[root@k8s-master k8s]# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret/db-user-pass created

3.3.2 使用描述文件创建Secret

[root@k8s-master k8s]# echo -n 'name' | base64
bmFtZQ==
[root@k8s-master k8s]# echo -n '123456' | base64
MTIzNDU2

创建secret

[root@k8s-master k8s]# cat secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data: 
  username: bmFtZQ==
  password: MTIzNDU2
[root@k8s-master k8s]# kubectl create -f secret.yaml 
secret/mysecret created

 查看secret

[root@k8s-master k8s]# kubectl get secrets | grep myse
mysecret                             Opaque                                2      109s
[root@k8s-master k8s]# kubectl describe secrets mysecret
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  6 bytes
username:  4 bytes
[root@k8s-master k8s]# kubectl get secrets mysecret -o yaml
apiVersion: v1
data:
  password: MTIzNDU2
  username: bmFtZQ==
kind: Secret
metadata:
  creationTimestamp: "2022-08-07T02:21:23Z"
  name: mysecret
  namespace: default
  resourceVersion: "58148"
  uid: 261bd305-2376-47bd-a0fe-5563fdde8752
type: Opaque

3.4 Secret的使用

创建好Secret之后,可以通过两种方式使用:

  • 以Volume方式
  • 以环境变量方式

3.4.1 将Secret挂载到Volume中

[root@k8s-master k8s]# cat mypod1.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret

[root@k8s-master k8s]# kubectl create -f mypod1.yaml 
pod/mypod created

[root@k8s-master k8s]# kubectl get pods
NAME                                      READY   STATUS              RESTARTS   AGE

mypod                                     0/1     ContainerCreating   0          12s

[root@k8s-master k8s]# kubectl get pods
NAME                                      READY   STATUS              RESTARTS   AGE

mypod                                     1/1     Running             0          30s

进入pod查看挂载的Secret:

[root@k8s-master k8s]# kubectl exec -it mypod /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@mypod:/data# cd /etc/foo/
root@mypod:/etc/foo# ls
password  username
root@mypod:/etc/foo# cat password 
123456root@mypod:/etc/foo# cat username 
nameroot@mypod:/etc/foo# 

也可以只挂载Secret中特定的key:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      items:
      - key: username
        path: my-group/my-username

在这种情况下:

username 存储在/etc/foo/my-group/my-username中

password未被挂载

3.4.2 将Secret设置为环境变量

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  restartPolicy: Never
[root@k8s-master k8s]# kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
mypod            1/1     Running   0          10m
secret-env-pod   1/1     Running   0          37s
[root@k8s-master secret]# kubectl exec -it secret-env-pod /bin/bash
root@secret-env-pod:/data# env | grep -E "USERNAME|PASSWORD"
SECRET_USERNAME=admin
SECRET_PASSWORD=123456
root@secret-env-pod:/data#

3.5 一个MySQL密码注入pod样例

3.5.1 创建secret

[root@k8s-master k8s]# kubectl create secret generic test --from-literal=MYSQL_ROOT_PASSWORD=1234567

3.5.2 查看yaml文件


[root@k8s-master k8s]# vim myapp-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-demo
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
        volumeMounts:
        - name: mysql
          mountPath: /test/
      volumes:
      - name: mysql
        secret:
          secretName: test

3.5.3 启动pod,查看信息是否注入

目录

一、ConfigMap介绍

1.1 概述

1.2 用法

1.3 创建

1.3.1yaml文件方式创建

1.3.2 命令行方式创建

1.4 查询

1.4.1 查询configmap列表

1.4.2 查看configmap详细信息

1.4.3 查看yaml输出

1.5 更新

1.5.1 edit

1.5.2 apply

1.6 删除

1.6.1 通过yaml文件方式删除

1.6.2 直接删除资源

二、ConfigMap和Pod的使用

2.1 环境变量方式

2.1.1 创建pod

2.1.2 查看pod

 2.1.3 查看pod日志

2.1.4 创建pod

2.1.5 查看pod:

2.2 卷挂载方式

2.3 补充

三、secret

3.1 概述

3.2 secret类型

3.3 常见的Opaque Secret

3.3.1 从文件中创建Secret

3.3.2 使用描述文件创建Secret

3.4 Secret的使用

3.4.1 将Secret挂载到Volume中

3.4.2 将Secret设置为环境变量

3.5 一个MySQL密码注入pod样例

3.5.1 创建secret

3.5.2 查看yaml文件

3.5.3 启动pod,查看信息是否注入


Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐