k8s volumn與配置管理
1pod定義詳解
下面是一個完整的yaml格式定義的檔案,注意格式,子集包含關係,不要有tab,要用空格。不是所有的元素都要寫,按照實際應用場景配置即可。
apiVersion: v1 //版本 kind: pod //型別,pod metadata: //元資料 name: String //元資料,pod的名字 namespace: String //元資料,pod的名稱空間 labels: //元資料,標籤列表 - name: String //元資料,標籤的名字 annotations: //元資料,自定義註解列表 - name: String //元資料,自定義註解名字 spec: //pod中容器的詳細定義 containers: //pod中的容器列表,可以有多個容器 - name: String image: String //容器中的映象 imagesPullPolicy: [Always|Never|IfNotPresent]//獲取映象的策略 command: [String] //容器的啟動命令列表(不配置的話使用映象內部的命令) args: [String] //啟動引數列表 workingDir: String //容器的工作目錄 volumeMounts: //掛載到到容器內部的儲存卷設定 - name: String mountPath: String readOnly: boolean ports: //容器需要暴露的埠號列表 - name: String containerPort: int //容器要暴露的埠 hostPort: int //容器所在主機監聽的埠(容器暴露埠對映到宿主機的埠) protocol: String env: //容器執行前要設定的環境列表 - name: String value: String resources: //資源限制 limits: cpu: Srting memory: String requeste: cpu: String memory: String livenessProbe: //pod內容器健康檢查的設定 exec: command: [String] httpGet: //通過httpget檢查健康 path: String port: number host: String scheme: Srtring httpHeaders: - name: Stirng value: String tcpSocket: //通過tcpSocket檢查健康 port: number initialDelaySeconds: 0//首次檢查時間 timeoutSeconds: 0 //檢查超時時間 periodSeconds: 0 //檢查間隔時間 successThreshold: 0 failureThreshold: 0 securityContext: //安全配置 privileged: falae restartPolicy: [Always|Never|OnFailure]//重啟策略 nodeSelector: object //節點選擇 imagePullSecrets: - name: String hostNetwork: false //是否使用主機網路模式,預設否 volumes: //在該pod上定義共享儲存卷 - name: String meptyDir: {} hostPath: path: string secret: //型別為secret的儲存卷 secretName: String item: - key: String path: String configMap: //型別為configMap的儲存卷 name: String items: - key: String path: String
4pod容器共享volume
在pod中定義容器的時候可以為單個容器配置volume,然後也可以為一個pod中的多個容器定義一個共享的pod 級別的volume。 那為啥要這樣做呢,比如你在一個pod裡定義了一個web容器,然後把生成的日誌檔案放在了一個資料夾,你還定義了一個分析日誌的容器,那這個時候你就可以把這放日誌的檔案配置為共享的,這樣一個容器生產,一個容器度就好了。
下面是一個使用共享volume的配置示例
apiVersion: v1 kind: Pod metadata: name: volume-pod spec: containers: - name: tomcat image: tomcat ports: - containerPort: 8080 volumeMounts: - name: app-logs mountPath: /usr/local/tomcat/logs - name: loganalysis image: loganalysis volumeMounts: - name: app-logs mountPath: /usr/local/tomcat/logs volumes: - name: app-logs emptyDir: {}
這個配置檔案除了“emptyDir: {}”這個地方有點詭異以為,其他地方我估計大家一看就能明白,在最下面定義了一個叫“app-logs”的volume,然後上面的兩個容器來使用它就好了。
然後現在來說說“emptyDir: {}”,其實這個地方有三種選擇
volumes: - name: app-logs emptyDir: {} volumes: - name: app-logs hostPth: path: "/data" volumes: - name: app-logs gcePersistenDisk: pdName: my-data-disk //my-data-disk需要先建立好 fsType: ext4
emptyDir是Pod分配到Node後建立的,他的初始內容為空,pod在Node上移除以後也就被銷燬了。
hostPath是掛載到宿主機上的目錄,比較適用於需要永久儲存的資料
gcePersistenDisk 表示使用谷歌公有云提供的磁碟
建立my-data-disk: gcloud compute disks create --size=500GB --zone=us-centrall-a my-data-disk
5pod的配置管理
應用部署的一個最佳實踐,就是將應用所需的配置資訊與程式進行分離
kubernetes 提供了一種的叢集配置管理方案,即ConfigMap,就是將一些環境變數或者配置檔案定義為configmap,放在kubernetes中,可以讓其他pod 呼叫
configmap 有以下典型的用法
1 生成為容器內的環境變數
2 設定容器啟動命令的啟動引數(需設定為環境變數)
3 以volume的形式掛載為容器內部的檔案或目錄
侷限:
1ConfigMap 必須在pod之前建立
2ConfigMap也可以定於屬於某個NameSpace,只有處於相同NameSpace的pod可以應用它
3ConfigMap中的配額管理還未實現
4如果是volume的形式掛載到容器內部,只能掛載到某個目錄下,該目錄下原有的檔案會被覆蓋掉
5靜態不能用configmap(靜態pod 不受API server 管理)
下面是使用ConfigMap的示例
1定義一個ConfigMap 配置檔案 cm-appvars.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appvars
data:
apploglevel: info
appdatadir: /var/date
2建立ConfigMap: kubectl create -f cm-appvars.yaml
3使用ConfigMap(環境變數的形式)
apiVersion: v1
kind: Pod
metadata:
name: cm-test-pod
spec:
containers:
- name: cm-test
image: busybux
env:
- name: APPLOGLEVEL
vlaueFrom:
configMapKeyRef:
name: cm-appvars //要和之前建立的ConfigMap的name對應
key: apploglevel
- name: APPDATADIR
vlaueFrom:
configMapKeyRef:
name: cm-appvars //要和之前建立的ConfigMap的name對應
key: appdatadir
除了可以定義簡單的k-v鍵值對,還可以將整個配置檔案定義成ConfigMap
比如server.xml logging.properties(使用volumeMount的形式,掛載到容器內部)
1定義一個ConfigMap 配置檔案 cm-jdbcproperties.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-jdbcproperties
data:
key-jdbcproperties: |
JDBC_DRIVER_CLASS_NAME=com.mysql.jdbc.Driver
JDBC_URL=jdbc:mysql://localhost:3306/bz_argon?useUnicode=true&characterEncoding=utf8
JDBC_USER_NAME=root
JDBC_PASSWORD=maojiancai
JDBC_INITIALSIZE=10
JDBC_MAXACTIVE=20
JDBC_MAXIDLE=20
JDBC_MINIDLE=10
JDBC_MAXWAIT=60000
JDBC_VALIDATIONQUERY=SELECT 1 FROM DUAL
JDBC_TESTONBORROW=false
JDBC_TESTONRETURN=false
JDBC_TESTWHILEIDLE=true
JDBC_TIMEBETWEENEVICTIONRUNSMILLIS=6000
JDBC_MINEVICTABLEIDLETIMEMILLIS=25200000
JDBC_REMOVEABANDONED=true
JDBC_REMOVEABANDONEDTIMEOUT=1800
JDBC_LOGABANDONED=true
2建立ConfigMap: kubectl create -f cm-jdbcproperties.yaml
3使用ConfigMap(使用volumeMount的形式)
apiVersion: v1
kind: Pod
metadata:
name: cm-test-app
spec:
containers:
- name: cm-test-app
image: cm-test-app
ports:
- containerPort: 8080
volumeMounts:
- name: jdbcproperties //應用下面定義的volumes名
mountPath: /configfiles
volumes:
- name: jdbcproperties //volumes名
configMap:
name: cm-jdbcproperties//這個名字是第二步建立的configMap
items:
- key: key-jdbcproperties
path: jdbc.properties
再提醒一下;
如果是volume的形式掛載到容器內部,只能掛載到某個目錄下,該目錄下原有的檔案會被覆蓋掉
Add ConfigMap data to a Volume
As explained in Create ConfigMaps from files, when you create a ConfigMap using --from-file
, the filename becomes a key stored in the data
section of the ConfigMap. The file contents become the key’s value.
The examples in this section refer to a ConfigMap named special-config, shown below.
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.level: very
special.type: charm
Populate a Volume with data stored in a ConfigMap
Add the ConfigMap name under the volumes
section of the Pod specification. This adds the ConfigMap data to the directory specified as volumeMounts.mountPath
(in this case, /etc/config
). The command
section references the special.level
item stored in the ConfigMap.
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "ls /etc/config/" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
# Provide the name of the ConfigMap containing the files you want
# to add to the container
name: special-config
restartPolicy: Never
When the pod runs, the command ("ls /etc/config/"
) produces the output below:
special.level
special.type
作者:愛喝咖啡的土撥鼠
連結:https://www.jianshu.com/p/d867539a15cf
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。