溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kubernetes 配置管理 ConfigMap(十二)

發(fā)布時(shí)間:2020-06-18 11:46:43 來源:網(wǎng)絡(luò) 閱讀:4447 作者:wzlinux 欄目:云計(jì)算

一、背景

很多情況下我們?yōu)槟骋粦?yīng)用做好鏡像,當(dāng)我們想修改其中的一些參數(shù)的時(shí)候,就變得比較麻煩,又要重新制作鏡像,我們是不是有一種方式,讓鏡像根據(jù)不同的場景調(diào)用我們不同的配置文件呢,那我們就需要用到 k8s 的另外一種資源,那就是 ConfigMap。

我們知道,在幾乎所有的應(yīng)用開發(fā)中,都會(huì)涉及到配置文件的變更,比如說在web的程序中,需要連接數(shù)據(jù)庫,緩存甚至是隊(duì)列等等。而我們的一個(gè)應(yīng)用程序從寫第一行代碼開始,要經(jīng)歷開發(fā)環(huán)境、測試環(huán)境、預(yù)發(fā)布環(huán)境只到最終的線上環(huán)境。而每一個(gè)環(huán)境都要定義其獨(dú)立的各種配置。如果我們不能很好的管理這些配置文件,你的運(yùn)維工作將頓時(shí)變的無比的繁瑣。為此業(yè)內(nèi)的一些大公司專門開發(fā)了自己的一套配置管理中心,如360的Qcon,百度的disconf等。kubernetes也提供了自己的一套方案,即ConfigMap。kubernetes通過ConfigMap來實(shí)現(xiàn)對容器中應(yīng)用的配置管理。

二、創(chuàng)建 ConfigMap

ConfigMap是用來存儲(chǔ)配置文件的kubernetes資源對象,所有的配置內(nèi)容都存儲(chǔ)在etcd中。

創(chuàng)建ConfigMap的方式有4種:

  • 通過直接在命令行中指定configmap參數(shù)創(chuàng)建,即--from-literal;
  • 通過指定文件創(chuàng)建,即將一個(gè)配置文件創(chuàng)建為一個(gè)ConfigMap,--from-file=<文件>;
  • 通過一個(gè)文件內(nèi)多個(gè)鍵值對,--from-env-file=<文件>;
  • 事先寫好標(biāo)準(zhǔn)的configmap的yaml文件,然后kubectl create -f 創(chuàng)建。

2.1、通過 --from-literal

kubectl create configmap test-config1 --from-literal=db.host=172.18.8.200 --from-literal=db.port='3306'

查看配置的內(nèi)容。

[root@master ~]# kubectl get cm test-config1 -o yaml
apiVersion: v1
data:
  db.host: 172.18.8.200
  db.port: "3306"
kind: ConfigMap
metadata:
  creationTimestamp: "2018-12-16T04:32:42Z"
  name: test-config1
  namespace: default
  resourceVersion: "3676"
  selfLink: /api/v1/namespaces/default/configmaps/test-config1
  uid: a0ee762b-00eb-11e9-9fa7-000c291fb1b3

2.2、通過 --from-file

echo -n 172.18.8.200 > ./db.host
echo -n 3306 > ./db.port
kubectl create cm test-config2 --from-file=./db.host --from-file=./db.port

查看配置內(nèi)容:

[root@master ~]# kubectl get cm test-config2 -o yaml
apiVersion: v1
data:
  db.host: 172.18.8.200
  db.port: "3306"
kind: ConfigMap
metadata:
  creationTimestamp: "2018-12-16T04:37:50Z"
  name: test-config2
  namespace: default
  resourceVersion: "4107"
  selfLink: /api/v1/namespaces/default/configmaps/test-config2
  uid: 583ed4e7-00ec-11e9-9fa7-000c291fb1b3

每個(gè)文件內(nèi)容對應(yīng)一個(gè)信息條目。

2.3、通過--from-env-file

cat << EOF > env.txt
db.host=172.18.8.200
db.port=3306
EOF
kubectl create cm test-config3 --from-env-file=env.txt

查看配置內(nèi)容:

[root@master ~]# kubectl get cm test-config3 -o yaml
apiVersion: v1
data:
  db.host: 172.18.8.200
  db.port: "3306"
kind: ConfigMap
metadata:
  creationTimestamp: "2018-12-16T04:43:02Z"
  name: test-config3
  namespace: default
  resourceVersion: "4544"
  selfLink: /api/v1/namespaces/default/configmaps/test-config3
  uid: 12746e5f-00ed-11e9-9fa7-000c291fb1b3

2.4、YAML 配置文件

配置文件內(nèi)容如下。

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-config4
data:
  db.host: 172.18.8.200
  db.port: "3306"

創(chuàng)建并查看其內(nèi)容。

[root@master ~]# kubectl apply -f db.yaml 
configmap/test-config4 created
[root@master ~]# kubectl get cm test-config4 -o yaml
apiVersion: v1
data:
  db.host: 172.18.8.200
  db.port: "3306"
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"db.host":"172.18.8.200","db.port":"3306"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"test-config4","namespace":"default"}}
  creationTimestamp: "2018-12-16T04:49:01Z"
  name: test-config4
  namespace: default
  resourceVersion: "5045"
  selfLink: /api/v1/namespaces/default/configmaps/test-config4
  uid: e87cdafa-00ed-11e9-9fa7-000c291fb1b3

三、ConfigMap 使用

使用ConfigMap有二種方式:

  • 第一種是通過環(huán)境變量的方式,直接傳遞給pod;
  • 第二種是作為volume的方式掛載到pod內(nèi)。

3.1、通過環(huán)境變量使用

使用valueFrom、configMapKeyRef、namekey指定要用的key。

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: busybox
    args: [ "/bin/sh", "-c", "sleep 3000" ]
    env:
    - name: DB_HOST
      valueFrom:
        configMapKeyRef:
          name: test-config4
          key: db.host
    - name: DB_PORT
      valueFrom:
        configMapKeyRef:
          name: test-config4
          key: db.port

還可以通過envFromconfigMapRef、name使得configmap中的所有key/value對都自動(dòng)變成環(huán)境變量。

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: busybox
    args: [ "/bin/sh", "-c", "sleep 3000" ]
    envFrom:
    - configMapRef:
        name: test-config3

3.2、作為volume掛載使用

test-config4所有key/value掛載進(jìn)來:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: busybox
    args: [ "/bin/sh", "-c", "sleep 3000" ]
    volumeMounts:
    - name: db
      mountPath: "/etc/db"
      readOnly: true
  volumes:
  - name: db
    configMap:
      name: test-config4

進(jìn)入容器查看,看到在db文件夾下以每一個(gè)key為文件名value為值創(chuàng)建了多個(gè)文件。

[root@master ~]# kubectl exec -it mypod -- /bin/sh
/ # cd /etc/db
/etc/db # ls -al
total 0
drwxrwxrwx    3 root     root            89 Dec 16 05:23 .
drwxr-xr-x    1 root     root            16 Dec 16 05:23 ..
drwxr-xr-x    2 root     root            36 Dec 16 05:23 ..2018_12_16_05_23_04.654058863
lrwxrwxrwx    1 root     root            31 Dec 16 05:23 ..data -> ..2018_12_16_05_23_04.654058863
lrwxrwxrwx    1 root     root            14 Dec 16 05:23 db.host -> ..data/db.host
lrwxrwxrwx    1 root     root            14 Dec 16 05:23 db.port -> ..data/db.port
/etc/db # cat db.host 
172.18.8.200/etc/db # 

3.3、ConfigMap的熱更新

使用該 ConfigMap 掛載的 Env 不會(huì)同步更新;
使用該 ConfigMap 掛載的 Volume 中的數(shù)據(jù)需要一段時(shí)間(實(shí)測大概10秒)才能同步更新。

3.4、最佳使用方法

大多數(shù)情況下,配置信息都以文件形式提供,所以在創(chuàng)建 ConfigMap 時(shí)通常采用 --from-file 或 YAML 方式,讀取 ConfigMap 時(shí)通常采用 Volume 方式。
比如我們的 MySQL 配置文件/etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d

創(chuàng)建CongifMap。

kubectl create cm mysql-cm --from-file=/etc/my.cnf

查看創(chuàng)建好的cm。

[root@master ~]# kubectl get cm mysql-cm -o yaml
apiVersion: v1
data:
  my.cnf: |
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    symbolic-links=0
    [mysqld_safe]
    log-error=/var/log/mariadb/mariadb.log
    pid-file=/var/run/mariadb/mariadb.pid
    !includedir /etc/my.cnf.d
kind: ConfigMap
metadata:
  creationTimestamp: "2018-12-16T05:38:29Z"
  name: mysql-cm
  namespace: default
  resourceVersion: "9273"
  selfLink: /api/v1/namespaces/default/configmaps/mysql-cm
  uid: d1201233-00f4-11e9-9fa7-000c291fb1b3

在 Pod 中使用此 ConfigMap,配置文件為:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: busybox
    args: [ "/bin/sh", "-c", "sleep 3000" ]
    volumeMounts:
    - name: mysql
      mountPath: "/tmp"
  volumes:
  - name: mysql
    configMap:
      name: mysql-cm
      items:
      - key: my.cnf
        path: mysql/my.cnf

創(chuàng)建 Pod 并讀取配置信息:

[root@master ~]# kubectl exec -it mypod sh
/ # cat /tmp/mysql/my.cnf 
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
/ # exit

關(guān)于掛在路徑大家可以自行進(jìn)行修改。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI