You need to enable JavaScript to run this app.
导航

关联资源跟随调度

最近更新时间2023.09.25 12:25:22

首次发布时间2023.07.20 10:49:31

什么是关联资源

原生 Kubernetes 中的工作负载(Deployment、StatefulSet 等),部署使用时通常会依赖很多其他资源,例如 ConfigMap、Secret、PVC 等。因此,在联邦集群的资源分发场景下,需要确保工作负载分发到的目标成员集群时,关联的其他资源也遵循相同的部署策略,同步分发至相同的成员集群中。

工作负载和其他资源的关联方式,主要包括以下 2 种:

  • 内置跟随资源:内置跟随资源是指在 Yaml 配置文件中相互关联的资源。例如工作负载(Deployment、StatefulSet 等)和 ConfigMap、Secret、PVC 等。当资源分发时,如果工作负载和关联资源没有分发到相同的集群中,会导致工作负载在部署时,会由于资源缺失导致报错,部署失败。
  • 指定跟随资源:指定跟随资源主要是指 服务(Service)路由(ingress)。指定跟随资源缺失,不会导致工作负载部署报错,但会影响使用。例如:当服务和路由没有与工作负载分发到相同的成员集群时,工作负载就无法对外提供服务。

配置关联资源跟随调度

分布式云原生平台支持关联资源跟随调度模式,允许配置工作负载和资源关联。当工作负载和相关资源关联后,系统会保证工作负载和关联资源遵循相同的调度策略,并将其调度到相同的成员集群中。主要特性包括:

  • 支持关联调度模式开关,默认状态为 开启。可以使用如下参数控制。
  • 关联资源支持被多个工作负载进行关联和分发。
  • 支持 2 种不同的配置资源关联的方式,包括:内置跟随资源指定跟随资源。不同的关联模式支持的资源类型略有不同。
关联模式说明工作负载类型关联资源类型

内置跟随资源

使用 Kubernetes 原生的配置方式,在使用 Yaml 配置工作负载时,直接配置与其相关联的资源。

  • Deployment
  • StatefulSet
  • DaemonSet
  • Job
  • CronJob
  • Pod
  • ConfigMap
  • Secret
  • PersistentVolumeClaim
  • ServiceAccount

指定跟随资源

在使用 Yaml 配置工作负载时,使用 Annotation 声明需要关联的资源。

  • Deployment
  • StatefulSet
  • DaemonSet
  • Job
  • CronJob
  • Pod
  • ConfigMap
  • Secret
  • PersistentVolumeClaim
  • ServiceAccount
  • Service
  • Ingress

内置跟随资源

您可以通过内置跟随资源的方法关联工作负载和相关资源。在使用 Yaml 配置工作负载时,允许直接指定关联资源。此时,工作负载和关联资源会遵循工作负载的部署策略,分发到相同的成员集群中去。

说明

在配置工作负载前,您需要保证关联的资源存在。即首先需要完成关联资源的创建,再配置工作负载。

例如:

  1. 工作负载 Deployment A 挂载了 ConfigMap N 资源,并且工作负载指定分发到 Cluster1、Cluster2 中。
  2. ConfigMap N 并未指定部署策略,但是会跟随 Deployment A 分发到 Cluster1 和 Cluster2 中。

内置跟随资源的示例如下所示。在本例中,Deployment 工作负载关联了 ConfigMap 资源。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - image: cr-cn-beijing.volces.com/demo-namespace/demo-repo:v1
        name: demo
        port: 
        - containerPort: 80
        volumeMounts:
          - name: configmap-demo
            mountPath: "/path"
      volumes:
        - name: configmap-demo
          configMap:
            key1: value1

指定跟随资源

您可以在使用 Yaml 配置工作负载时,通过 Annotation 声明一个或多个需要关联的资源对象,该关联对象无需配置部署策略即可跟随工作负载分发到目标成员集群中。

说明

在配置工作负载前,您需要保证关联的资源存在。即首先需要完成关联资源的创建,再配置工作负载。

使用 Annotation 指定跟随资源时,格式说明如下:

  • Annotation 使用固定字段 kubeadmiral.io/followers: 开头。
  • 每个资源包括 3 个字段,分别为 groupkindname。使用 {} 包裹起来。代表一个确定的关联资源。
  • 当有多个关联资源时,资源之间使用 , 分割,所有资源外部使用 []包裹。

不同关联资源,Annotation 中资源的字段配置不同,如下所示。

关联资源group 字段kind 字段name 字段Annotation 配置举例
ConfigMap无需该项或值为空ConfigMap目标资源名称kubeadmiral.io/followers: '[{"group": "", "kind": "ConfigMap", "name": "configmap-name"}]'
Secret无需该项或值为空Secret目标资源名称kubeadmiral.io/followers: '[{"group": "", "kind": "Secret", "name": "secret-name"}]'
Service无需该项或值为空Service目标资源名称kubeadmiral.io/followers: '[{"group": "", "kind": "Service", "name": "service-name"}]'
PersistentVolumeClaim无需该项或值为空PersistentVolumeClaim目标资源名称kubeadmiral.io/followers: '[{"group": "", "kind": "PersistentVolumeClaim, "name": "pvc-name"}]'
ServiceAcount无需该项或值为空ServiceAcount目标资源名称kubeadmiral.io/followers: '[{"group": "", "kind": "ServiceAcount, "name": "serviceacount-name"}]'
Ingressnetworking.k8s.ioIngress目标资源名称kubeadmiral.io/followers: '[{"group": "networking.k8s.io", "kind": "Ingress, "name": "ingress-name"}]'

资源配置声明配置示例如下所示。在本例中,Deployment 工作负载关联了 2 个资源,分别为 Secret 和 Ingress。

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kubeadmiral.io/followers: '[{"group": "", "kind": "Secret", "name": "serect-demo"}, {"group": "networking.k8s.io",  "kind": "Ingress", "name": "ingress-demo"}]'
  name: deployment-demo
spec:
  replicas: 2 
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - image: cr-cn-beijing.volces.com/demo-namespace/demo-repo:v1
        name: demo
        port: 
        - containerPort: 80