Tous les produits
Search
Centre de documentation

Elastic Container Instance:Utiliser eci-profile pour planifier les pods sur un VNode

Dernière mise à jour :Aug 11, 2026

eci-profile vous permet de configurer des instances de conteneur élastiques au sein d'un cluster et d'orchestrer les pods en fonction de sélecteurs. Cette rubrique décrit comment déployer et utiliser le composant eci-profile.

Fonctionnalités de eci-profile

Utilisez eci-profile pour filtrer les pods à l'aide des libellés des pods et des namespaces, et mettre en œuvre les fonctionnalités suivantes :

  • Ajoutez des annotations et des libellés.

  • Appliquez des politiques de planification.

    eci-profile peut appliquer les politiques de planification suivantes.

    Politique

    Description

    fair

    Cette politique spécifie une planification équitable. kube-scheduler décide de planifier un pod sur un nœud réel ou un VNode.

    normalNodePrefer

    Les pods sont prioritairement planifiés sur un nœud réel. Si les nœuds réels sont insuffisants, les pods peuvent être planifiés sur des VNodes.

    virtualNodeOnly

    Les pods sont planifiés uniquement sur des VNodes.

Remarque

Dans cette rubrique, eci-profile utilise des définitions de ressource personnalisée (CRD) de sélecteur pour planifier automatiquement les pods. Si vous avez déployé l'ancienne version de eci-profile qui utilise un ConfigMap pour planifier les pods, vous pouvez continuer à utiliser votre instance eci-profile. Nous vous recommandons toutefois de mettre à jour votre eci-profile du mode ConfigMap vers le mode CRD de sélecteur. Le mode ConfigMap de eci-profile ne prend plus en charge les nouvelles fonctionnalités publiées à l'avenir. Pour plus d'informations, consultez la section Mettre à jour eci-profile de cette rubrique.

Déployer eci-profile

Utiliser VNodectl pour déployer eci-profile

Si vous avez installé et configuré l'outil VNodectl, exécutez les commandes suivantes pour déployer facilement eci-profile.

  1. Déployez eci-profile.

    vnode addon enable eci-profile --kubeconfig /path/to/kubeconfig
  2. Consultez l'état du déploiement de eci-profile.

    vnode addon list

    Le résultat suivant s'affiche. L'état de eci-profile est activé.

    |----------------|------------|------------|-------------------------------------------------|
    |   ADDON NAME   |   STATUS   | MAINTAINER |                   REPOSITORY                    |
    |----------------|------------|------------|-------------------------------------------------|
    | eci-profile    | enabled ✅ | ECI Group  | https://github.com/aliyuneci/eci-profile.git    |
    | vnode-approver | enabled ✅ | ECI Group  | https://github.com/aliyuneci/vnode-approver.git |
    |----------------|------------|------------|-------------------------------------------------|

Déployer manuellement eci-profile

  1. Créez un fichier YAML nommé eci-profile.yaml.

    Copiez le contenu suivant dans le fichier YAML en fonction de la version du cluster.

    V1.16 et versions ultérieures

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: eci-profile
    rules:
      - apiGroups:
          - ""
        resources:
          - nodes
          - namespaces
          - resourcequotas
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - ""
        resources:
          - pods
        verbs:
          - get
          - list
          - watch
          - create
          - patch
      - apiGroups:
          - "admissionregistration.k8s.io"
        resources:
          - mutatingwebhookconfigurations
        verbs:
          - get
          - patch
          - create
          - delete
      - apiGroups:
          - "eci.aliyun.com"
        resources:
          - selectors
        verbs:
          - get
          - watch
          - list
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: eci-profile
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: eci-profile
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: eci-profile
    subjects:
    - kind: ServiceAccount
      name: eci-profile
      namespace: kube-system
    ---
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      annotations:
        controller-gen.kubebuilder.io/version: (devel)
      creationTimestamp: null
      name: selectors.eci.aliyun.com
    spec:
      group: eci.aliyun.com
      names:
        kind: Selector
        listKind: SelectorList
        plural: selectors
        singular: selector
      scope: Namespaced
      versions:
      - name: v1
        schema:
          openAPIV3Schema:
            properties:
              apiVersion:
                description: 'APIVersion defines the versioned schema of this representation
                  of an object. Servers should convert recognized schemas to the latest
                  internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
                type: string
              kind:
                description: 'Kind is a string value representing the REST resource this
                  object represents. Servers may infer this from the endpoint the client
                  submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                type: string
              metadata:
                type: object
              spec:
                properties:
                  effect:
                    properties:
                      annotations:
                        additionalProperties:
                          type: string
                        type: object
                      labels:
                        additionalProperties:
                          type: string
                        type: object
                    type: object
                  namespaceLabels:
                    description: A label selector is a label query over a set of resources.
                      The result of matchLabels and matchExpressions are ANDed. An empty
                      label selector matches all objects. A null label selector matches
                      no objects.
                    properties:
                      matchExpressions:
                        description: matchExpressions is a list of label selector requirements.
                          The requirements are ANDed.
                        items:
                          description: A label selector requirement is a selector that
                            contains values, a key, and an operator that relates the key
                            and values.
                          properties:
                            key:
                              description: key is the label key that the selector applies
                                to.
                              type: string
                            operator:
                              description: operator represents a key's relationship to
                                a set of values. Valid operators are In, NotIn, Exists
                                and DoesNotExist.
                              type: string
                            values:
                              description: values is an array of string values. If the
                                operator is In or NotIn, the values array must be non-empty.
                                If the operator is Exists or DoesNotExist, the values
                                array must be empty. This array is replaced during a strategic
                                merge patch.
                              items:
                                type: string
                              type: array
                          required:
                          - key
                          - operator
                          type: object
                        type: array
                      matchLabels:
                        additionalProperties:
                          type: string
                        description: matchLabels is a map of {key,value} pairs. A single
                          {key,value} in the matchLabels map is equivalent to an element
                          of matchExpressions, whose key field is "key", the operator
                          is "In", and the values array contains only "value". The requirements
                          are ANDed.
                        type: object
                    type: object
                    x-kubernetes-map-type: atomic
                  objectLabels:
                    description: A label selector is a label query over a set of resources.
                      The result of matchLabels and matchExpressions are ANDed. An empty
                      label selector matches all objects. A null label selector matches
                      no objects.
                    properties:
                      matchExpressions:
                        description: matchExpressions is a list of label selector requirements.
                          The requirements are ANDed.
                        items:
                          description: A label selector requirement is a selector that
                            contains values, a key, and an operator that relates the key
                            and values.
                          properties:
                            key:
                              description: key is the label key that the selector applies
                                to.
                              type: string
                            operator:
                              description: operator represents a key's relationship to
                                a set of values. Valid operators are In, NotIn, Exists
                                and DoesNotExist.
                              type: string
                            values:
                              description: values is an array of string values. If the
                                operator is In or NotIn, the values array must be non-empty.
                                If the operator is Exists or DoesNotExist, the values
                                array must be empty. This array is replaced during a strategic
                                merge patch.
                              items:
                                type: string
                              type: array
                          required:
                          - key
                          - operator
                          type: object
                        type: array
                      matchLabels:
                        additionalProperties:
                          type: string
                        description: matchLabels is a map of {key,value} pairs. A single
                          {key,value} in the matchLabels map is equivalent to an element
                          of matchExpressions, whose key field is "key", the operator
                          is "In", and the values array contains only "value". The requirements
                          are ANDed.
                        type: object
                    type: object
                    x-kubernetes-map-type: atomic
                  policy:
                    properties:
                      fair:
                        type: object
                      namespaceResourceLimit:
                        properties:
                          limits:
                            additionalProperties:
                              anyOf:
                              - type: integer
                              - type: string
                              pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                              x-kubernetes-int-or-string: true
                            description: ResourceList is a set of (resource name, quantity)
                              pairs.
                            type: object
                          namespace:
                            type: string
                        required:
                        - limits
                        - namespace
                        type: object
                      normalNodeOnly:
                        type: object
                      normalNodePrefer:
                        properties:
                          cpuRatio:
                            type: integer
                          memoryRatio:
                            type: integer
                        type: object
                      virtualNodeOnly:
                        type: object
                    type: object
                  priority:
                    format: int32
                    type: integer
                type: object
            required:
            - spec
            type: object
        served: true
        storage: true
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        role: eci-profile
      name: eci-profile
      namespace: kube-system
    spec:
      ports:
        - port: 443
          targetPort: 443
      selector:
        app: eci-profile
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: eci-profile
      namespace: kube-system
      labels:
        app: eci-profile
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: eci-profile
      template:
        metadata:
          labels:
            app: eci-profile
        spec:
          serviceAccount: eci-profile
          containers:
          - name: eci-profile
            image: registry.cn-beijing.aliyuncs.com/eci-release/eci-profile:0.0.3
            imagePullPolicy: Always
            resources:
              requests: 
                cpu: 2
                memory: 4Gi   
              limits:
                cpu: 4    
                memory: 8Gi   
            env:
            - name: KUBERNETES_MASTER
              value: https://kubernetes:443

    Antérieur à V1.16

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: eci-profile
    rules:
    - apiGroups:
        - ""
      resources:
        - nodes
        - namespaces
        - resourcequotas
      verbs:
        - get
        - list
        - watch
    - apiGroups:
        - ""
      resources:
        - pods
      verbs:
        - get
        - list
        - watch
        - create
        - patch
    - apiGroups:
        - "admissionregistration.k8s.io"
      resources:
        - mutatingwebhookconfigurations
      verbs:
        - get
        - patch
        - create
        - delete
    - apiGroups:
      - "eci.aliyun.com"
      resources:
        - selectors
      verbs:
        - get
        - watch
        - list
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    #apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: selectors.eci.aliyun.com
    spec:
      group: eci.aliyun.com
      version: v1beta1
      names:
        kind: Selector
        plural: selectors
        shortNames:
          - selectors
        categories:
          - all
      scope: Cluster
      validation:
        openAPIV3Schema:
          type: object
          required:
          - metadata
          - spec
          properties:
            apiVersion:
              type: string
            kind:
              type: string
            metadata:
              type: object
            spec:
              type: object
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: eci-profile
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: eci-profile
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: eci-profile
    subjects:
    - kind: ServiceAccount
      name: eci-profile
      namespace: kube-system
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        role: eci-profile
      name: eci-profile
      namespace: kube-system
    spec:
      ports:
      - port: 443
        targetPort: 443
      selector:
        app: eci-profile
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: eci-profile
      namespace: kube-system
      labels:
        app: eci-profile
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: eci-profile
      template:
        metadata:
          labels:
            app: eci-profile
        spec:
          serviceAccount: eci-profile
          containers:
          - name: eci-profile
            image: registry.cn-beijing.aliyuncs.com/eci-release/eci-profile:2.0.0-477875b-aliyun
            imagePullPolicy: Always
            resources:
              requests: 
                cpu: 2
                memory: 4Gi   
              limits:
                cpu: 4    
                memory: 8Gi   
            env:
            - name: KUBERNETES_MASTER
              value: https://kubernetes:443
  2. Déployez eci-profile.

    kubectl create -f eci-profile.yaml
  3. Consultez le résultat du déploiement.

    kubectl -n kube-system get pods

    Le résultat suivant s'affiche. Le pod correspondant à eci-profile est à l'état Running.

    NAME                                                     READY   STATUS    RESTARTS   AGE
    eci-profile-6454756cb8-8xlz8                   1/1      Running    0                76s

Description de la configuration et exemples de configuration

Après avoir déployé eci-profile, créez des sélecteurs pour configurer une politique de planification des pods, ainsi que les annotations et les libellés à ajouter. Voici un exemple de fichier YAML pour un sélecteur :

apiVersion: eci.aliyun.com/v1beta1
kind: Selector
metadata:
  name: test-fair
spec:
  objectLabels:
    matchLabels:
      app: nginx
  namespaceLabels:
    matchLabels:
      app: test
  effect:
    annotations:
      k8s.aliyun.com/eci-auto-imc: "true"
    labels:
      eci-schedulable: "true"
  policy:
    fair: {}
  priority: 3

Le tableau suivant décrit les paramètres de la section spec :

Paramètre

Description

objectLabels.matchLabels

Les libellés de pod à faire correspondre.

namespaceLabels.matchLabels

Les libellés de namespace à faire correspondre.

effect.annotations

Les annotations à ajouter.

effect.labels

Les libellés à ajouter.

policy

La politique de planification. Valeurs possibles :

  • fair

  • normalNodePrefer

  • virtualNodeOnly

priority

La priorité des sélecteurs. Si vous configurez plusieurs sélecteurs en conflit, celui ayant la priorité la plus élevée s'applique. Plus la valeur du paramètre est élevée, plus la priorité du sélecteur est grande.

Remarque

Spécifiez au moins l'un des paramètres objectLabels ou namespaceLabels. Si vous spécifiez les deux paramètres, le pod doit correspondre aux deux.

Exemple 1 : définir la politique de planification sur fair

Créez le sélecteur suivant. À l'aide de ce sélecteur, eci-profile ajoute des tolérances VNode aux pods portant les libellés app: nginx. kube-scheduler décide de planifier les pods sur des nœuds réels ou des VNodes. eci-profile ajoute également aux pods les annotations et les libellés définis dans la section effect.

apiVersion: eci.aliyun.com/v1beta1
kind: Selector
metadata:
  name: test-fair
spec:
  objectLabels:
    matchLabels:
      app: nginx
  effect:
    annotations:
      k8s.aliyun.com/eci-auto-imc: "true"
    labels:
      eci-schedulable: "true"
  policy:
    fair: {}

Exemple 2 : définir la politique de planification sur normalNodePrefer

Créez le sélecteur suivant. À l'aide de ce sélecteur, eci-profile planifie les pods portant le libellé app: nginx sur des VNodes lorsque les nœuds réels sont insuffisants. eci-profile ajoute également aux pods les annotations et les libellés définis dans la section effect.

apiVersion: eci.aliyun.com/v1beta1
kind: Selector
metadata:
  name: test-normal-node-prefer
spec:
  objectLabels:
    matchLabels:
      app: nginx
  effect:
    annotations:
      k8s.aliyun.com/eci-image-cache: "true"
    labels:
      eci-schedulable: "true"
  policy:
    normalNodePrefer: {}

Exemple 3 : définir la politique de planification sur virtualNodeOnly

Créez le sélecteur suivant. À l'aide de ce sélecteur, eci-profile ajoute des tolérances VNode et des sélecteurs de nœud VNode aux pods portant les libellés app: nginx. eci-profile ajoute également aux pods les annotations et les libellés définis dans la section effect.

apiVersion: eci.aliyun.com/v1beta1
kind: Selector
metadata:
  name: test-virtual-node-only
spec:
  objectLabels:
    matchLabels:
      app: nginx
  effect:
    annotations:
      k8s.aliyun.com/eci-auto-imc: "true"
    labels:
      eci-schedulable: "true"
  policy:
    virtualNodeOnly: {}

Mettre à jour eci-profile

Si vous avez déployé l'ancienne version de eci-profile qui utilise un ConfigMap pour planifier les pods, nous vous recommandons de mettre à jour votre instance eci-profile vers la version utilisant une CRD de sélecteur pour la planification des pods. Pour mettre à jour eci-profile, procédez comme suit :

  1. Notez le contenu des sélecteurs dans le namespace kube-system de l'ancienne version de eci-profile.

  2. Supprimez l'ancienne version de eci-profile.

  3. Déployez la nouvelle version de eci-profile.

  4. Créez de nouveaux sélecteurs basés sur les sélecteurs d'origine.

Remarque

Si vous avez des questions lors de l'utilisation de eci-profile, rejoignez le groupe DingTalk (ID : 44666389) pour obtenir une assistance technique.