本文通過搭建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
=https://www.cnblogs.com/code-craftsman/p/===
db-host:
----
mysql
db-name:
----
service_config
Events:
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
=https://www.cnblogs.com/code-craftsman/p/===
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
索引
- Secrets
- Configure a Pod to Use a ConfigMap
- Expose Pod Information to Containers Through Files
本文由博客一文多發平臺 OpenWrite 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/62133.html
標籤:其他
上一篇:通過搭建MySQL掌握k8s(Kubernetes)重要概念(上):網路與持久卷
下一篇:2019云棲大會精品資料免費下載
