ToB企服应用市场:ToB评测及商务社交产业平台

标题: k8s~节点的亲和性 [打印本页]

作者: 石小疯    时间: 2023-7-11 21:53
标题: k8s~节点的亲和性
在Kubernetes中,你可以使用节点亲和性(Node Affinity)来控制Pod部署在哪些节点上。通过配置节点亲和性,你可以指定一些规则,以确保多个服务不会被调度到同一个节点上。
两种策略

节点亲和性实现

以下是一些在部署Deployment时避免多个服务部署到同一节点的常用方法:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: service-a
  5. spec:
  6.   replicas: 1
  7.   selector:
  8.     matchLabels:
  9.       app: service-a
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: service-a
  14.     spec:
  15.       affinity:
  16.         nodeAffinity:
  17.           requiredDuringSchedulingIgnoredDuringExecution:
  18.             nodeSelectorTerms:
  19.             - matchExpressions:
  20.               - key: type
  21.                 operator: In
  22.                 values:
  23.                 - product
  24.       containers:
  25.       - name: service-a
  26.         image: nginx:stable-alpine
复制代码
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: service-b
  5. spec:
  6.   replicas: 1
  7.   selector:
  8.     matchLabels:
  9.       app: service-b
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: service-b
  14.     spec:
  15.       affinity:
  16.         nodeAffinity:
  17.           requiredDuringSchedulingIgnoredDuringExecution:
  18.             nodeSelectorTerms:
  19.             - matchExpressions:
  20.               - key: type
  21.                 operator: In
  22.                 values:
  23.                 - order
  24.       containers:
  25.       - name: service-b
  26.         image: nginx:stable-alpine
复制代码
上面使用正则表达式matchExpressions来确定目标,也可以使用标签matchLabels的方式,更简洁,如下:
  1.      # 亲和性
  2.       affinity:
  3.         # Pod亲和性规则
  4.         podAffinity:
  5.           # 强制性的调度规则, 但不会影响已在节点上运行的Pod
  6.           requiredDuringSchedulingIgnoredDuringExecution:
  7.           - topologyKey: kubernetes.io/hostname
  8.             # 标签选择器
  9.             labelSelector:
  10.               matchLabels:
  11.                 app: service-a
复制代码
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:  
  4.   name: service-a-order
  5. spec:  
  6.   # Pod副本数量
  7.   replicas: 4
  8.   selector:
  9.     matchLabels:
  10.       app: service-a-order
  11.   # Pod模板
  12.   template:
  13.     metadata:
  14.       # 标签信息: 应用的后端服务
  15.       labels:
  16.         app: service-a-order
  17.     spec:
  18.     # 亲和性
  19.       affinity:
  20.         # Pod亲和性规则
  21.         podAntiAffinity:
  22.           # 强制性的调度规则, 但不会影响已在节点上运行的Pod
  23.           preferredDuringSchedulingIgnoredDuringExecution:
  24.           - weight: 100  
  25.             podAffinityTerm:
  26.                 topologyKey: kubernetes.io/hostname
  27.                 # 标签选择器
  28.                 labelSelector:
  29.                   matchExpressions: # 也需要matchLabels
  30.                   - key: app
  31.                     operator: In
  32.                     values:
  33.                     - service-a-order
  34.       # 容器信息
  35.       containers:
  36.       - name: service-a-order
  37.         image: nginx:stable-alpine
复制代码
扩展阅读

app.kubernetes.io/instance Kubernetes的应用标识

在Kubernetes中,app.kubernetes.io/instance是一个标签(Label),用于标识应用程序实例的实例ID或名称。
标签是键值对的形式,用于为资源对象(如Pod、Deployment、Service等)添加元数据信息。app.kubernetes.io/instance是一个预定义的标签键,用于表示应用程序实例的唯一标识符。
通常,当您使用Kubernetes部署多个相同类型的应用程序实例时,每个实例都会被分配一个唯一的实例ID或名称。您可以使用app.kubernetes.io/instance标签来标识和区分这些应用程序实例。
例如,假设您使用Kubernetes部署了一个名为"my-app"的应用程序,并在该应用程序的多个副本之间进行了扩展。每个副本都会被分配一个唯一的实例ID或名称。通过为每个副本设置app.kubernetes.io/instance标签,您可以区分和识别每个应用程序实例。
标签可以通过Kubernetes API或命令行工具(如kubectl)进行管理和查询。您可以使用kubectl get pods --show-labels命令来查看资源对象的标签信息,包括app.kubernetes.io/instance标签和对应的实例ID或名称值。
kubernetes.io/hostname 节点的主机名

在Kubernetes中,kubernetes.io/hostname是一个节点标签(Node Label),用于标识节点的主机名(Hostname)。
节点标签是一种键值对的形式,用于为节点添加自定义的元数据信息。通过为节点添加标签,您可以根据标签进行节点选择和调度。kubernetes.io/hostname是一个预定义的标签键,用于表示节点的主机名。
节点的主机名是节点所在主机的唯一标识符。Kubernetes使用主机名来识别和管理节点,并在集群中唯一标识每个节点。kubernetes.io/hostname标签的值将设置为节点的实际主机名。
例如,假设您在Kubernetes集群中有多个节点,并且每个节点都有不同的主机名。通过查看节点的kubernetes.io/hostname标签,您可以了解到每个节点的实际主机名,并在进行节点选择或调度时使用这些信息。
节点标签可以通过Kubernetes API或命令行工具(如kubectl)进行管理和查询。您可以使用kubectl get nodes --show-labels命令来查看节点标签信息,包括kubernetes.io/hostname标签和对应的主机名值。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4