K8s对象 -Configmap

1. 从文件创建

1.1 --from-file

从文件创建,且挂载后文件名和源文件一致。

- 语法

kubectl create configmap Configmap_Name --from-file=File_Name -n Namespace_Name

说明:
这种方法创建的configmap,默认以File_Name作为key。
而configmap挂载到容器中之后将以这个key作为容器中文件的名字。
因此创建configmap的源文件必须与容器内要挂载的文件名一致。
如果要修改key名,看1.2节

- 示例

需求:从.env 文件创建一个名为 web-env的congfigmap,之后需要挂载到pod中/etc/.env

  • 创建.env文件
    IOT_WEB_API_HOST=10.252.xxx.xxx
    IOT_WEB_API_PORT=30103
    IOT_WEB_PROJECT_NAME=xxxxxxx
  • 从该文件创建configmap
 kubectl create configmap web-env --from-file=.env -n xinfa

- 查看

说明: configmap中 data下 .env为key。之后文件内容为该key的值

# kubectl edit -n xinfa configmaps web-env
apiVersion: v1
data:
  .env: |
    IOT_WEB_API_HOST=10.252.xxx.xxx
    IOT_WEB_API_PORT=30103
    IOT_WEB_PROJECT_NAME=xxxxxxx
kind: ConfigMap
metadata:
  creationTimestamp: "2019-11-29T05:33:36Z"
  name: web-env
  namespace: xinfa
  resourceVersion: "9432225"
  selfLink: /api/v1/namespaces/xinfa/configmaps/web-env
  uid: ca830a23-1269-11ea-82c2-005056a7d888

1.2 --from-literal

从文件创建,挂载后的文件名可自定义(和源文件不同)

- 语法

kubectl create configmap Configmap_Name --from-file=KEY_Name=File_Name --from-file=KEY_Nname=File_Name  -n Namespace_Name

- 示例

需求:从env 文件创建一个名为 web-env的congfigmap,之后需要挂载到pod中/etc/.env

  • 创建 env文件
IOT_WEB_API_HOST=10.252.xxx.xxx
IOT_WEB_API_PORT=30103
IOT_WEB_PROJECT_NAME=xxxxxxx
  • 创建configmap
[root@DoM01 yml]# kubectl create configmap web-env --from-file=.env=env
configmap/config-env created
  • 查看
# kubectl edit configmaps web-env

可见configmap内容如下:

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  .env: |
    IOT_WEB_API_HOST=10.252.xxx.xxx
    IOT_WEB_API_PORT=30103
    IOT_WEB_PROJECT_NAME=xxxxxxx
kind: ConfigMap
metadata:
  creationTimestamp: "2021-02-03T09:47:36Z"
  name: web-env
  namespace: default
  resourceVersion: "15083053"
  selfLink: /api/v1/namespaces/default/configmaps/web-env
  uid: 45cde575-d55b-4242-8b6d-ef0303196c2b

上文可见,key变成了.env 而并不是1.1中使用原文件名作为key了。

2. 从yaml文件创建

  • yml文件

文件叫什么名字无所谓,就叫configmap.yml吧,内容如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysqlcnf
  namespace: mysql-test
data:
  my.cnf: |
    # 这里是mysql的配置文件
    # 虽然主公这个懒家伙什么也没有留下,但是不影响mysql启动
    !includedir /etc/mysql/conf.d/
    !includedir /etc/mysql/mysql.conf.d/
  • 创建
kubectl create -f configmap.yml

3. configMap使用

3.1 key 是目标文件名

- 使用方法

key名是挂载到容器中的文件名,如果不是使用3.2中的方法。

    spec:
      containers:
      - name: xinfa01-web
        image: 10.252.xxx.xxx/xinfa/xxxx
        imagePullPolicy: IfNotPresent
        env:
        - name: TZ
          value: "Asia/Shanghai"
        ports:
        - containerPort: 3080
          protocol: TCP
          name: http
        volumeMounts:
        - mountPath: /build
          name: web-server
        # 添加以下三行,指明挂载到容器中哪个位置
        - mountPath: /etc/.env  #容器中的全路径 
          name: web-env
          subPath: .env   #容器中的文件名
      volumes:
      - name: web-server
        persistentVolumeClaim:
          claimName:  pv-xf01-web
      # 添加以下三行,挂载名为web-env的configmp
      - name: web-env
        configMap:
          name: web-env
      imagePullSecrets:
      - name: my-harbor

- 完整的示例

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mysql
  namespace: mysql-test
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: harbocto.xxx.com.cn/public/mysql:5.7
        imagePullPolicy: IfNotPresent
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: yunweizhidao
        - name: MYSQL_REPLICATION_USER
          value: "liuwei"
        - name: MYSQLREPLICAITONPASSWO
          value: "1qaz@WSX"
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        - mountPath: /etc/mysql/my.cnf
          name: mysqlcnf
          subPath: my.cnf
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql
      - name: mysqlcnf
        configMap:
          name: mysqlcnf

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysqlcnf
  namespace: mysql-test
data:
  my.cnf: |
    # 这里是mysql的配置文件
    # 虽然鸿渐这个懒家伙什么也没有留下,但是不影响mysql启动
    !includedir /etc/mysql/conf.d/
    !includedir /etc/mysql/mysql.conf.d/
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: mysql-test
spec:
  type: NodePort
  ports:
  - port: 3306
    targetPort: 3306
    nodePort: 30200
  selector:
    app: mysql
  selector:
    app: mysql

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql
  namespace: mysql-test
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

3.2 key名不是目标文件名

需求:将名为mysqlcnf 的configmap中,key为mycnf的内容,挂载到容器中为/etc/mysql/my.cnf

        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        - name: mysqlcnf
          mountPath: /etc/mysql/my.cnf
          subPath: my.cnf
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql
      - name: mysqlcnf
        configMap:
          name: mysqlcnf
          # 添加如下内容即可
          items:
          - key: mycnf
            path: my.cnf

posted on 2021-08-13 11:07  运维开发玄德公  阅读(20)  评论(0编辑  收藏  举报  来源

导航