本文經過搭建MySQL環境來了解k8s的重要概念,包括持久卷,網絡和參數配置。這是下篇,專門講解參數配置。若是你有些地方不能徹底看明白,請先看上篇"經過搭建MySQL掌握k8s(Kubernetes)重要概念(上):網絡與持久卷"。mysql
參數配置是K8s裏比較重要的一個概念,它包含了下面三個部分:sql
下面就是configMap(mysql-config.yaml)的配置文件。它的結構很簡單,最重要的就是data部分,裏面是鍵、值列表。這是比較簡單的一個例子,複雜的還能夠包含文件和鍵、值列表的組合。你能夠把configMap單獨放在一個文件裏,這樣調試起來比較方便,也能夠把它和部署(Deployment)放在一塊兒,這樣運行起來比較方便。shell
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的官方文檔裏是沒有的,但它也是可行的。不過缺點是不能包含別的文件。ubuntu
鍵入「kubectl get configMap」來顯示已建立好的configMap。api
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的配置文件(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編碼的,這裏只顯示了字節數,而沒有顯示值。app
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只是對數據進行了編碼,並無加密。所以你能夠經過反編碼得到原值,所以它並不安全。若是要想安全,你還要對他另外加密。編碼
環境變量通常是在部署裏面定義的,沒有單獨的配置文件。下面是部署配置文件裏的環境變量的片斷。「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