HAOJX

kubernetes动态准入控制Initializers是什么

字数统计: 492阅读时长: 2 min
2018/11/10 Share

在kubernetes中 , 当一个 Pod 或者任何一个 API 对象被提交给 APISServer 之后,总有一些“初始化”性质的工作需要在它们被处理 , 比如为所有pod加上某些标签 , 在实际中的应用的话, 可以体现在以下方面

  • 为即将创建的每个或者某些特定的pod都自动插入一个SideCar容器
  • 为即将创建的每个或者某些特定的pod都自动添加一些环境变量或者设置
  • 检测secret长度 , 如果不满足就拒绝

Initializers的工作原理和使用方法

将一个编写好的 Initializer,作为一个 Pod 部署在kubernetes中, 可以用pod或者deployment部署 , 定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: apps/v1
kind: Deployment
metadata:
initializers:
pending: []
labels:
app: envoy-initializer
name: envoy-initializer
spec:
replicas: 1
template:
metadata:
labels:
app: envoy-initializer
name: envoy-initializer
spec:
containers:
- name: envoy-initializer
image: envoy-initializer:0.0.1
imagePullPolicy: Always
args:
- "-annotation=initializer.kubernetes.io/envoy"
- "-require-annotation=true"

部署envoy-initializer时,千万要注意设置metadata.initializers.pending为空,防止envoy-initializer的部署被自己stuck了。

或者

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Pod
metadata:
labels:
app: envoy-initializer
name: envoy-initializer
spec:
containers:
- name: envoy-initializer
image: envoy-initializer:0.0.1
imagePullPolicy: Always

然后创建你的initializerConfigurationAPI Object , 可以指定要对什么样的资源进行Initialize操作 , 比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: admissionregistration.k8s.io/v1alpha1
kind: InitializerConfiguration
metadata:
name: envoy-config
initializers:
// 这个名字必须至少包括两个 "."
- name: envoy.initializer.kubernetes.io
rules:
- apiGroups:
- "" // 前面说过, "" 就是 core API Group 的意思
apiVersions:
- v1
resources:
- pods

这就是要对所有的pod执行这个Initialize操作

一旦InitializerConfiguration被创建 , 就会对在所有的pod上加上一个metadata信息metadata.initializers.pending

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
initializers:
pending:
- name: envoy.initializer.kubernetes.io
name: myapp-pod
labels:
app: myapp
...

这个metadata信息是判断这个pod有没有执行过initalizer的依据 , 如果初始化完了之后要把metadata.initializers.pending的标志去掉

如果要是想指定某个initializer的话, 可以在部署pod的时候声明

1
2
3
4
5
6
apiVersion: v1
kind: Pod
metadata
annotations:
"initializer.kubernetes.io/envoy": "true"
...

这样就会用到我们之前定义的envoy-initializer 了

CATALOG
  1. 1. Initializers的工作原理和使用方法