K8S之配置信息应用
在K8S中,为容器提供预先定义好的数据,K8S支持四种volume:Secret、ConfigMap、DownloadAPI、ServiceAccountToken
Secret
把Pod想要访问的加密数据存放到etcd中,然后可以在Pod容器通过挂载的方式访问secret里保存的数据
一旦secret被创建,我们可以通过三种方式使用
- 在创建Pod时,通过为Pod指定service account来自动使用secret
- 通过挂载该secret到Pod来使用它
- 在Docker镜像下载时使用,通过指定Pod的spc.ImagePullSecrets来引用它
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-test
labels:
app: pod-volume-test
spec:
containers:
- name: volume-secret-test
image: xxx
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
volumeMounts:
- name: my-secret
mouthPath: "/project-volume"
readOnly: true
volumes:
- name: my-secret
projected:
sources:
- secret:
name: my-secret-volume
-------------
apiVersion: v1
kind: Secret
metadata:
name: my-secret-volume
type: Opaque
data:
user: cm9vdA==
password: UEBzc1cwcmQ=
通过这种方式挂载的secret,如果单个数据被更新,这些volume里的内容不会被更新,如要更新,重新apply或删除重建
ConfigMap
configMap 保存的数据不需要加密,比如存放应用的配置信息
定义配置信息yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-app-params
labels:
app: my-app
data:
db.host: localhost
db.port: "3306"
使用上述定义配置信息
apiVersion: v1
kind: Pod
metadata:
name: env-configmap
labels:
app: env-configmap-db
spec:
containers:
- name: test-configmap
image: xxx
command:
- "/bin/sh"
- "-c"
- "env"
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: my-app-params
key: db.host
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: my-app-params
key: db.port
envFrom:
- configMapRef:
name: my-app-params
DownloadAPI
让这个Pod里的容器可以直接获取这个Pod API对象本身的信息
apiVersion: v1
kind: Pod
metadata:
name: test-downwardapi-volume
labels:
zone: us-est-coast
cluster: test-cluster1
rack: rack-22
spec:
containers:
- name: client-container
image: k8s.gcr.io/xxxx
command: ["sh", "-c"]
args:
- while true; do
if [[ -e /etc/podinfo/labels ]]; then
echo -en '\n\n'; cat /etc/podinfo/labels; fi;
sleep 5;
done;
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
readOnly: false
volumes:
- name: podinfo
projected:
sources:
- downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
ServiceAccountToken
ServiceAccountToken是K8S内置一种服务账户,是K8S进行权限分配的对象。ServiceAccountToken的授权信息和文件保存在
secret对象中,它是一个特殊的secret对象。任何运行在K8S集群上的应用,都必须使用ServiceAccountToken里保存的授权信息,
也就是token,这样才能合法访问API Server。K8S已经提供一个默认的服务账户,任何一个运行在K8S里的Pod,都可以无显示声明地
挂载ServiceAccountToken并使用它