示例2:应用和缓存尽量部署在同一个域内

以一个三节点的集群为例。使用该集群运行一个带有内存缓存(例如 Redis)的 Web 应用程序。在此例中,还假设 Web 应用程序和内存缓存之间的延迟应尽可能低。 你可以使用 Pod 间的亲和性和反亲和性来尽可能地将该 Web 服务器与缓存并置。

在下面的 Redis 缓存 Deployment 示例中,副本上设置了标签 app=store

  • podAntiAffinity 规则告诉调度器避免将多个带有 app=store 标签的副本部署到同一节点上。

因此,每个独立节点上会创建一个缓存实例。

redis-cache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-cache
spec:
  selector:
    matchLabels:
      app: store
  replicas: 2
  template:
    metadata:
      labels:
        app: store
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: redis-server
        image: redis:3.2-alpine
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
$ kubectl get pod -l app=store -o wide
NAME                           READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
redis-cache-58c86d98f9-5mhgt   1/1     Running   0          16s   172.27.205.136   master   <none>           <none>
redis-cache-58c86d98f9-htdrr   1/1     Running   0          16s   172.29.55.21     node01   <none>           <none>

下面的 Deployment 为 Web 服务器创建带有标签 app=web-store 的副本。

  • Pod 亲和性规则告诉调度器将每个副本放到存在标签为 app=store 的 Pod 的节点上

  • Pod 反亲和性规则告诉调度器决不要在单个节点上放置多个 app=web-store 服务器

web-server.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  selector:
    matchLabels:
      app: web-store
  replicas: 2
  template:
    metadata:
      labels:
        app: web-store
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web-store
            topologyKey: "kubernetes.io/hostname"
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: web-app
        image: nginx:1.16-alpine
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
$ kubectl get pod -l app=web-store -o wide
NAME                          READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
web-server-7fb4d747cc-bmmwk   1/1     Running   0          14s   172.27.205.137   master   <none>           <none>
web-server-7fb4d747cc-lrg8s   1/1     Running   0          14s   172.29.55.23     node01   <none>           <none>

最后更新于