2

我想为命名空间保留一些工作节点。我看到了stackflow和medium的笔记

如何为某些节点分配命名空间?

https://medium.com/@alejandro.ramirez.ch/reserving-a-kubernetes-node-for-specific-nodes-e75dc8297076

我知道我们可以使用 taint 和 nodeselector 来实现这一点。我的问题是,如果人们了解 nodeselector 或 taint 的详细信息,我们如何防止他们将 pod 部署到这些专用工作节点中。

谢谢你

4

2 回答 2

2

为了完成你所需要的,基本上你必须使用taint。假设您有一个 Kubernetes 集群,其中包含一个 Master 和 2 个 Worker 节点:

$ kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
knode01      Ready    <none>   8d    v1.16.2
knode02      Ready    <none>   8d    v1.16.2
kubemaster   Ready    master   8d    v1.16.2

例如,我将 knode01 设置为 Prod,将 knode02 设置为 Dev。

$ kubectl taint nodes knode01 key=prod:NoSchedule
$ kubectl taint nodes knode02 key=dev:NoSchedule

要将 pod 运行到这些节点中,我们必须在您的 yaml 文件的规范会话中指定一个容忍度:

apiVersion: v1
kind: Pod
metadata:
  name: pod1
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "dev"
    effect: "NoSchedule"

此 pod (pod1) 将始终在 knode02 中运行,因为它设置为 dev。如果我们想在 prod 上运行它,我们的容忍度应该是这样的:

  tolerations:
  - key: "key"
    operator: "Equal"
    value: "prod"
    effect: "NoSchedule"

由于我们只有 2 个节点,并且都被指定为仅运行 prod 或 dev,如果我们尝试在不指定 tolerations 的情况下运行 pod,则 pod 将进入挂起状态:

$ kubectl get pods -o wide
    NAME         READY   STATUS    RESTARTS   AGE   IP               NODE      NOMINATED NODE   READINESS GATES
    pod0         1/1     Running   0          21m   192.168.25.156   knode01   <none>           <none>
    pod1         1/1     Running   0          20m   192.168.32.83    knode02   <none>           <none>
    pod2         1/1     Running   0          18m   192.168.25.157   knode01   <none>           <none>
    pod3         1/1     Running   0          17m   192.168.32.84    knode02   <none>           <none>
    shell-demo   0/1     Pending   0          16m   <none>           <none>    <none>           <none>

要删除污点:

$ kubectl taint nodes knode02 key:NoSchedule-
于 2019-10-31T13:46:19.350 回答
1

这是如何做到的

  1. 添加新标签,例如 ns=reserved,标签到特定的工作节点
  2. 添加 taint 和 tolerations 以将特定 pod 定位到此工作节点
  3. 您需要在该命名空间中定义 RBAC 角色和角色绑定,以控制其他用户可以执行的操作
于 2019-10-31T14:25:55.160 回答