一、Pod 配置管理
可变配置用 ConfigMap;
敏感信息用 Secret;
身份认证用 ServiceAccount 这几个独立的资源来实现的;
资源配置用 Resources;
安全管控用 SecurityContext;
前置校验用 InitContainers 这几个在 spec 里面加的字段,来实现的这些配置管理。
二、ConfigMap
1、介绍
ConfigMap 主要是管理可变配置信息,比如配置文件,环境变量,或者命令行参数。
它的好处在于它可以让可变配置和容器镜像进行解耦,保证了容器的可移植性。
2、创建
kubectl create configmap [NAME] [DATA]
用 kubectl 这个命令来创建,它带的参数主要有两个:一个是指定 name,第二个是 DATA。其中 DATA 可以通过指定文件或者指定目录,以及直接指定键值对。
3、使用
ConfigMap主要被Pod使用。
● 第一种是环境变量。通过 valueFrom 下的 ConfigMapKeyRef 这个字段,name 指定 ConfigMap 名,key 是 ConfigMap.data 里面的 key。
● 第二个是命令行参数。
● 最后一个是通过 volume 挂载的方式直接挂到容器的某一个目录下面去。
4、注意要点
① ConfigMap 文件的大小。虽然说 ConfigMap 文件没有大小限制,但是在 ETCD 里面,数据的写入是有大小限制的,现在是限制在 1MB 以内。
② 第二个注意点是 pod 引入 ConfigMap 的时候,必须是相同的 Namespace 中的 ConfigMap。
③ 第三个是 pod 引用的 ConfigMap。假如这个 ConfigMap 不存在,那么这个 pod 是无法创建成功的,这也表示在创建 pod 前,必须先把要引用的 ConfigMap 创建好。
三、secret
1、介绍
Secret 是一个主要用来存储密码 token 等一些敏感信息的资源对象。
2、创建
有两种创建方式:
① 系统创建:K8s 为每一个 namespace 的默认用户(default ServiceAccount)创建 Secret。
② 用户手动创建: kubectl create secret generic [NAME] [DATA] [TYPE],DATA 可以指定文件/键值对,TYPE 默认为Opaque。
3、使用
Secret 主要是被 pod 来使用,一般是通过 volume 形式挂载到容器里指定的目录,然后容器里的业务进程再到目录下读取 Secret 来进行使用。
四、ServiceAccount
Pod 创建时 Admission Controller 会根据指定的 ServiceAccount (默认为default)把对应的 Secret 挂载到容器中固定的目录下。
当 Pod 访问集群时,可以默认利用 Secret 其中的 token 文件来认证 Pod 的身份。
五、Resource
1、介绍
Resource 容器资源配置管理。目前内部支持类型有三种:CPU、内存,以及临时存储。资源配置主要分成 request 和 limit 两种类型,一个是需要的数量,一个是资源的界限。CPU、内存以及临时存储都是在 container 下的 Resource 字段里进行一个声明。
2、Pod 服务质量 (QoS) 配置
根据 CPU 对容器内存资源的需求,对 pod 的服务质量进行一个分类,分别是 Guaranteed、Burstable 和 BestEffort。
① Guaranteed :pod 里面每个容器都必须有内存和 CPU 的 request 以及 limit 的一个声明,且 request 和 limit 必须是一样的,这就是 Guaranteed;
② Burstable:Burstable 至少有一个容器存在内存和 CPU 的一个 request;
③ BestEffort:只要不是 Guaranteed 和 Burstable,那就是 BestEffort。
六、SecurityContext
SecurityContext 主要是用于限制容器的一个行为,它能保证系统和其他容器的安全。
SecurityContext 主要分为三个级别:
第一个是容器级别,仅对容器生效;
第二个是 pod 级别,对 pod 里所有容器生效;
第三个是集群级别,就是 PSP,对集群内所有 pod 生效。
七、InitContainer
1、InitContainer 和普通 container 的区别
① InitContainer 首先会比普通 container 先启动,并且直到所有的 InitContainer 执行成功后,普通 container 才会被启动;
② InitContainer 之间是按定义的次序去启动执行的,执行成功一个之后再执行第二个,而普通的 container 是并发启动的;
③ InitContainer 执行成功后就结束退出,而普通容器可能会一直在执行。
2、InitContainer 的用途
InitContainer 主要为普通 container 服务,比如为普通 container 启动之前做一个初始化,或者为它准备一些配置文件。