k8s volumn与配置管理
1pod定义详解下面是一个完整的yaml格式定义的文件,注意格式,子集包含关系,不要有tab,要用空格。不是所有的元素都要写,按照实际应用场景配置即可。apiVersion: v1//版本kind: pod//类型,podmetadata://元数据name: String...
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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
更多推荐
所有评论(0)