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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自blog.csdn.net/wasd12121212/article/details/83143665