Kubernetes 中使用 Affinity 和 Anti-Affinity

在 Kubernetes 中,Affinity 和 Anti-Affinity 是两个非常重要的概念。它们可以帮助我们更好地管理 Pod 的调度和部署,从而提高应用程序的稳定性和可用性。本文将详细介绍 Affinity 和 Anti-Affinity 的概念、用法和示例代码,帮助读者更好地理解和应用这两个概念。

什么是 Affinity 和 Anti-Affinity

在 Kubernetes 中,Affinity 和 Anti-Affinity 用于指定 Pod 对节点或其他 Pod 的偏好或反偏好。Affinity 表示 Pod 偏好被调度到哪些节点或其他 Pod 上,而 Anti-Affinity 表示 Pod 偏好不被调度到哪些节点或其他 Pod 上。通过使用 Affinity 和 Anti-Affinity,我们可以更好地控制 Pod 的调度和部署,从而提高应用程序的稳定性和可用性。

Affinity

Affinity 可以分为 Node Affinity 和 Pod Affinity 两种。

Node Affinity

Node Affinity 用于指定 Pod 偏好被调度到哪些节点上。Node Affinity 可以分为 Required 和 Preferred 两种。

  • Required Node Affinity:必须满足指定的条件才能调度 Pod。
  • Preferred Node Affinity:尽量满足指定的条件,如果无法满足,也可以调度 Pod。

下面是一个使用 Required Node Affinity 的示例代码:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: disktype
                operator: In
                values:
                - ssd
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

在这个示例中,我们使用 Required Node Affinity 指定 Pod 只能调度到拥有 SSD 硬盘的节点上。这样可以保证 Pod 在高 IO 负载下的稳定性和性能。

Pod Affinity

Pod Affinity 用于指定 Pod 偏好被调度到哪些其他 Pod 上。Pod Affinity 可以分为 Required 和 Preferred 两种。

  • Required Pod Affinity:必须满足指定的条件才能调度 Pod。
  • Preferred Pod Affinity:尽量满足指定的条件,如果无法满足,也可以调度 Pod。

下面是一个使用 Required Pod Affinity 的示例代码:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

在这个示例中,我们使用 Required Pod Affinity 指定 Pod 只能调度到拥有相同标签的其他 Pod 所在的节点上。这样可以保证同一应用程序的 Pod 被调度到相同的节点上,从而提高应用程序的稳定性和可用性。

Anti-Affinity

Anti-Affinity 用于指定 Pod 偏好不被调度到哪些节点或其他 Pod 上。Anti-Affinity 可以分为 Node Anti-Affinity 和 Pod Anti-Affinity 两种。

Node Anti-Affinity

Node Anti-Affinity 用于指定 Pod 偏好不被调度到哪些节点上。Node Anti-Affinity 可以分为 Required 和 Preferred 两种。

  • Required Node Anti-Affinity:必须满足指定的条件才能调度 Pod。
  • Preferred Node Anti-Affinity:尽量满足指定的条件,如果无法满足,也可以调度 Pod。

下面是一个使用 Required Node Anti-Affinity 的示例代码:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: NotIn
                values:
                - node-1
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

在这个示例中,我们使用 Required Node Anti-Affinity 指定 Pod 不被调度到 hostname 为 node-1 的节点上。这样可以保证同一应用程序的 Pod 不会被调度到同一个节点上,从而提高应用程序的稳定性和可用性。

Pod Anti-Affinity

Pod Anti-Affinity 用于指定 Pod 偏好不被调度到哪些其他 Pod 上。Pod Anti-Affinity 可以分为 Required 和 Preferred 两种。

  • Required Pod Anti-Affinity:必须满足指定的条件才能调度 Pod。
  • Preferred Pod Anti-Affinity:尽量满足指定的条件,如果无法满足,也可以调度 Pod。

下面是一个使用 Required Pod Anti-Affinity 的示例代码:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

在这个示例中,我们使用 Required Pod Anti-Affinity 指定 Pod 不被调度到拥有相同标签的其他 Pod 所在的节点上。这样可以保证同一应用程序的 Pod 不会被调度到同一个节点上,从而提高应用程序的稳定性和可用性。

总结

通过本文的介绍,我们了解了 Kubernetes 中 Affinity 和 Anti-Affinity 的概念、用法和示例代码,希望读者能够更好地理解和应用这两个概念,从而提高应用程序的稳定性和可用性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658cd9b9eb4cecbf2d2a8467


纠错
反馈