在kubernetes中,一个Pod容器要运行,可能会用到多种配置信息,比如应用配置文件、环境变量、命令行参数、账号密码、token等信息,以及Pod运行时所需要的CPU和内存资源,还有Pod在集群中的身份认证问题等等。
在k8s中这些都是如何管理起来的?主要有以下几种方式:
- ConfigMap:可变配置(环境变量、配置文件、命令参数等)
- Secret:敏感信息(账号密码、Token等)
- ServiceAccount:身份认证
- Spec.Containers.Resources.limits/requests: 资源限制
- Spec.Containers.SecurityContext:安全管控
- InitContainer:前置校验
一、ConfigMap
用于保存Pod容器运行时所需的配置信息,比如应用的一些配置文件、环境变量、命令参数等,这些信息都是明文的。
1、创建ConfigMap
语法:
kubectl create configmap --help
kubectl create configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1]
示例1:从文件中导入配置信息
$ kubectl create configmap kube-flannel-cfg --from-file=cni-conf.json --from-file=net-conf.json
$ kubectl get configmap kube-flannel-cfg -o yaml -n kube-system
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-flannel-cfg
namespace: kube-system
data:
cni-conf.json: |
{
"name": "cb0",
"type": "flannel",
"delegate": {
"isDefaultGateway": true
}
}
net-conf.json: |
{
"Network": "172.16.0.0/16",
"Backend": {
"Type": "alloc"
}
}
示例2:命令行中指定配置信息
$ kubectl create configmap test-conf --from-literal=proxy-body-size=20m --from-literal=proxy-connect-timeout="10" --from-literal=special.keyid='123'
$ kubectl get configmap test-conf -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: test-conf
namespace: default
data:
proxy-body-size: 20m
proxy-connect-timeout: "10"
special.keyid: "123"
2、使用ConfigMap
要提前创建好以下两个configmap:
$ kubectl get configmap cloud-config -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cloud-config
namespace: default
data:
special.keyid: 123
special.keysecret: abc
$ kubectl get configmap env-config -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
log_level: INFO
方式1:用作环境变量
通过 spec.containers.env.valueFrom.configMapKeyRef 字段来设置成环境变量,环境变量会注入到Pod容器中。
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: ACCESS_KEY_ID
valueFrom:
configMapKeyRef:
name: cloud-config # name指定为ConfigMap名称
key: special.keyid # 指定ConfigMap.data里面的key
- name: ACCESS_KEY_SECRET
valueFrom:
configMapKeyRef:
name: cloud-config
key: special.keysecret
envFrom: # envFrom是导入指定ConfigMap的所有信息
- configMapRef:
name: env-config
进入Pod容器里,执行env命令,就会看到 ACCESS_KEY_ID 和 ACCESS_KEY_SECRET 变量。如果ConfigMap里有些key是无效的,比如key名