通过 Taint/Toleration 调整 Master 执行 Pod 的策略

给node打上污点

默认情况下 Master 节点是不允许运行用户 Pod 的。而 Kubernetes 做到这一点,依靠的是 Kubernetes 的 Taint/Toleration 机制。
原理:一旦某个节点被加上了一个 Taint,即被“打上了污点”,所有 Pod 就都不能在这个节点上运行,因为 Kubernetes 的 Pod 都有“洁癖”。
除非,有个别的 Pod 声明自己能“容忍”这个“污点”,即声明了 Toleration,它才可以在这个节点上运行。其中,为节点打上“污点”(Taint)的命令是:

  1. kubectl taint nodes node1 foo=bar:NoSchedule

这时,该 node1 节点上就会增加一个键值对格式的 Taint,即: foo=bar:NoSchedule 。其中值里面的 NoSchedule,意味着这个 Taint 只会在调度新 Pod 时产生作用,而不会影响已经在 node1 上运行的 Pod,哪怕没有 Toleration。

删除污点

单节点的 Kubernetes,删除这个 Taint 才是正确的选择。

  1. kubectl taint node node7 node-role.kubernetes.io/master:NoSchedule-

如何容忍污点

在 Pod 的.yaml 文件中的 spec 部分,加入 tolerations 字段即可。

  1. apiVersion: v1
  2. kind: Pod
  3. ...
  4. spec:
  5. tolerations:
  6. - key: "foo"
  7. operator: "Equal"
  8. value: "bar"
  9. effect: "NoSchedule"

这个 Toleration 的含义是,这个 Pod 能“容忍”所有键值对为 foo=bar 的 Taint( operator: “Equal”,“等于”操作)。
如果你通过 kubectl describe 检查一下 Master 节点的 Taint 字段,就会有所发现了:

  1. [root@node1 tasks]# kubectl describe node node1
  2. Name: node1
  3. ...
  4. Taints: node-role.kubernetes.io/master:NoSchedule

此时,你就需要像下面这样用“Exists”操作符(operator: “Exists”,“存在”即可)来说明,该 Pod 能够容忍所有以 foo 为键的 Taint,才能让这个 Pod 运行在该 Master 节点上:

  1. apiVersion: v1
  2. kind: Pod
  3. ...
  4. spec:
  5. tolerations:
  6. - key: "foo"
  7. operator: "Exists"
  8. effect: "NoSchedule"

部署容器存储插件

在某一台机器上启动的一个容器,显然无法看到其他机器上的容器在它们的数据卷里写入的文件。这是容器最典型的特征之一:无状态
存储插件会在容器里挂载一个基于网络或者其他机制的远程数据卷,使得在容器里创建的文件,实际上是保存在远程存储服务器上,或者以分布式的方式保存在多个节点上,而与当前宿主机没有任何绑定关系。这样,无论在其他哪个宿主机上启动新的容器,都可以请求挂载指定的持久化存储卷,从而访问到数据卷里保存的内容。这就是“持久化”的含义。
Kubernetes 本身的松耦合设计,绝大多数存储项目,比如 Ceph、GlusterFS、NFS 等,都可以为 Kubernetes 提供持久化存储能力。

Rook

ceph-quickstart
Rook 项目是一个基于 Ceph 的 Kubernetes 存储插件(它后期也在加入对更多存储实现的支持)。不过,不同于对 Ceph 的简单封装,Rook 在自己的实现中加入了水平扩展、迁移、灾难备份、监控等大量的企业级功能,使得这个项目变成了一个完整的、生产级别可用的容器存储插件。

  1. kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/common.yaml
  2. kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/operator.yaml
  3. kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/cluster.yaml

namespace - rook-ceph

  1. [root@node1 kubernetes]# kubectl get pods -n rook-ceph -owide
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. csi-cephfsplugin-2r4jq 2/3 CrashLoopBackOff 18 70m 10.10.10.43 node3 <none> <none>
  4. csi-cephfsplugin-cbvq6 2/3 CrashLoopBackOff 18 70m 10.10.10.44 node4 <none> <none>
  5. csi-cephfsplugin-provisioner-6fc4bfb885-cbh9n 5/5 Running 0 70m 192.168.135.5 node3 <none> <none>
  6. csi-cephfsplugin-provisioner-6fc4bfb885-dtlh8 5/5 Running 0 70m 192.168.3.68 node4 <none> <none>
  7. csi-cephfsplugin-sczrk 2/3 CrashLoopBackOff 5 6m8s 10.10.10.45 node5 <none> <none>
  8. csi-rbdplugin-c29n7 3/3 Running 0 70m 10.10.10.43 node3 <none> <none>
  9. csi-rbdplugin-gg4lr 3/3 Running 0 6m8s 10.10.10.45 node5 <none> <none>
  10. csi-rbdplugin-provisioner-f66df55fc-cjrfj 6/6 Running 0 70m 192.168.135.6 node3 <none> <none>
  11. csi-rbdplugin-provisioner-f66df55fc-p9j4b 6/6 Running 0 70m 192.168.3.69 node4 <none> <none>
  12. csi-rbdplugin-tv6vz 3/3 Running 0 70m 10.10.10.44 node4 <none> <none>
  13. rook-ceph-crashcollector-node3-67ccd6bf94-jgfnp 1/1 Running 0 5m30s 192.168.135.61 node3 <none> <none>
  14. rook-ceph-crashcollector-node4-b674c97ff-bjg9b 1/1 Running 0 3m8s 192.168.3.93 node4 <none> <none>
  15. rook-ceph-crashcollector-node5-bc7768684-l67gl 1/1 Running 0 5m 192.168.33.134 node5 <none> <none>
  16. rook-ceph-mgr-a-66b66845d5-tgvrz 1/1 Running 0 3m28s 192.168.3.89 node4 <none> <none>
  17. rook-ceph-mon-a-585d8c9554-2v9zc 1/1 Running 0 5m30s 192.168.135.59 node3 <none> <none>
  18. rook-ceph-mon-b-cb459ccf7-wv4w6 1/1 Running 0 5m20s 192.168.3.88 node4 <none> <none>
  19. rook-ceph-mon-c-7bf877794d-7cnd4 1/1 Running 0 5m 192.168.33.130 node5 <none> <none>
  20. rook-ceph-operator-db86d47f5-swt5g 1/1 Running 0 73m 192.168.3.66 node4 <none> <none>
  21. rook-ceph-osd-0-7666d9d4bb-xt8xf 1/1 Running 0 3m11s 192.168.135.62 node3 <none> <none>
  22. rook-ceph-osd-1-665fbd7b54-s5fvj 1/1 Running 0 3m12s 192.168.33.133 node5 <none> <none>
  23. rook-ceph-osd-2-cf7558d47-gh5cr 1/1 Running 0 3m8s 192.168.3.92 node4 <none> <none>
  24. rook-ceph-osd-3-b8c9f69df-n7ndf 1/1 Running 0 3m12s 192.168.33.132 node5 <none> <none>
  25. rook-ceph-osd-4-7b84f7bb44-7h574 1/1 Running 0 3m10s 192.168.135.63 node3 <none> <none>
  26. rook-ceph-osd-5-759d57b8dd-jpnfb 1/1 Running 0 3m8s 192.168.3.94 node4 <none> <none>
  27. rook-ceph-osd-prepare-node3-986f7 0/1 Completed 0 3m27s 192.168.135.60 node3 <none> <none>
  28. rook-ceph-osd-prepare-node4-6xswb 0/1 Completed 0 3m27s 192.168.3.91 node4 <none> <none>
  29. rook-ceph-osd-prepare-node5-cqj78 0/1 Completed 0 3m26s 192.168.33.131 node5 <none> <none>
  30. rook-discover-55dfl 1/1 Running 0 72m 192.168.3.67 node4 <none> <none>
  31. rook-discover-rdqk4 1/1 Running 0 72m 192.168.135.2 node3 <none> <none>
  32. rook-discover-zb62w 1/1 Running 0 6m8s 192.168.33.129 node5 <none> <none>