Kubernetes 单容器节点架构

Kubernetes Single Container Node Architecture

我是 kubernetes 的半新手,据我了解围绕该主题挑选的很多东西,有些东西仍然很难组合在一起。

我有一个以下项目设置,需要有关设置我的 k8 集群的最佳方法的架构建议。

我现在有两个应用程序:API-APP和WORKER-APP,它们的资源消耗都很大,所以我需要为一个应用程序(pod)预留一个节点。

我总共创建了 6 个节点,这样 3 个 API-APP(使用 replicationcontroller 复制)和 3 个 WORKER-APP(使用 replicationcontroller 复制)都可以有自己的节点(它们使用大约 90%CPU/Memory).

目前 k8 只是将它们部署到任何一个节点,有时我有一个案例,我的所有 3 个 API-APP 都在 1 个节点上,我有 2 个节点什么都不做。

有什么方法可以指定我要为 1 个应用保留 1 个节点吗?

我考虑过指定 requests/limit,但要么什么都没发生,要么我做错了什么。

yaml 文件:

# RC for svc1
kind: ReplicationController
apiVersion: v1
metadata:
  name: APP-API
spec:
  replicas: 3
  selector:
  template:
    metadata:
      labels:
        app: APP-API
    spec:
      containers:
      - name: APP-API
        image: SOME-IMAGE
        resources:
          limits:
            cpu: "7000m"
        requests:
          cpu: "7000m"
        env:
        - name: APP_SVC
          value: APP-API
        ports:
        - containerPort: 80
          protocol: TCP
---
# Service for svc1
kind: Service
apiVersion: v1
metadata:
  labels:
    app: APP-API
  name: APP-API
spec:
  type: ClusterIP
  ports:
  - port: 80
    name: http
  selector:
    app: APP-API

我的机器有所有 8 个内核,所以在这种情况下,我试图告诉它请求 7 个内核,但没有任何反应。

我遇到了这个 https://kubernetes.io/docs/concepts/configuration/assign-pod-node/,这让我找到了正确的方向。 Inter-Pod 亲和力和反亲和力正是我所寻找的。它允许我根据 yaml 文件中提供的标签 key/values 确保同一节点上没有 2 个应用程序 运行。

我的 yaml 最终看起来与此非常相似:

apiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1
kind: Deployment
metadata:
  name: redis-cache
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: redis-server
        image: redis:3.2-alpine