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.
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.
-
Déployez eci-profile.
vnode addon enable eci-profile --kubeconfig /path/to/kubeconfig -
Consultez l'état du déploiement de eci-profile.
vnode addon listLe 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
-
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:443Anté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 -
Déployez eci-profile.
kubectl create -f eci-profile.yaml -
Consultez le résultat du déploiement.
kubectl -n kube-system get podsLe 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 :
|
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. |
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 :
Notez le contenu des sélecteurs dans le namespace kube-system de l'ancienne version de eci-profile.
Supprimez l'ancienne version de eci-profile.
Déployez la nouvelle version de eci-profile.
Créez de nouveaux sélecteurs basés sur les sélecteurs d'origine.
Si vous avez des questions lors de l'utilisation de eci-profile, rejoignez le groupe DingTalk (ID : 44666389) pour obtenir une assistance technique.