存储卷和环境变量都有一个共同问题是需要reload 或者重启才能生效。
核心资源类型存储卷,PV、PVC、SC、CSI(Longhorn)
kubelet In-Tree
特殊类型的插件:ConfigMap、Secret、downwardAPI
如何为容器化应用提供配置信息:
启动容器时,直接向应用程序传递参数,args: []
将定义好的配置文件焙进镜像之中;
通过环境变量向容器传递配置数据:有个前提要求,应用得支持从环境变量加载配置信息;
制作镜像时,使用entrypoint脚本来预处理变量,常见的做法就是使用非交互式编辑工具,将环境变量的值替换到应用的配置文件中;
基于存储卷向容器传递配置文件;
运行中的改变,需要由应用程序重载;
ConfigMap,以k/v格式保存配置项的名称和配置数据;使用cm 的两种方式。
1.由Pod中的容器以环境变量的方式从ConfigMap中加载特定的键的值;
2.可以让Pod直接将ConfigMap以存储卷的形式进行附加,而由容器挂载至指定目录下,从而获取到完整的配置 文件。
config还会自动重载,前提是服务支持重载
kubectl explain cm #查看configmap 的帮助信息
--from-literal #简单的环境变量信息,也可以是--from-file
手动创建configmap
[root@node01 ~]# kubectl create cm demoapp-config --from-literal=host=0.0.0.0 --from-literal=port=8080
configmap/demoapp-config created
[root@node01 ~]# kubectl get cm
NAME DATA AGE
demoapp-config 2 10s
[root@node01 ~]# kubectl get cm demoapp-config -o wide
NAME DATA AGE
demoapp-config 2 31s
[root@node01 ~]# kubectl get cm demoapp-config -o yaml
apiVersion: v1
data:
host: 0.0.0.0
port: "8080"
kind: ConfigMap
metadata:
creationTimestamp: "2021-12-26T05:54:38Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:host: {}
f:port: {}
manager: kubectl
operation: Update
time: "2021-12-26T05:54:38Z"
name: demoapp-config
namespace: default
resourceVersion: "1388753"
selfLink: /api/v1/namespaces/default/configmaps/demoapp-config
uid: 7c2b4170-3408-4b7b-8b4a-e40a77794d38
从文件中加载数据源
如果指定就以指定的文件当做键名称,如果不指定就以默认的文件名当做名称
指定目录当做数据源
示例1:基于键值的方式进行引用
[root@node01 chapter6]# cat configmaps-env-demo.yaml
# Maintainer: MageEdu <mage@magedu.com>
# URL: http://www.magedu.com
---
apiVersion: v1
kind: ConfigMap
metadata:
name: demoapp-config
namespace: default
data:
demoapp.port: "8090"
demoapp.host: 127.0.0.1
---
apiVersion: v1
kind: Pod
metadata:
name: configmaps-env-demo
namespace: default
spec:
containers:
- image: ikubernetes/demoapp:v1.0
name: demoapp
env:
- name: PORT
valueFrom:
configMapKeyRef:
name: demoapp-config
key: demoapp.port
optional: false
- name: HOST
valueFrom:
configMapKeyRef:
name: demoapp-config
key: demoapp.host
optional: true
optional: true、false 定义此值是否为必须项
实例2:基于存储卷的方式进行引用
补充知识
案例3;
configmap 既可以被容器环境变量引用的方式,也可以被挂载有限的文件
案例四:
单独被容器自己挑选。
单独挂载cm 资源一部分资源时。1. 在pod上定义存储卷的时候使用items明确指定只允许哪些键输出给存储卷。2.把整个存储卷全部附加到pod上,但容器中挂载指定文件
文件和目录都能挂载,subpath:读取存储卷中的一个子路径
问题:如何更改配置?
直接编辑configmap.那容器内部能不能生效呢。 这要取决 与容器内部能不能加载到相关配置。
原理:被两级连接,被连接的目录是一个时间戳
configmap其实也是配置中心
=====================================
secret是以非加密形式存储于apiserver的active 当中的.
ConfigMap的配置信息基本没有类别之分,但Secret有所不同,根据其用户存在类型的概念;
如下是三种类型:
docker-registry:专用于让kubelet启动Pod时从私有镜像仓库pull镜像时,首先认证到Registry时使用;
如果定义在pod 当中,如果换仓库,不利于修改。
kubelet 拖私有镜像认证到远端仓库的方法有两种。1.使用imagepullsecrets 2.使用serviceacount 之上额外自己定义的secret
tls:专门用于保存tls/ssl用到证书和配对儿的私钥;私钥统一命名tls.key tls.xxx
generic:余下的通用类型; 可以存在子类型
通用类型
通用类型中的子类型
basic 认证
--type="kubernetes.io/basic-auth"
--type="kubernetes.io/rbd"
--type="kubernetes.io/ssh-auth"
另外,保存有专用于ServiceAccount的相关的token信息的Secret资源会使用资源注解来保存其使用场景。
kind: Secret
metadata:
annotations:
kubernetes.io/service-account.name: node-controller
kubernetes.io/service-account.uid: b9f7e593-3e49-411c-87e2-dbd7ed9749c0
资源的元数据:除了name, namespace之外,常用的还有labels, annotations;
(1)annotation的名称遵循类似于labels的名称命名格式,但其数据长度不受限制;
(2)它不能用于被标签选择器作为筛选条件;但常用于为那些仍处于Beta阶段的应用程序提供临时的配置接口;
(3)管理命令:kubectl annotate TYPE/NAME KEY=VALUE, kubectl annotate TYPE/NAME KEY-
还有一种由kubeadm的bootstrap所使用的token专用的类型,它通常保存于kube-system名称空间,以bootstrap-token-为前缀。
--type="bootstrap.kubernetes.io/token"
---
tls 类型:
创建私钥
生成自签证书
TLS类型是一种独特的类型,在创建secret的命令行中,除了类型标识的不同之外,它还需要使用专用的选项--cert和--key。
无论证书和私钥文件名是什么,它们会统一为:
tls.crt
tls.key
---
docker registry
kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER \
--docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
如果以前访问并且认证过,通常
也能够从docker的认证文件中加载信息,这时使用--from-file选项;
$HOME/.dockercfg, ~/.docker/config.json
那怎么引用:
pod.spec.imagePullSecrets #这个字段进行引用。kubelet 从私有仓库下载镜像,认证到服务把镜像下载下来
docker server 为什么可以省略?
环境变量引用
使用环境变量传的配置,只是在容器初始化时有效。中间不会在运行中间再次传值
===========================
ssl 引用方式
Secret资源,使用环境变量
containers:
- name: …
image: …
env:
- name: <string> # 变量名,其值来自于某Secret对象上的指定键的值;
valueFrom: # 键值引用;
secretKeyRef:
name: <string> # 引用的Secret对象的名称,需要与该Pod位于同一名称空间;
key: <string> # 引用的Secret对象上的键,其值将传递给环境变量;
optional: <boolean> # 是否为可选引用;
envFrom: # 整体引用指定的Secret对象的全部键名和键值;
- prefix: <string> # 将所有键名引用为环境变量时统一添加的前缀;
secretRef:
name: <string> # 引用的Secret对象名称;
optional: <boolean> # 是否为可选引用;
---
downwardAPI
#资源限制的定义可能和实际在容器中free -m, /proc/cpuinfo 看到的是不一样的。后边两个命令可能取实际节点的值。
downwardAPI存储卷类型,从严格意义上来说,downwardAPI不是存储卷,它自身就存在,原因在于,它引用的是Pod自身的运行环境信息,这些信息在Pod启动手就存在。
类似于ConfigMap或Secret资源,容器能够在环境变量中在valueFrom字段中嵌套fieldRef或resourceFieldRef字段来引用其所属Pod对象的元数据信息。不过,通常只有常量类型的属性才能够通过环境变量注入到容器中,毕竟,在进程启动完成后无法再向其告知变量值的变动,于是,环境变量也就不支持中途的更新操作。容器规范中可在环境变量配置中的valueFrom通过内嵌字段fieldRef引用的信息包括如下这些:
metadata.name:Pod对象的名称;
metadata.namespace:Pod对象隶属的名称空间;
metadata.uid:Pod对象的UID;
metadata.labels['<KEY>']:Pod对象标签中的指定键的值,例如metadata.labels['mylabel'],仅Kubernetes 1.9及之后的版本才支持;
metadata.annotations['<KEY>']:Pod对象注解信息中的指定键的值,仅Kubernetes 1.9及之后的版本才支持。
# 不需要事先定义,本身就是pod 本身的属性,可以理解为一种存储卷类型是因为他也可以用存储卷的方式进行注入
这些信息来自于apiserver的查询。
downwardAPI存储卷类型,从严格意义上来说,downwardAPI不是存储卷,它自身就存在,原因在于,它引用的是Pod自身的运行环境信息,这些信息在Pod启动手就存在。
类似于ConfigMap或Secret资源,容器能够在环境变量中在valueFrom字段中嵌套fieldRef或resourceFieldRef字段来引用其所属Pod对象的元数据信息。不过,通常只有常量类型的属性才能够通过环境变量注入到容器中,毕竟,在进程启动完成后无法再向其告知变量值的变动,于是,环境变量也就不支持中途的更新操作。容器规范中可在环境变量配置中的valueFrom通过内嵌字段fieldRef引用的信息包括如下这些:
metadata.name:Pod对象的名称;
metadata.namespace:Pod对象隶属的名称空间;
metadata.uid:Pod对象的UID;
metadata.labels['<KEY>']:Pod对象标签中的指定键的值,例如metadata.labels['mylabel'],仅Kubernetes 1.9及之后的版本才支持;
metadata.annotations['<KEY>']:Pod对象注解信息中的指定键的值,仅Kubernetes 1.9及之后的版本才支持。
容器上的计算资源需求和资源限制相关的信息,以及临时存储资源需求和资源限制相关的信息可通过容器规范中的resourceFieldRef字段引用,相关字段包括requests.cpu、limits.cpu、requests.memory和limits.memory等。另外,可通过环境变量引用的信息有如下几个:
status.podIP:Pod对象的IP地址
spec.serviceAccountName:Pod对象使用的ServiceAccount资源名称
spec.nodeName:节点名称
status.hostIP:节点IP地址
另外,还可以通过resourceFieldRef字段引用当前容器的资源请求及资源限额的定义,因此它们包括requests.cpu、requests.memory、requests.ephemeral-storage、limits.cpu、limits.memory和limits.ephemeral-storage这6项。