配置ClusterExtensionProfile或ExtensionProfile
对于将工作负载调度到CCI 2.0的场景,用户可以通过配置ClusterExtensionProfile或ExtensionProfile对象来调度到CCI 2.0的Pod,灵活使用Cluster级别的ClusterExtensionProfile,Namespaced级别的ExtensionProfile对调度到CCI 2.0的pod进行配置,从而减少对业务YAML的修改。
配置ClusterExtensionProfile
- 生成YAML文件。
YAML示例:
apiVersion: bursting.cci.io/v1 kind: ClusterExtensionProfile metadata: name: test-cluster-profile spec: actions: annotations: #给Pod追加Annotations annotation1: value1 labels: #给Pod追加Labels label1: value1 imageReplacement: #给Pod添加镜像地址转换策略 - replaceWith: xxx.com/yyy repositoryPrefix: harbor.domain/a/b/c/d hostPathReplacement: #给Pod添加HostPath卷转换策略 - emptyDir: sizeLimit: 10Gi name: volume1 policyType: replaceByEmptyDir evictions: #配置Pod磁盘压力驱逐策略 - type: "Hard" signal: "DiskPressure" podSidecars: #给Pod添加Sidecar containers: - image: nginx:latest name: nginx position: head volumes: - name: volume2 configMap: name: configmap1 namespaceLabels: matchLabels: key2: value2 policy: override
- 使用以下命令创建配置。
kubectl apply -f <test-cluster-profile> #所创建的YAML文件名,替换为实际值
- (可选)使用以下命令查询是否配置成功。
kubectl get cextp
配置ExtensionProfile
- 生成YAML文件。
YAML示例:
apiVersion: bursting.cci.io/v1 kind: ExtensionProfile metadata: name: test-profile spec: actions: annotations: #给Pod追加Annotations annotation1: value1 labels: #给Pod追加Labels label1: value1 imageReplacement: #给Pod添加镜像地址转换策略 - replaceWith: xxx.com/yyy repositoryPrefix: harbor.domain/a/b/c/d hostPathReplacement: #给Pod添加HostPath卷转换策略 - emptyDir: sizeLimit: 10Gi name: volume1 policyType: replaceByEmptyDir evictions: #配置Pod磁盘压力驱逐策略 - type: "Hard" signal: "DiskPressure" podSidecars: #给Pod添加Sidecar containers: - image: nginx:latest name: nginx position: head volumes: - name: volume2 configMap: name: configmap1 objectLabels: matchLabels: k1: v1 policy: addOnly
- 使用以下命令创建配置。
kubectl apply -f <test-profile> #所创建的YAML文件名,替换为实际值
- (可选)使用以下命令查询是否配置成功。
kubectl get extp
spec配置说明
主要参数 |
参数说明 |
---|---|
policy |
支持配置策略为addOnly或override,如果某项配置与Pod原有定义冲突,配置为addOnly不会覆盖Pod原有定义,配置为override会覆盖Pod原有定义。默认配置为addOnly。 |
namespaceLabels |
用于根据命名空间的Label筛选命名空间。 |
objectLabels |
用于根据Pod的Label筛选Pod。
注意:
matchLabels和matchExpressions的用法和匹配策略可参考K8S文档官方文档。 |
actions参数说明:
主要参数 |
参数说明 |
---|---|
annotations |
用于给Pod追加Annotations。 |
labels |
用于给Pod追加Labels。 |
imageReplacement |
结构化配置,详情请参见镜像地址转换策略。 |
hostPathReplacement |
结构化配置,详情请参见Hostpath卷转换策略。 |
evictions |
用于配置Pod磁盘压力驱逐策略。 |
podSidecars |
用于给Pod添加sidecar。 |
替换规则key |
字段含义 |
字段说明 |
---|---|---|
repositoryPrefix |
用户希望被匹配并被替换的镜像前缀字段。 |
|
replaceWith |
用户希望替换成的镜像前缀字段。 |
|
主要参数 |
参数说明 |
---|---|
name |
pod中配置的hostPath的名称。 |
policyType |
remove:删除hostpath。 replaceByEmptyDir:替换为配置的emptydir,如将volume1替换为10Gi的emptyDir的配置如下: hostPathReplacement: - emptyDir: sizeLimit: 10Gi name: volume1 policyType: replaceByEmptyDir |
profile生效规则
- 仅会在Pod创建时对新建的Pod生效,不会修改已存在的Pod。
- 一个Pod最多生效一个ClusterExtensionProfile或一个ExtensionProfile,若两种类型的profile同时匹配,则先生效ClusterExtensionProfile,再生效ExtensionProfile。ExtensionProfile是在ClusterExtensionProfile已经生效的Pod基础上进行处理,若ExtensionProfile配置为“addOnly”,且ExtensionProfile和ClusterExtensionProfile均配置了相关的action,则:
- 对于“labels”、“annotations”仅不同键名会生效。
- 对于“imageReplacement”、“hostPathReplacement”、“evictions”、“podSidecars”均不会生效。
例如:pod匹配到以下名为cextp1的ClusterExtensionProfile和名为extp1的ExtensionProfile,因为extp1的policy是“addOnly”,则extp1配置的hostpath转换策略不会生效,annotations中因为cextp-1已配置了k1的键,则extp1配置的k1:v2不会生效。最终Pod采用annotations: k1:v1、k2:v2、k3:v3和cextp1中的hostPathReplacement。apiVersion: bursting.cci.io/v1 kind: ClusterExtensionProfile metadata: name: cextp1 spec: actions: annotations: k1: v1 k2: v2 hostPathReplacement: - emptyDir: sizeLimit: 10Gi name: hostpath-1 policyType: replaceByEmptyDir ... policy: addOnly --- apiVersion: bursting.cci.io/v1 kind: ExtensionProfile metadata: name: extp1 namespace: default spec: actions: annotations: k1: v2 k3: v3 hostPathReplacement: - name: '*' policyType: remove ... policy: addOnly
- 若Pod所在Namespace的Labels能被多个ClusterExtensionProfile匹配,仅会生效一个最精确匹配的profile。
- 若Pod的Labels能被多个ExtensionProfile匹配,仅会生效一个最精确匹配的一个profile。
- 最精确匹配的定义:
- profile的objectLabels或namespaceLabels中所有matchLabels和matchExpression的数量之和大的更精确。
- 数量一样的选择profile name字母序最小的。
支持磁盘压力后Pod驱逐
当磁盘空间不足的情况发生时,可能会影响业务的正常运行。基于Kubernetes的驱逐和调度机制,通过对指定的ClusterExtensionProfile或ExtensionProfile配置驱逐策略,实现磁盘压力后自动驱逐Pod。如果被驱逐的Pod由Deployment管理,Deployment会自动创建新的Pod。
actions: evictions: #仅支持配置type为Hard且signal为DiskPressure - type: "Hard" signal: "DiskPressure"
- 方式一:通过ClusterExtensionProfile配置指定命名空间标签的Pod驱逐策略
apiVersion: bursting.cci.io/v1 kind: ClusterExtensionProfile metadata: name: eviction-cluster-profile spec: actions: evictions: - type: "Hard" signal: "DiskPressure" namespaceLabels: matchLabels: key: value
- 方式二:通过ExtensionProfile配置在特定命名空间下的指定Label标识的Pod驱逐策略
apiVersion: bursting.cci.io/v1 kind: ExtensionProfile metadata: name: eviction-cluster-profile namespace: default spec: actions: evictions: - type: "Hard" signal: "DiskPressure" objectLabels: matchExpressions: - key: key2 operator: In values: - v2 - v3 - key: key3 operator: Exists matchLabels: key1: value1 policy: addOnly
驱逐原理
在配置了磁盘压力驱逐策略后,CCE突发弹性引擎(对接 CCI)插件根据从CCI同步的Pod状态中的NodeFsDiskPressure、ImageFsDiskPressure的condition,对ClusterExtensionProfile或者ExtensionProfile匹配到的Pod进行驱逐。
在未使用镜像快照的场景下,当pod磁盘空间小于100MiB时,会为Pod上报NodeFsDiskPressure的Condition;在使用镜像快照的场景下,当pod临时存储磁盘空间小于100MiB时或容器镜像磁盘空间小于100MiB时,会分别上报NodeFsDiskPressure或ImageFsDiskPressure的Condition。当pod临时存储磁盘空大于100MiB时或容器镜像磁盘空间大于100MiB时,对应的Condition会被移除。