我正在尝试创建具有特定亲和性的 DaemonSet,我希望它仅在 type=prod 的节点上创建 Pod。我使用以下测试代码:
api版本:extensions/v1beta1 种类:DaemonSet 元数据: 名称:test0 命名空间: kube-system 規格: 模板: 元数据: 标签: 应用程序:test0 規格: 亲和力: 节点亲和性: 调度期间必需,执行期间忽略: 节点选择器条款: - 匹配表达式: - 键:类型 操作符:In 值: - 产品 容器: -名称:test0 图片:gcr.io/google_containers/pause:2.0
但是,kubectl 退出并出现以下错误:
error: error validating "test.yaml": error validating data: found invalid field affinity for v1.PodSpec; if you choose to ignore these errors, turn validation off with --validate=false
我不知道我在这里做错了什么。我也尝试将亲和性块放在模板块下,但出现了同样的错误。
不过,我应该指出,集群仍然是 Kubernetes 1.4.8。Affinity 自 1.2 版以来一直是 Kubernetes 的一部分,所以我认为这不是问题?
答案1
我自己找到了解决方案,显然我需要使用注释:
... 規格: 模板: 元数据: 标签: 应用程序:test0 注释: scheduler.alpha.kubernetes.io/affinity:> { “节点亲和性”:{ “requiredDuringSchedulingIgnoredDuringExecution”:{ “节点选择器条款”:[ { “匹配表达式”:[ { “键”:“类型”, “运算符”:“在”, “值”:[“产品”] } ] } ] } } } ...
答案2
你所拥有的对我来说看起来很完美,如果我猜测它为什么不起作用,那可能是由于以下两个原因之一:
- 当时,nodeAffinity 不适用于守护进程集(不同的控制器),只有明确的节点选择器才有效。
- 或者它是一些 alpha 功能,需要在 api 服务器上启用功能标志。
我正在使用这个(只是摆弄一些东西作为实验),它看起来与你所拥有的非常相似,并且它对我来说按预期工作。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ingress-node
namespace: ingress
labels:
ingress-node: healthz
spec:
selector:
matchLabels:
ingress-node: healthz
template:
metadata:
labels:
ingress-node: healthz
spec:
containers:
- name: ingress-node-identifier
image: gcr.io/google-containers/healthz-server:1.0
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: tier
operator: In
values:
- ingress-east-us-1a
- ingress-east-us-1b