我有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
答案 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注释在某些情况下可以使用,但是在扩展集群时,您的应用程序将随之扩展,并且可能不希望这样做。