Kubernetes:仅在一个节点池中部署

时间:2020-03-18 14:10:25

标签: kubernetes deployment google-kubernetes-engine

我目前正在为生产环境创建一个Kubernetes集群。 在我的集群中,我有2个节点池,我们称它们为api-poolweb-pool

在我的api-pool中,我有2个节点,每个节点具有4CPU和15Gb RAM。

我正在尝试在我的api-pool中部署api的8个副本,每个副本应具有1CPU和3.5Gi RAM。

我的api.deployment.yaml看起来像这样:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-dev
spec:
  replicas: 8
  selector:
    matchLabels:
      app: my-api
  template:
    metadata:
      labels:
        app: my-api
    spec:
      containers:
      - name: api-docker
        image: //MY_IMAGE
        imagePullPolicy: Always
        envFrom:
          - configMapRef:
              name: api-dev-env
          - secretRef:
              name: api-dev-secret
        ports:
          - containerPort: 80
        resources:
          requests:
            cpu: "1"
            memory: "3.5Gi"

但是我的问题是 Kubernetes在我的web-pool以及api-pool 的节点上部署了Pod,但是我希望这些Pod只在我的节点中部署api-pool

我试图标记api-pool的节点以使用与标签匹配的选择器,但是它不起作用,并且我不确定它是否应该那样工作。

如何精确定位到K8才能仅在我的api-pool中部署这8个副本?

1 个答案:

答案 0 :(得分:4)

您可以使用nodeselector,这是推荐的最简单的节点选择约束形式。

使用pool = api标记api-pool的节点

kubectl label nodes nodename pool=api

在pod规范中添加nodeSelector

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-dev
spec:
  replicas: 8
  selector:
    matchLabels:
      app: my-api
  template:
    metadata:
      labels:
        app: my-api
    spec:
      containers:
      - name: api-docker
        image: //MY_IMAGE
        imagePullPolicy: Always
        envFrom:
          - configMapRef:
              name: api-dev-env
          - secretRef:
              name: api-dev-secret
        ports:
          - containerPort: 80
        resources:
          requests:
            cpu: "1"
            memory: "3.5Gi"
      nodeSelector:
        pool: api

对于模式高级用例,您可以使用node affinity