2016-05-20 14 views
11

Utilizzo di Kubernetes 1.2.4, perché la mia sotto definizione Deployment (redis.yaml) causa il seguente errore?Kubernetes - Perché il campo di selezione non convalida la distribuzione?

$ kubectl apply -f redis.yaml 
error validating "redis.yaml": error validating data: found invalid field name for v1beta1.LabelSelector; if you choose to ignore these errors, turn validation off with --validate=false 

redis.yaml:

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: redis 
spec: 
    replicas: 3 
    selector: 
    name: redis 
    template: 
    metadata: 
     labels: 
     name: redis 
    spec: 
     containers: 
     - name: redis 
     image: kubernetes/redis:v1 
     ports: 
     - containerPort: 6379 
     resources: 
      limits: 
      cpu: "0.1" 
     volumeMounts: 
     - mountPath: /redis-master-data 
      name: data 
     volumes: 
     - name: data 
      emptyDir: {} 

risposta

10

direttive Selettore nelle distribuzioni require di utilizzare un sub-campo di una matchLabels o matchExpressions, quindi nel mio caso ho bisogno di fare uso di matchLabels:

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: redis 
spec: 
    replicas: 3 
    selector: 
    matchLabels: 
     name: redis 
    template: 
    metadata: 
     labels: 
     name: redis 
    spec: 
     containers: 
     - name: redis 
     image: kubernetes/redis:v1 
     ports: 
     - containerPort: 6379 
     resources: 
      limits: 
      cpu: "0.1" 
     volumeMounts: 
     - mountPath: /redis-master-data 
      name: data 
     volumes: 
     - name: data 
      emptyDir: {} 
11

La selector campo di unL'oggettoè di tipo v1beta1.LabelSelector anziché una semplice mappa. Quindi, è possibile aggiungere l'etichetta sotto la matchLabels campo della selector:

Redis-con-matchLabels.yaml

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: redis 
spec: 
    replicas: 3 
    selector: 
    matchLabels: 
     name: redis 
    template: 
    metadata: 
     labels: 
     name: redis 
    spec: 
     containers: 
     - name: redis 
     image: kubernetes/redis:v1 
     ports: 
     - containerPort: 6379 
     resources: 
      limits: 
      cpu: "0.1" 
     volumeMounts: 
     - mountPath: /redis-master-data 
      name: data 
     volumes: 
     - name: data 
      emptyDir: {} 

o lasciare il LabelSelector fuori dal DeploymentSpec, nel qual caso lo farà abbinare le etichette dalla PodSpec:

Redis-podSpec-labels.yaml

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: redis 
    template: 
    metadata: 
     labels: 
     name: redis 
    spec: 
     containers: 
     - name: redis 
     image: kubernetes/redis:v1 
     ports: 
     - containerPort: 6379 
     resources: 
      limits: 
      cpu: "0.1" 
     volumeMounts: 
     - mountPath: /redis-master-data 
      name: data 
     volumes: 
     - name: data 
      emptyDir: {} 

Vedere lo Selector section dei documenti di distribuzione.

+0

Potresti per favore approfondire lo scopo di '.spec.selector'? Sono un po 'confuso dalla documentazione, specialmente dal paragrafo "Se specificato,' .spec.selector' deve corrispondere a '.spec.template.metadata.labels' [...]. Se' .spec.selector' non è specificato , '.spec.selector.matchLabels' sarà impostato di default a' .spec.template.metadata.labels' ". Qual è lo scopo di avere '.spec.selector' se deve corrispondere a' .spec.selector.matchLabels', ma è anche predefinito se lasciato non specificato? –

+0

Intendevo dire ".spec.template.metadata.labels" invece di ".spec.selector.matchLabels" nella mia ultima frase, mi dispiace. –

Problemi correlati