PodPreset 用来给指定标签的 Pod 注入额外的信息,如环境变量、存储卷等。这样,Pod 模板就不需要为每个 Pod 都显式设置重复的信息。
当然,你也可以给 Pod 增加注解 podpreset.admission.kubernetes.io/exclude: "true"
来避免它们被 PodPreset 修改。
Kubernetes 版本 | API 版本 | 默认开启 |
v1.6+ | settings.k8s.io/v1alpha1 | 否 |
开启 API kube-apiserver --runtime-config=settings.k8s.io/v1alpha1=true
开启准入控制 --enable-admission-plugins=..,PodPreset
增加环境变量和存储卷的 PodPreset
kind: PodPresetapiVersion: settings.k8s.io/v1alpha1metadata:name: allow-databasenamespace: mynsspec:selector:matchLabels:role: frontendenv:- name: DB_PORTvalue: "6379"volumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir: {}
用户提交 Pod
apiVersion: v1kind: Podmetadata:name: websitelabels:app: websiterole: frontendspec:containers:- name: websiteimage: ecorp/websiteports:- containerPort: 80
经过准入控制 PodPreset
后,Pod 会自动增加环境变量和存储卷
apiVersion: v1kind: Podmetadata:name: websitelabels:app: websiterole: frontendannotations:podpreset.admission.kubernetes.io/allow-database: "resource version"spec:containers:- name: websiteimage: ecorp/websitevolumeMounts:- mountPath: /cachename: cache-volumeports:- containerPort: 80env:- name: DB_PORTvalue: "6379"volumes:- name: cache-volumeemptyDir: {}
ConfigMap
apiVersion: v1kind: ConfigMapmetadata:name: etcd-env-configdata:number_of_members: "1"initial_cluster_state: newinitial_cluster_token: DUMMY_ETCD_INITIAL_CLUSTER_TOKENdiscovery_token: DUMMY_ETCD_DISCOVERY_TOKENdiscovery_url: http://etcd_discovery:2379etcdctl_peers: http://etcd:2379duplicate_key: FROM_CONFIG_MAPREPLACE_ME: "a value"
PodPreset
kind: PodPresetapiVersion: settings.k8s.io/v1alpha1metadata:name: allow-databasenamespace: mynsspec:selector:matchLabels:role: frontendenv:- name: DB_PORTvalue: 6379- name: duplicate_keyvalue: FROM_ENV- name: expansionvalue: $(REPLACE_ME)envFrom:- configMapRef:name: etcd-env-configvolumeMounts:- mountPath: /cachename: cache-volume- mountPath: /etc/app/config.jsonreadOnly: truename: secret-volumevolumes:- name: cache-volumeemptyDir: {}- name: secret-volumesecretName: config-details
用户提交的 Pod
apiVersion: v1kind: Podmetadata:name: websitelabels:app: websiterole: frontendspec:containers:- name: websiteimage: ecorp/websiteports:- containerPort: 80
经过准入控制 PodPreset
后,Pod 会自动增加 ConfigMap 环境变量
apiVersion: v1kind: Podmetadata:name: websitelabels:app: websiterole: frontendannotations:podpreset.admission.kubernetes.io/allow-database: "resource version"spec:containers:- name: websiteimage: ecorp/websitevolumeMounts:- mountPath: /cachename: cache-volume- mountPath: /etc/app/config.jsonreadOnly: truename: secret-volumeports:- containerPort: 80env:- name: DB_PORTvalue: "6379"- name: duplicate_keyvalue: FROM_ENV- name: expansionvalue: $(REPLACE_ME)envFrom:- configMapRef:name: etcd-env-configvolumes:- name: cache-volumeemptyDir: {}- name: secret-volumesecretName: config-details
下面的示例会把带有标签 tz: shanghai
的所有Pod都自动改成上海时区:
kind: PodPresetapiVersion: settings.k8s.io/v1alpha1metadata:name: tz-shanghainamespace: defaultspec:selector:matchLabels:tz: shanghaivolumeMounts:- mountPath: /etc/localtimename: tz-configvolumes:- name: tz-confighostPath:path: /usr/share/zoneinfo/Asia/Shanghai