部署亲和力

时间:2020-06-09 21:52:47

标签: kubernetes affinity

我有3个节点的k8s集群

我想要一个带有3个副本的示例部署,因此每个吊舱都安排在不同的节点上吗?

apiVersion: apps/v1 kind: Deployment metadata:   name: tomcat-deployment   labels:
    app: tomcat spec:   replicas: 3   selector:
    matchLabels:
      app: tomcat   template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: tomcat:9.0
        ports:
        - containerPort: 80

2 个答案:

答案 0 :(得分:0)

您可以使用podAntiAffinity来确保部署的相同容器永远不要在同一节点上运行(取决于拓扑)。检查以下文档Assigning Pods to Nodes

Soy un estudiante.
Soy un empleado.
Soy una persona.

答案 1 :(得分:0)

默认情况下,Kubernetes调度程序将尝试在不同节点上调度部署副本(只要一个节点满足内存/ cpu要求)。

如果不这样做,则可以在一个节点上安排2个(或更多)pod副本,您可以使用多种技术来防止这种情况。

这些技术之一称为pod affinity。在k8s文档中,您可以阅读:

Pod间亲和力和反亲和力使您可以根据节点上已经运行的Pod上的标签来限制Pod可以调度哪些节点。规则的格式为“如果该X已经运行了一个或多个符合规则Y的Pod,则该Pod应该(或者在非亲和性的情况下不应在X中运行)”

在使用podaffinity时,您需要了解,如果由于某种原因无法在节点(资源不足或受污染的节点)上调度Pod,并且Pod最终将处于挂起状态。

您还应该记住,在运行3个节点集群(1个主节点+ 2个工作线程)时,通常在主节点上有NoSchedule污点(这对于使用例如kubeadm创建的集群来说是典型的),不允许在其上调度pod主节点。

如果这适用于您,并且您仍然想在母节点上安排吊舱,则需要删除NoSchedule异味:

kubectl taint nodes $(hostname) node-role.kubernetes.io/master:NoSchedule-

或使用toleration

apiVersion: extensions/v1beta1
kind: Deployment
  spec:
    spec:
      tolerations:
        - key: "node-role.kubernetes.io/master"
          effect: "NoSchedule"
          operator: "Exists"

在@suren中提到的DaemonSets注释在某些情况下可以使用,但是在扩展集群时,您的应用程序将随之扩展,并且可能不希望这样做。