Mar*_*Mei 5 docker kubernetes daemonset kubernetes-jobs
有一个具有 100 个节点的 kubernetes 集群,我必须手动清理特定图像,我知道 kubelet 垃圾收集可能会有所帮助,但它不适用于我的情况。浏览互联网后,我找到了一个解决方案——docker in docker,解决了我的问题。
我只想删除每个节点中的图像一次,有什么方法可以在每个节点中运行一次作业吗?
我检查了 kubernetes 标签和 podaffinity,但仍然没有想法,任何人都可以提供帮助吗?
另外,我尝试使用 daemonset 来解决问题,但事实证明它只能删除部分节点的图像,而不是所有节点,我不知道可能是什么问题......
这是守护程序集示例:
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: test-ds
labels:
k8s-app: test
spec:
selector:
matchLabels:
k8s-app: test
template:
metadata:
labels:
k8s-app: test
spec:
containers:
- name: test
env:
- name: DELETE_IMAGE_NAME
value: "nginx"
image: busybox
command: ['sh', '-c', 'curl --unix-socket /var/run/docker.sock -X DELETE http://localhost/v1.39/images/$(DELETE_IMAGE_NAME)']
securityContext:
privileged: true
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock-volume
ports:
- containerPort: 80
volumes:
- name: docker-sock-volume
hostPath:
# location on host
path: /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
如果您想在单个特定节点上运行作业,您可以使用POD 规范中的Nodeselector
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: test
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: test
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
nodeSelector:
name: node3
Run Code Online (Sandbox Code Playgroud)
理想情况下,守护进程集应该可以解决您的问题,因为它会在集群中的每个可用节点上创建 POD。
您可以在此处阅读有关亲和力的更多信息:https: //kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
nodeSelector提供了一种非常简单的方法来将 pod 限制到具有特定标签的节点。亲和力/反亲和力功能极大地扩展了您可以表达的约束类型。关键的增强功能是
亲和/反亲和语言更具表现力。除了使用逻辑 AND 运算创建的精确匹配之外,该语言还提供了更多匹配规则;
您可以在作业 YAML 中使用类似的Affinity
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: k8s.gcr.io/pause:2.0
Run Code Online (Sandbox Code Playgroud)
更新
现在,如果您对作业的 Deamon 亲和力有问题也是无用的,因为作业将创建单个 POD,它将根据亲和力安排到单个节点。创建 100 个具有不同亲和性规则的作业,或者使用部署+ 亲和性在不同节点上安排副本。
我们将创建一个具有POD 关联性的 Deployment ,并确保单个部署的多个POD不会在一个 Node上调度。
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
labels:
app: test
spec:
replicas: 100
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: test
image: <Image>
ports:
- containerPort: 80
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- test
topologyKey: "kubernetes.io/hostname"
Run Code Online (Sandbox Code Playgroud)
尝试使用此部署模板并在此处替换您的图像。您可以先将副本减少到10 个而不是100 个,以检查其是否正在传播 POD。
额外的:
您还可以编写和使用自定义 CRD : https: //github.com/darkowlzz/daemonset-job它将充当守护程序集和作业
归档时间: |
|
查看次数: |
4299 次 |
最近记录: |