Kubernetes 部署亲缘关系

Kubernetes 部署亲缘关系,kubernetes,affinity,Kubernetes,Affinity,我有3个节点的k8s集群 我希望下面是一个包含3个副本的示例部署,这样每个pod都安排在不同的节点中 apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-deployment labels: app: tomcat spec: replicas: 3 selector: matchLabels: app: tomcat template: metadata: l

我有3个节点的k8s集群

我希望下面是一个包含3个副本的示例部署,这样每个pod都安排在不同的节点中

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

您可以使用podAntiAffinity来确保部署的相同Pod不应在同一节点上运行(取决于拓扑)。检查以下文档


默认情况下,Kubernetes调度程序将尽可能尝试在不同节点上调度部署副本(只要节点满足momory/cpu要求)

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

其中一种技术被称为。在k8s文档中,您可以阅读:

pod间关联和反关联允许您基于节点上已运行的pod上的标签而不是基于节点上的标签来约束您的pod有资格调度哪些节点。规则的形式为“如果X已经运行一个或多个符合规则Y的pod,则该pod应该(或者,在反亲和性的情况下,不应该)在X中运行”

使用podaffinity,您需要知道,如果由于某种原因无法在节点上调度pod(缺少资源或受污染的节点),它将最终处于挂起状态

您还应该记住,当运行3节点集群(1个主节点+2个工作节点)时,主节点上通常会出现
NoSchedule
taint(这对于使用kubeadm创建的集群来说是典型的),这不允许在主节点上调度pod

如果这适用于您,并且您仍然希望在主节点上安排播客,则需要删除NoSchedule污染:

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


在@suren的评论中提到了在某些情况下可以使用的方法,但在扩展集群时,您的应用程序会随之扩展,这可能并不理想。

查看
DeamonSets
。非常感谢您的回答,所以实际上我需要的是在部署中定义这个pod关联,这样每个副本都可以通过守护进程集调度到不同的节点?是的,您可能想要使用pod关联
kubectl taint nodes $(hostname) node-role.kubernetes.io/master:NoSchedule-
apiVersion: extensions/v1beta1
kind: Deployment
  spec:
    spec:
      tolerations:
        - key: "node-role.kubernetes.io/master"
          effect: "NoSchedule"
          operator: "Exists"