通過搭建MySQL掌握k8s(Kubernetes)重要概念(下):參數配置


本文通過搭建MySQL環境來了解k8s的重要概念,包括持久卷,網絡和參數配置。這是下篇,專門講解參數配置。如果你有些地方不能完全看明白,請先看上篇"通過搭建MySQL掌握k8s(Kubernetes)重要概念(上):網絡與持久卷"。

配置參數:

參數配置是K8s里比較重要的一個概念,它包含了下面三個部分:

  • ConfigMap:是用來保存共享配置數據的。當你需要在不同的配置文件之間共享數據時,你可以把這些數據以鍵值對的形式存儲在configMap中。詳情請見"Configure a Pod to Use a ConfigMap"
  • Secret:它跟configMap的作用很類似,但是用來存儲保密信息的,例如數據庫的口令。詳情請見"Secrets"
  • Environment Variable: 它就是我們所熟悉的環境變量,一般是由系統來定義。不同的系統例如Linux和Windows都有自己的方法來定義環境變量。k8s的環境變量主要是用來向容器傳遞數據的。詳情請見"Container Environment Variables"

configMap:

下面就是configMap(mysql-config.yaml)的配置文件。它的結構很簡單,最重要的就是data部分,里面是鍵、值列表。這是比較簡單的一個例子,復雜的還可以包含文件和鍵、值列表的組合。你可以把configMap單獨放在一個文件里,這樣調試起來比較方便,也可以把它和部署(Deployment)放在一起,這樣運行起來比較方便。

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config  # name of ConfigMap, referenced in other files
data:
  db-host: mysql   # host address of mysql server
  db-name: service_config # name of the database

configMap的運行命令與其它對象不同,例如一般的運行命令是“kubectl apply -f mysql-volume.yaml”或“kubectl create -f mysql-volume.yaml”,你只要給出配置文件名就行了,不需要給出要創建的對象的類別(它是自動識別的)和名字,因為在配置文件里已經有了(例如“kind: ConfigMap”,就表示對象類別是“ConfigMap”。“name: mysql-config” 就表示要創建的configMap的名字是“mysql-config”)。但configMap的創建命令是"kubectl create configmap [map-name] [data-source]",對象類別和名字都要在命令行里明確給出,[map-name] 是要創建的configMap的名字。“[data-source]”是數據來源文件的文件名(不是配置文件的文件名),我們上面提到過,configMap可以包含別的文件里的鍵、值列表,“[data-source]”就是“別的文件”的文件名。注意這個命令里就根本沒有提到配置文件。我不太喜歡這種方式,因為當你在部署配置里引用鍵、值對時,需要給出configMap的名字,如果它不是存在文件里,而是在創建時敲入,這樣很容易出錯。

因此我還是采用了通用的創建命令“kubectl apply -f mysql-config.yaml”來創建configMap,這種方式在k8s的官方文檔里是沒有的,但它也是可行的。不過缺點是不能包含別的文件。

鍵入“kubectl get configMap”來顯示已創建好的configMap。

vagrant@ubuntu-xenial:/var/log$ kubectl get configMap
NAME           DATA   AGE
mysql-config   2      11h

鍵入“kubectl describe configMap”來顯示configMap的詳細信息。

vagrant@ubuntu-xenial:/var/log$ kubectl describe configMap
Name:         mysql-config
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"v1","data":{"db-host":"mysql","db-name":"service_config"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"mysql-con...

Data
====
db-host:
----
mysql
db-name:
----
service_config
Events:  <none>

secret:

下面就是secret的配置文件(mysql-secret.yaml),它與configMap很像,在“data”下面就是鍵、值列表,只不過里面的鍵的值是經過base64編碼的(例如“cm9vdA==
”)。你可以在Linux里運行命令“echo -n dbuser | base64”獲得“dbuser”的編碼,輸出是“ZGJ1c2Vy”, 再把它寫入secret里去。在下面文件里存儲了數據庫用戶名和口令。

apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
data:
  mysql-user-root-pwd: cm9vdA== # database password for "root"
  mysql-user-dbuser-name: ZGJ1c2Vy # database user name for "dbuser"
  mysql-user-dbuser-pwd: ZGJ1c2Vy # database password for "dbuser"

secret的運行方式與其他對象是一樣的, 創建之后可以用“kubectl describe secret mysql-secret”命令顯示secret詳細信息,其中“mysql-secret”是secret的名字。因為值是經過base64編碼的,這里只顯示了字節數,而沒有顯示值。

vagrant@ubuntu-xenial:/var/log$ kubectl describe secret mysql-secret
Name:         mysql-secret
Namespace:    default
Labels:       <none>
Annotations:
Type:         Opaque

Data
====
mysql-user-dbuser-name:  6 bytes
mysql-user-dbuser-pwd:   6 bytes
mysql-user-root-pwd:     4 bytes

值得注意的是secret只是對數據進行了編碼,並沒有加密。因此你可以通過反編碼獲得原值,因此它並不安全。如果要想安全,你還要對他另外加密。

Environment Variable:

環境變量一般是在部署里面定義的,沒有單獨的配置文件。下面是部署配置文件里的環境變量的片段。“MYSQL_ROOT_PASSWORD”是環境變量名,“secretKeyRef”說明它的值來自於secret,“name: mysql-secret”是secret的名字,“key: mysql-user-root-pwd”是secret里的鍵名,它的最終含義就是環境變量“MYSQL_ROOT_PASSWORD”的值是由“mysql-user-root-pwd”來定義,而“mysql-user-root-pwd”是secret里面的一個鍵。

 env:
     - name: MYSQL_ROOT_PASSWORD
       valueFrom:
          secretKeyRef:
            name: mysql-secret
            key: mysql-user-root-pwd

下面是另一個定義環境變量的片段,與上面的類似,只不過它的鍵值來自於configMap,而不是secret。

 env:
     - name: MYSQL_DATABASE
          valueFrom:
            configMapKeyRef:
               name: mysql-config
               key: db-name

部署文件:

下面是引用了configMap和secret的部署文件,它與前面提到的部署文件很類似,只不過把共享的數據提取了出來放到了configMap和secret里面。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
  labels:
    app: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - image: mysql:5.7
          name: mysql-con
          imagePullPolicy: Never
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: mysql-user-root-pwd
            - name: MYSQL_USER_NAME
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: mysql-user-dbuser-name
            - name: MYSQL_USER_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: mysql-user-dbuser-pwd
            - name: MYSQL_DATABASE
              valueFrom:
                configMapKeyRef:
                  name: mysql-config
                  key: db-name
          args: ["--default-authentication-plugin=mysql_native_password"]
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
      volumes:
        - name: mysql-persistent-storage
          persistentVolumeClaim:
          claimName: mysql-pv-claim

索引

  1. Secrets
  2. Configure a Pod to Use a ConfigMap
  3. Expose Pod Information to Containers Through Files

本文由博客一文多發平台 OpenWrite 發布!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM