1. 程式人生 > >k8s volumn與配置管理

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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。